From 6a617ae849cecf187176889f77eab2b0e2387e29 Mon Sep 17 00:00:00 2001 From: IzumiSy Date: Fri, 21 Aug 2026 16:21:09 +0900 Subject: [PATCH 1/5] refactor(components): standardize component family entrypoints --- .agents/references/component-design.md | 53 +++++++++++-------- .../references/composite-field-controls.md | 4 +- ...c__components__alert__alert.test.tsx.snap} | 0 ...te__autocomplete-standalone.test.tsx.snap} | 0 ..._autocomplete__autocomplete.test.tsx.snap} | 0 ..._components__avatar__avatar.test.tsx.snap} | 0 ..._components__button__button.test.tsx.snap} | 0 ...src__components__card__card.test.tsx.snap} | 0 ...ponents__checkbox__checkbox.test.tsx.snap} | 0 ...mbobox__combobox-standalone.test.tsx.snap} | 0 ...ponents__combobox__combobox.test.tsx.snap} | 0 ..._components__dialog__dialog.test.tsx.snap} | 0 ...c__components__field__field.test.tsx.snap} | 0 ...ponents__fieldset__fieldset.test.tsx.snap} | 0 ...src__components__form__form.test.tsx.snap} | 0 ...c__components__input__input.test.tsx.snap} | 0 ...src__components__menu__menu.test.tsx.snap} | 0 ...__select__select-standalone.test.tsx.snap} | 0 ..._components__select__select.test.tsx.snap} | 0 ...c__components__sheet__sheet.test.tsx.snap} | 0 ...c__components__table__table.test.tsx.snap} | 0 ...src__components__tabs__tabs.test.tsx.snap} | 0 ...omponents__tooltip__tooltip.test.tsx.snap} | 0 .../src/components/{ => alert}/alert.test.tsx | 0 .../core/src/components/{ => alert}/alert.tsx | 2 +- packages/core/src/components/alert/index.ts | 1 + .../{ => app-info}/app-info.test.tsx | 2 +- .../components/{ => app-info}/app-info.tsx | 2 +- .../core/src/components/app-info/index.ts | 1 + .../appearance-switcher.test.tsx | 2 +- .../appearance-switcher.tsx | 0 .../components/appearance-switcher/index.ts | 1 + .../components/{ => appshell}/appshell.tsx | 0 .../core/src/components/appshell/index.ts | 1 + .../async-error-state.tsx | 0 .../src/components/async-error-state/index.ts | 1 + .../autocomplete-standalone.test.tsx | 0 .../autocomplete-standalone.tsx | 6 +-- .../{ => autocomplete}/autocomplete.test.tsx | 0 .../{ => autocomplete}/autocomplete.tsx | 0 .../core/src/components/autocomplete/index.ts | 2 + .../components/{ => avatar}/avatar.test.tsx | 0 .../src/components/{ => avatar}/avatar.tsx | 0 packages/core/src/components/avatar/index.ts | 1 + .../{ => badge-list}/badge-list.test.tsx | 2 +- .../{ => badge-list}/badge-list.tsx | 4 +- .../core/src/components/badge-list/index.ts | 1 + .../core/src/components/{ => badge}/badge.tsx | 2 +- packages/core/src/components/badge/index.ts | 2 + .../{ => breadcrumb}/breadcrumb.tsx | 0 .../core/src/components/breadcrumb/index.ts | 1 + .../components/{ => button}/button.test.tsx | 0 .../src/components/{ => button}/button.tsx | 0 packages/core/src/components/button/index.ts | 1 + .../src/components/{ => card}/card.test.tsx | 0 .../core/src/components/{ => card}/card.tsx | 0 packages/core/src/components/card/index.ts | 1 + .../{ => checkbox}/checkbox.test.tsx | 2 +- .../components/{ => checkbox}/checkbox.tsx | 0 .../core/src/components/checkbox/index.ts | 1 + .../combobox-standalone.test.tsx | 0 .../{ => combobox}/combobox-standalone.tsx | 6 +-- .../{ => combobox}/combobox.test.tsx | 0 .../components/{ => combobox}/combobox.tsx | 0 .../core/src/components/combobox/index.ts | 2 + .../command-palette-hook.test.tsx | 0 .../command-palette.test.tsx | 2 +- .../{ => command-palette}/command-palette.tsx | 2 +- .../src/components/command-palette/index.ts | 1 + .../src/components/{ => content}/content.tsx | 4 +- packages/core/src/components/content/index.ts | 1 + .../components/csv-importer/CsvImporter.tsx | 2 +- .../src/components/data-table/pagination.tsx | 2 +- .../src/components/data-table/toolbar.tsx | 2 +- .../default-error-boundary.tsx | 2 +- .../default-error-boundary/index.ts | 1 + .../components/{ => dialog}/dialog.test.tsx | 0 .../src/components/{ => dialog}/dialog.tsx | 0 packages/core/src/components/dialog/index.ts | 1 + .../document-head.test.tsx | 0 .../{ => document-head}/document-head.tsx | 0 .../src/components/document-head/index.ts | 1 + .../{ => dropdown-items}/dropdown-items.ts | 0 .../src/components/dropdown-items/index.ts | 1 + .../dynamic-breadcrumb.tsx | 0 .../components/dynamic-breadcrumb/index.ts | 1 + .../src/components/{ => field}/field.test.tsx | 0 .../core/src/components/{ => field}/field.tsx | 0 packages/core/src/components/field/index.ts | 1 + .../{ => fieldset}/fieldset.test.tsx | 0 .../components/{ => fieldset}/fieldset.tsx | 0 .../core/src/components/fieldset/index.ts | 1 + .../src/components/{ => form}/form.test.tsx | 2 +- .../core/src/components/{ => form}/form.tsx | 0 packages/core/src/components/form/index.ts | 1 + packages/core/src/components/input/index.ts | 1 + .../src/components/{ => input}/input.test.tsx | 0 .../core/src/components/{ => input}/input.tsx | 0 packages/core/src/components/layout/index.ts | 1 + packages/core/src/components/menu/index.ts | 1 + .../src/components/{ => menu}/menu.test.tsx | 0 .../core/src/components/{ => menu}/menu.tsx | 0 packages/core/src/components/select/index.ts | 2 + .../{ => select}/select-standalone.test.tsx | 0 .../{ => select}/select-standalone.tsx | 6 +-- .../components/{ => select}/select.test.tsx | 0 .../src/components/{ => select}/select.tsx | 0 .../core/src/components/separator/index.ts | 1 + .../{ => separator}/separator.test.tsx | 0 .../components/{ => separator}/separator.tsx | 0 packages/core/src/components/sheet/index.ts | 1 + .../src/components/{ => sheet}/sheet.test.tsx | 0 .../core/src/components/{ => sheet}/sheet.tsx | 0 .../src/components/sidebar/default-header.tsx | 2 +- .../sidebar/default-sidebar.test.tsx | 2 +- .../components/sidebar/default-sidebar.tsx | 2 +- .../{sidebar.tsx => sidebar/primitives.tsx} | 0 .../src/components/sidebar/sidebar-group.tsx | 2 +- .../src/components/sidebar/sidebar-item.tsx | 2 +- .../src/components/sidebar/sidebar-layout.tsx | 2 +- .../components/sidebar/sidebar-separator.tsx | 2 +- .../src/components/sidebar/sidebar.test.tsx | 2 +- packages/core/src/components/sonner/index.ts | 1 + .../src/components/{ => sonner}/sonner.tsx | 0 packages/core/src/components/table/index.ts | 1 + .../src/components/{ => table}/table.test.tsx | 0 .../core/src/components/{ => table}/table.tsx | 0 packages/core/src/components/tabs/index.ts | 1 + .../src/components/{ => tabs}/tabs.test.tsx | 0 .../core/src/components/{ => tabs}/tabs.tsx | 0 .../core/src/components/timeline/index.ts | 1 + .../{ => timeline}/timeline.test.tsx | 0 .../components/{ => timeline}/timeline.tsx | 0 packages/core/src/components/tooltip/index.ts | 1 + .../components/{ => tooltip}/tooltip.test.tsx | 0 .../src/components/{ => tooltip}/tooltip.tsx | 0 .../core/src/components/with-guard/index.ts | 1 + .../{ => with-guard}/with-guard.test.tsx | 0 .../{ => with-guard}/with-guard.tsx | 0 .../scroll-container-context.test.tsx | 2 +- packages/core/src/index.ts | 12 ++--- packages/vite-plugin/README.md | 2 +- 142 files changed, 117 insertions(+), 66 deletions(-) rename packages/core/__snapshots__/{src__components__alert.test.tsx.snap => src__components__alert__alert.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__autocomplete-standalone.test.tsx.snap => src__components__autocomplete__autocomplete-standalone.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__autocomplete.test.tsx.snap => src__components__autocomplete__autocomplete.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__avatar.test.tsx.snap => src__components__avatar__avatar.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__button.test.tsx.snap => src__components__button__button.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__card.test.tsx.snap => src__components__card__card.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__checkbox.test.tsx.snap => src__components__checkbox__checkbox.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__combobox-standalone.test.tsx.snap => src__components__combobox__combobox-standalone.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__combobox.test.tsx.snap => src__components__combobox__combobox.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__dialog.test.tsx.snap => src__components__dialog__dialog.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__field.test.tsx.snap => src__components__field__field.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__fieldset.test.tsx.snap => src__components__fieldset__fieldset.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__form.test.tsx.snap => src__components__form__form.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__input.test.tsx.snap => src__components__input__input.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__menu.test.tsx.snap => src__components__menu__menu.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__select-standalone.test.tsx.snap => src__components__select__select-standalone.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__select.test.tsx.snap => src__components__select__select.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__sheet.test.tsx.snap => src__components__sheet__sheet.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__table.test.tsx.snap => src__components__table__table.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__tabs.test.tsx.snap => src__components__tabs__tabs.test.tsx.snap} (100%) rename packages/core/__snapshots__/{src__components__tooltip.test.tsx.snap => src__components__tooltip__tooltip.test.tsx.snap} (100%) rename packages/core/src/components/{ => alert}/alert.test.tsx (100%) rename packages/core/src/components/{ => alert}/alert.tsx (99%) create mode 100644 packages/core/src/components/alert/index.ts rename packages/core/src/components/{ => app-info}/app-info.test.tsx (98%) rename packages/core/src/components/{ => app-info}/app-info.tsx (98%) create mode 100644 packages/core/src/components/app-info/index.ts rename packages/core/src/components/{ => appearance-switcher}/appearance-switcher.test.tsx (98%) rename packages/core/src/components/{ => appearance-switcher}/appearance-switcher.tsx (100%) create mode 100644 packages/core/src/components/appearance-switcher/index.ts rename packages/core/src/components/{ => appshell}/appshell.tsx (100%) create mode 100644 packages/core/src/components/appshell/index.ts rename packages/core/src/components/{ => async-error-state}/async-error-state.tsx (100%) create mode 100644 packages/core/src/components/async-error-state/index.ts rename packages/core/src/components/{ => autocomplete}/autocomplete-standalone.test.tsx (100%) rename packages/core/src/components/{ => autocomplete}/autocomplete-standalone.tsx (97%) rename packages/core/src/components/{ => autocomplete}/autocomplete.test.tsx (100%) rename packages/core/src/components/{ => autocomplete}/autocomplete.tsx (100%) create mode 100644 packages/core/src/components/autocomplete/index.ts rename packages/core/src/components/{ => avatar}/avatar.test.tsx (100%) rename packages/core/src/components/{ => avatar}/avatar.tsx (100%) create mode 100644 packages/core/src/components/avatar/index.ts rename packages/core/src/components/{ => badge-list}/badge-list.test.tsx (98%) rename packages/core/src/components/{ => badge-list}/badge-list.tsx (98%) create mode 100644 packages/core/src/components/badge-list/index.ts rename packages/core/src/components/{ => badge}/badge.tsx (98%) create mode 100644 packages/core/src/components/badge/index.ts rename packages/core/src/components/{ => breadcrumb}/breadcrumb.tsx (100%) create mode 100644 packages/core/src/components/breadcrumb/index.ts rename packages/core/src/components/{ => button}/button.test.tsx (100%) rename packages/core/src/components/{ => button}/button.tsx (100%) create mode 100644 packages/core/src/components/button/index.ts rename packages/core/src/components/{ => card}/card.test.tsx (100%) rename packages/core/src/components/{ => card}/card.tsx (100%) create mode 100644 packages/core/src/components/card/index.ts rename packages/core/src/components/{ => checkbox}/checkbox.test.tsx (99%) rename packages/core/src/components/{ => checkbox}/checkbox.tsx (100%) create mode 100644 packages/core/src/components/checkbox/index.ts rename packages/core/src/components/{ => combobox}/combobox-standalone.test.tsx (100%) rename packages/core/src/components/{ => combobox}/combobox-standalone.tsx (98%) rename packages/core/src/components/{ => combobox}/combobox.test.tsx (100%) rename packages/core/src/components/{ => combobox}/combobox.tsx (100%) create mode 100644 packages/core/src/components/combobox/index.ts rename packages/core/src/components/{ => command-palette}/command-palette-hook.test.tsx (100%) rename packages/core/src/components/{ => command-palette}/command-palette.test.tsx (99%) rename packages/core/src/components/{ => command-palette}/command-palette.tsx (99%) create mode 100644 packages/core/src/components/command-palette/index.ts rename packages/core/src/components/{ => content}/content.tsx (96%) create mode 100644 packages/core/src/components/content/index.ts rename packages/core/src/components/{ => default-error-boundary}/default-error-boundary.tsx (98%) create mode 100644 packages/core/src/components/default-error-boundary/index.ts rename packages/core/src/components/{ => dialog}/dialog.test.tsx (100%) rename packages/core/src/components/{ => dialog}/dialog.tsx (100%) create mode 100644 packages/core/src/components/dialog/index.ts rename packages/core/src/components/{ => document-head}/document-head.test.tsx (100%) rename packages/core/src/components/{ => document-head}/document-head.tsx (100%) create mode 100644 packages/core/src/components/document-head/index.ts rename packages/core/src/components/{ => dropdown-items}/dropdown-items.ts (100%) create mode 100644 packages/core/src/components/dropdown-items/index.ts rename packages/core/src/components/{ => dynamic-breadcrumb}/dynamic-breadcrumb.tsx (100%) create mode 100644 packages/core/src/components/dynamic-breadcrumb/index.ts rename packages/core/src/components/{ => field}/field.test.tsx (100%) rename packages/core/src/components/{ => field}/field.tsx (100%) create mode 100644 packages/core/src/components/field/index.ts rename packages/core/src/components/{ => fieldset}/fieldset.test.tsx (100%) rename packages/core/src/components/{ => fieldset}/fieldset.tsx (100%) create mode 100644 packages/core/src/components/fieldset/index.ts rename packages/core/src/components/{ => form}/form.test.tsx (99%) rename packages/core/src/components/{ => form}/form.tsx (100%) create mode 100644 packages/core/src/components/form/index.ts create mode 100644 packages/core/src/components/input/index.ts rename packages/core/src/components/{ => input}/input.test.tsx (100%) rename packages/core/src/components/{ => input}/input.tsx (100%) create mode 100644 packages/core/src/components/layout/index.ts create mode 100644 packages/core/src/components/menu/index.ts rename packages/core/src/components/{ => menu}/menu.test.tsx (100%) rename packages/core/src/components/{ => menu}/menu.tsx (100%) create mode 100644 packages/core/src/components/select/index.ts rename packages/core/src/components/{ => select}/select-standalone.test.tsx (100%) rename packages/core/src/components/{ => select}/select-standalone.tsx (98%) rename packages/core/src/components/{ => select}/select.test.tsx (100%) rename packages/core/src/components/{ => select}/select.tsx (100%) create mode 100644 packages/core/src/components/separator/index.ts rename packages/core/src/components/{ => separator}/separator.test.tsx (100%) rename packages/core/src/components/{ => separator}/separator.tsx (100%) create mode 100644 packages/core/src/components/sheet/index.ts rename packages/core/src/components/{ => sheet}/sheet.test.tsx (100%) rename packages/core/src/components/{ => sheet}/sheet.tsx (100%) rename packages/core/src/components/{sidebar.tsx => sidebar/primitives.tsx} (100%) create mode 100644 packages/core/src/components/sonner/index.ts rename packages/core/src/components/{ => sonner}/sonner.tsx (100%) create mode 100644 packages/core/src/components/table/index.ts rename packages/core/src/components/{ => table}/table.test.tsx (100%) rename packages/core/src/components/{ => table}/table.tsx (100%) create mode 100644 packages/core/src/components/tabs/index.ts rename packages/core/src/components/{ => tabs}/tabs.test.tsx (100%) rename packages/core/src/components/{ => tabs}/tabs.tsx (100%) create mode 100644 packages/core/src/components/timeline/index.ts rename packages/core/src/components/{ => timeline}/timeline.test.tsx (100%) rename packages/core/src/components/{ => timeline}/timeline.tsx (100%) create mode 100644 packages/core/src/components/tooltip/index.ts rename packages/core/src/components/{ => tooltip}/tooltip.test.tsx (100%) rename packages/core/src/components/{ => tooltip}/tooltip.tsx (100%) create mode 100644 packages/core/src/components/with-guard/index.ts rename packages/core/src/components/{ => with-guard}/with-guard.test.tsx (100%) rename packages/core/src/components/{ => with-guard}/with-guard.tsx (100%) diff --git a/.agents/references/component-design.md b/.agents/references/component-design.md index 15c7904f..a39b03a3 100644 --- a/.agents/references/component-design.md +++ b/.agents/references/component-design.md @@ -62,9 +62,39 @@ Review whether the chosen pattern matches the actual component shape. Be skeptical when a heavier pattern adds public surface without reducing real complexity. -### Pattern A — Simple single-file component +### Standard filesystem shape -Use when the component is mostly a styled element with variants and a small prop surface. +Every component or helper family under `components/` gets its own directory. +Implementation size does **not** decide whether something is a file or a directory. +The stable entrypoint is always `components//index.ts`. + +```text +components/ + component-name/ + index.ts + component-name.tsx +``` + +If the implementation grows, add files in the same directory instead of changing +its outer shape. + +```text +components/ + component-name/ + index.ts + component-name.tsx + types.ts + use-component-name.ts + component-name.test.tsx +``` + +```tsx +// index.ts +export * from "./component-name"; +// export { default } from "./component-name"; // only when a default export exists +``` + +A small component can still be a single implementation file internally: ```tsx import * as React from "react"; @@ -142,25 +172,6 @@ const ComponentName = { export { ComponentName }; ``` -### Pattern C — Directory component - -Use when the implementation needs multiple internal files, but the public API should still stay small. - -```text -components/ - component-name/ - ComponentName.tsx - types.ts - index.ts -``` - -```tsx -// index.ts -export { ComponentName, default } from "./ComponentName"; -export type { ComponentNameProps } from "./types"; -// DO NOT export internal types, type guards, or enums -``` - ### Pattern D — Standalone + `Parts` Use when there is a dominant pre-assembled use case, but advanced consumers still need composition escape hatches. diff --git a/.agents/references/composite-field-controls.md b/.agents/references/composite-field-controls.md index f493e16c..e39f230d 100644 --- a/.agents/references/composite-field-controls.md +++ b/.agents/references/composite-field-controls.md @@ -80,8 +80,8 @@ For controls with richer selection behavior, also review: ## Current AppShell examples -- `packages/core/src/components/field.tsx` defines the baseline `Field.Root` contract that all field-like controls should fit into. -- `packages/core/src/components/select.tsx`, `packages/core/src/components/combobox.tsx`, and `packages/core/src/components/autocomplete.tsx` show the simpler control-family contract that composite controls should still resemble from the outside. +- `packages/core/src/components/field/field.tsx` defines the baseline `Field.Root` contract that all field-like controls should fit into. +- `packages/core/src/components/select/select.tsx`, `packages/core/src/components/combobox/combobox.tsx`, and `packages/core/src/components/autocomplete/autocomplete.tsx` show the simpler control-family contract that composite controls should still resemble from the outside. - `packages/core/src/components/date-field/date-field.tsx` splits the problem into a11y labeling, proxy-input ownership, and `Field` / `Form` bridging. - `packages/core/src/components/date-field/use-date-field-state.ts` owns the segmented editing state machine, shortcut handling, controlled/uncontrolled behavior, and invalid-reason semantics. - `packages/core/src/components/date-field/date-input-group.tsx` renders the visible segmented `role="group"` UI and wires keyboard shortcuts plus popover opening. diff --git a/packages/core/__snapshots__/src__components__alert.test.tsx.snap b/packages/core/__snapshots__/src__components__alert__alert.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__alert.test.tsx.snap rename to packages/core/__snapshots__/src__components__alert__alert.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__autocomplete-standalone.test.tsx.snap b/packages/core/__snapshots__/src__components__autocomplete__autocomplete-standalone.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__autocomplete-standalone.test.tsx.snap rename to packages/core/__snapshots__/src__components__autocomplete__autocomplete-standalone.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__autocomplete.test.tsx.snap b/packages/core/__snapshots__/src__components__autocomplete__autocomplete.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__autocomplete.test.tsx.snap rename to packages/core/__snapshots__/src__components__autocomplete__autocomplete.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__avatar.test.tsx.snap b/packages/core/__snapshots__/src__components__avatar__avatar.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__avatar.test.tsx.snap rename to packages/core/__snapshots__/src__components__avatar__avatar.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__button.test.tsx.snap b/packages/core/__snapshots__/src__components__button__button.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__button.test.tsx.snap rename to packages/core/__snapshots__/src__components__button__button.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__card.test.tsx.snap b/packages/core/__snapshots__/src__components__card__card.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__card.test.tsx.snap rename to packages/core/__snapshots__/src__components__card__card.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__checkbox.test.tsx.snap b/packages/core/__snapshots__/src__components__checkbox__checkbox.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__checkbox.test.tsx.snap rename to packages/core/__snapshots__/src__components__checkbox__checkbox.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__combobox-standalone.test.tsx.snap b/packages/core/__snapshots__/src__components__combobox__combobox-standalone.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__combobox-standalone.test.tsx.snap rename to packages/core/__snapshots__/src__components__combobox__combobox-standalone.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__combobox.test.tsx.snap b/packages/core/__snapshots__/src__components__combobox__combobox.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__combobox.test.tsx.snap rename to packages/core/__snapshots__/src__components__combobox__combobox.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__dialog.test.tsx.snap b/packages/core/__snapshots__/src__components__dialog__dialog.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__dialog.test.tsx.snap rename to packages/core/__snapshots__/src__components__dialog__dialog.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__field.test.tsx.snap b/packages/core/__snapshots__/src__components__field__field.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__field.test.tsx.snap rename to packages/core/__snapshots__/src__components__field__field.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__fieldset.test.tsx.snap b/packages/core/__snapshots__/src__components__fieldset__fieldset.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__fieldset.test.tsx.snap rename to packages/core/__snapshots__/src__components__fieldset__fieldset.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__form.test.tsx.snap b/packages/core/__snapshots__/src__components__form__form.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__form.test.tsx.snap rename to packages/core/__snapshots__/src__components__form__form.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__input.test.tsx.snap b/packages/core/__snapshots__/src__components__input__input.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__input.test.tsx.snap rename to packages/core/__snapshots__/src__components__input__input.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__menu.test.tsx.snap b/packages/core/__snapshots__/src__components__menu__menu.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__menu.test.tsx.snap rename to packages/core/__snapshots__/src__components__menu__menu.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__select-standalone.test.tsx.snap b/packages/core/__snapshots__/src__components__select__select-standalone.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__select-standalone.test.tsx.snap rename to packages/core/__snapshots__/src__components__select__select-standalone.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__select.test.tsx.snap b/packages/core/__snapshots__/src__components__select__select.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__select.test.tsx.snap rename to packages/core/__snapshots__/src__components__select__select.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__sheet.test.tsx.snap b/packages/core/__snapshots__/src__components__sheet__sheet.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__sheet.test.tsx.snap rename to packages/core/__snapshots__/src__components__sheet__sheet.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__table.test.tsx.snap b/packages/core/__snapshots__/src__components__table__table.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__table.test.tsx.snap rename to packages/core/__snapshots__/src__components__table__table.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__tabs.test.tsx.snap b/packages/core/__snapshots__/src__components__tabs__tabs.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__tabs.test.tsx.snap rename to packages/core/__snapshots__/src__components__tabs__tabs.test.tsx.snap diff --git a/packages/core/__snapshots__/src__components__tooltip.test.tsx.snap b/packages/core/__snapshots__/src__components__tooltip__tooltip.test.tsx.snap similarity index 100% rename from packages/core/__snapshots__/src__components__tooltip.test.tsx.snap rename to packages/core/__snapshots__/src__components__tooltip__tooltip.test.tsx.snap diff --git a/packages/core/src/components/alert.test.tsx b/packages/core/src/components/alert/alert.test.tsx similarity index 100% rename from packages/core/src/components/alert.test.tsx rename to packages/core/src/components/alert/alert.test.tsx diff --git a/packages/core/src/components/alert.tsx b/packages/core/src/components/alert/alert.tsx similarity index 99% rename from packages/core/src/components/alert.tsx rename to packages/core/src/components/alert/alert.tsx index b52af212..a63c09e3 100644 --- a/packages/core/src/components/alert.tsx +++ b/packages/core/src/components/alert/alert.tsx @@ -8,7 +8,7 @@ import { XCircleIcon, XIcon, } from "lucide-react"; -import { cn } from "../lib/utils"; +import { cn } from "../../lib/utils"; const alertVariants = cva( "astw:relative astw:w-full astw:rounded-lg astw:border astw:px-4 astw:py-3 astw:text-sm astw:grid astw:grid-cols-[calc(var(--spacing)*4.5)_1fr_auto] astw:gap-x-3 astw:gap-y-0.5 astw:items-start astw:[&>svg]:size-[17.5px] astw:[&>svg]:self-center astw:[&>svg]:shrink-0 astw:[&>svg]:text-current", diff --git a/packages/core/src/components/alert/index.ts b/packages/core/src/components/alert/index.ts new file mode 100644 index 00000000..6e578472 --- /dev/null +++ b/packages/core/src/components/alert/index.ts @@ -0,0 +1 @@ +export * from "./alert"; diff --git a/packages/core/src/components/app-info.test.tsx b/packages/core/src/components/app-info/app-info.test.tsx similarity index 98% rename from packages/core/src/components/app-info.test.tsx rename to packages/core/src/components/app-info/app-info.test.tsx index 67fcb053..62250e43 100644 --- a/packages/core/src/components/app-info.test.tsx +++ b/packages/core/src/components/app-info/app-info.test.tsx @@ -1,6 +1,6 @@ import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; -import packageJson from "../../package.json"; +import packageJson from "../../../package.json"; import { BuiltInCommandPalette } from "@/components/command-palette"; import { AppShellConfigContext, diff --git a/packages/core/src/components/app-info.tsx b/packages/core/src/components/app-info/app-info.tsx similarity index 98% rename from packages/core/src/components/app-info.tsx rename to packages/core/src/components/app-info/app-info.tsx index 560ba38e..725d7c9e 100644 --- a/packages/core/src/components/app-info.tsx +++ b/packages/core/src/components/app-info/app-info.tsx @@ -1,4 +1,4 @@ -import packageJson from "../../package.json"; +import packageJson from "../../../package.json"; import { Button } from "@/components/button"; import { Card } from "@/components/card"; import { useAppShellConfig, type AppInfoEntry } from "@/contexts/appshell-context"; diff --git a/packages/core/src/components/app-info/index.ts b/packages/core/src/components/app-info/index.ts new file mode 100644 index 00000000..6c4b18c4 --- /dev/null +++ b/packages/core/src/components/app-info/index.ts @@ -0,0 +1 @@ +export * from "./app-info"; diff --git a/packages/core/src/components/appearance-switcher.test.tsx b/packages/core/src/components/appearance-switcher/appearance-switcher.test.tsx similarity index 98% rename from packages/core/src/components/appearance-switcher.test.tsx rename to packages/core/src/components/appearance-switcher/appearance-switcher.test.tsx index 477a5202..ddbe16af 100644 --- a/packages/core/src/components/appearance-switcher.test.tsx +++ b/packages/core/src/components/appearance-switcher/appearance-switcher.test.tsx @@ -3,7 +3,7 @@ import userEvent from "@testing-library/user-event"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { COLOR_THEME_OPTIONS, ThemeProvider } from "@/contexts/theme-context"; -import { createAppShellWrapper } from "../../tests/test-utils"; +import { createAppShellWrapper } from "../../../tests/test-utils"; import { AppearanceSwitcher } from "./appearance-switcher"; /** happy-dom / Node can omit a full `localStorage`; ThemeProvider persists via it. */ diff --git a/packages/core/src/components/appearance-switcher.tsx b/packages/core/src/components/appearance-switcher/appearance-switcher.tsx similarity index 100% rename from packages/core/src/components/appearance-switcher.tsx rename to packages/core/src/components/appearance-switcher/appearance-switcher.tsx diff --git a/packages/core/src/components/appearance-switcher/index.ts b/packages/core/src/components/appearance-switcher/index.ts new file mode 100644 index 00000000..615ed974 --- /dev/null +++ b/packages/core/src/components/appearance-switcher/index.ts @@ -0,0 +1 @@ +export * from "./appearance-switcher"; diff --git a/packages/core/src/components/appshell.tsx b/packages/core/src/components/appshell/appshell.tsx similarity index 100% rename from packages/core/src/components/appshell.tsx rename to packages/core/src/components/appshell/appshell.tsx diff --git a/packages/core/src/components/appshell/index.ts b/packages/core/src/components/appshell/index.ts new file mode 100644 index 00000000..6fd429ad --- /dev/null +++ b/packages/core/src/components/appshell/index.ts @@ -0,0 +1 @@ +export * from "./appshell"; diff --git a/packages/core/src/components/async-error-state.tsx b/packages/core/src/components/async-error-state/async-error-state.tsx similarity index 100% rename from packages/core/src/components/async-error-state.tsx rename to packages/core/src/components/async-error-state/async-error-state.tsx diff --git a/packages/core/src/components/async-error-state/index.ts b/packages/core/src/components/async-error-state/index.ts new file mode 100644 index 00000000..09c1c519 --- /dev/null +++ b/packages/core/src/components/async-error-state/index.ts @@ -0,0 +1 @@ +export * from "./async-error-state"; diff --git a/packages/core/src/components/autocomplete-standalone.test.tsx b/packages/core/src/components/autocomplete/autocomplete-standalone.test.tsx similarity index 100% rename from packages/core/src/components/autocomplete-standalone.test.tsx rename to packages/core/src/components/autocomplete/autocomplete-standalone.test.tsx diff --git a/packages/core/src/components/autocomplete-standalone.tsx b/packages/core/src/components/autocomplete/autocomplete-standalone.tsx similarity index 97% rename from packages/core/src/components/autocomplete-standalone.tsx rename to packages/core/src/components/autocomplete/autocomplete-standalone.tsx index 4b203397..d0a375a7 100644 --- a/packages/core/src/components/autocomplete-standalone.tsx +++ b/packages/core/src/components/autocomplete/autocomplete-standalone.tsx @@ -16,9 +16,9 @@ import { useAsync, useFilter, } from "./autocomplete"; -import { defaultMapItem, isGroupedItems } from "./dropdown-items"; -import type { MappedItem, ItemGroup, ExtractItem } from "./dropdown-items"; -import { AsyncErrorState, resolveAsyncContent } from "./async-error-state"; +import { defaultMapItem, isGroupedItems } from "../dropdown-items"; +import type { MappedItem, ItemGroup, ExtractItem } from "../dropdown-items"; +import { AsyncErrorState, resolveAsyncContent } from "../async-error-state"; import type { AsyncFetcher } from "@/hooks/use-async-items"; /** Fetcher type for `Autocomplete.Async`. */ diff --git a/packages/core/src/components/autocomplete.test.tsx b/packages/core/src/components/autocomplete/autocomplete.test.tsx similarity index 100% rename from packages/core/src/components/autocomplete.test.tsx rename to packages/core/src/components/autocomplete/autocomplete.test.tsx diff --git a/packages/core/src/components/autocomplete.tsx b/packages/core/src/components/autocomplete/autocomplete.tsx similarity index 100% rename from packages/core/src/components/autocomplete.tsx rename to packages/core/src/components/autocomplete/autocomplete.tsx diff --git a/packages/core/src/components/autocomplete/index.ts b/packages/core/src/components/autocomplete/index.ts new file mode 100644 index 00000000..a2e741d5 --- /dev/null +++ b/packages/core/src/components/autocomplete/index.ts @@ -0,0 +1,2 @@ +export * from "./autocomplete"; +export * from "./autocomplete-standalone"; diff --git a/packages/core/src/components/avatar.test.tsx b/packages/core/src/components/avatar/avatar.test.tsx similarity index 100% rename from packages/core/src/components/avatar.test.tsx rename to packages/core/src/components/avatar/avatar.test.tsx diff --git a/packages/core/src/components/avatar.tsx b/packages/core/src/components/avatar/avatar.tsx similarity index 100% rename from packages/core/src/components/avatar.tsx rename to packages/core/src/components/avatar/avatar.tsx diff --git a/packages/core/src/components/avatar/index.ts b/packages/core/src/components/avatar/index.ts new file mode 100644 index 00000000..90fdb226 --- /dev/null +++ b/packages/core/src/components/avatar/index.ts @@ -0,0 +1 @@ +export * from "./avatar"; diff --git a/packages/core/src/components/badge-list.test.tsx b/packages/core/src/components/badge-list/badge-list.test.tsx similarity index 98% rename from packages/core/src/components/badge-list.test.tsx rename to packages/core/src/components/badge-list/badge-list.test.tsx index 2d1e7b97..f74f4142 100644 --- a/packages/core/src/components/badge-list.test.tsx +++ b/packages/core/src/components/badge-list/badge-list.test.tsx @@ -1,7 +1,7 @@ import { afterEach, describe, expect, it } from "vitest"; import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { createAppShellWrapper } from "../../tests/test-utils"; +import { createAppShellWrapper } from "../../../tests/test-utils"; import { BadgeList, resolveBadgeVariant, resolveBadgeLabel } from "./badge-list"; afterEach(() => { diff --git a/packages/core/src/components/badge-list.tsx b/packages/core/src/components/badge-list/badge-list.tsx similarity index 98% rename from packages/core/src/components/badge-list.tsx rename to packages/core/src/components/badge-list/badge-list.tsx index cec1b298..a62ee125 100644 --- a/packages/core/src/components/badge-list.tsx +++ b/packages/core/src/components/badge-list/badge-list.tsx @@ -2,8 +2,8 @@ import * as React from "react"; import { Popover } from "@base-ui/react/popover"; -import { Badge } from "./badge"; -import type { BadgeProps } from "./badge"; +import { Badge } from "../badge"; +import type { BadgeProps } from "../badge"; // ============================================================================ // BADGE UTILITIES (types & helpers) diff --git a/packages/core/src/components/badge-list/index.ts b/packages/core/src/components/badge-list/index.ts new file mode 100644 index 00000000..0ff976f1 --- /dev/null +++ b/packages/core/src/components/badge-list/index.ts @@ -0,0 +1 @@ +export * from "./badge-list"; diff --git a/packages/core/src/components/badge.tsx b/packages/core/src/components/badge/badge.tsx similarity index 98% rename from packages/core/src/components/badge.tsx rename to packages/core/src/components/badge/badge.tsx index 0e9d1e44..602eb73e 100644 --- a/packages/core/src/components/badge.tsx +++ b/packages/core/src/components/badge/badge.tsx @@ -1,6 +1,6 @@ import * as React from "react"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "../lib/utils"; +import { cn } from "../../lib/utils"; const badgeVariants = cva( "astw:inline-flex astw:cursor-default astw:items-center astw:rounded-md astw:border astw:px-2 astw:py-0.5 astw:text-xs astw:font-medium astw:transition-colors astw:focus:outline-none astw:focus:ring-2 astw:focus:ring-ring astw:focus:ring-offset-2", diff --git a/packages/core/src/components/badge/index.ts b/packages/core/src/components/badge/index.ts new file mode 100644 index 00000000..92116d9f --- /dev/null +++ b/packages/core/src/components/badge/index.ts @@ -0,0 +1,2 @@ +export * from "./badge"; +export { default } from "./badge"; diff --git a/packages/core/src/components/breadcrumb.tsx b/packages/core/src/components/breadcrumb/breadcrumb.tsx similarity index 100% rename from packages/core/src/components/breadcrumb.tsx rename to packages/core/src/components/breadcrumb/breadcrumb.tsx diff --git a/packages/core/src/components/breadcrumb/index.ts b/packages/core/src/components/breadcrumb/index.ts new file mode 100644 index 00000000..96d5a266 --- /dev/null +++ b/packages/core/src/components/breadcrumb/index.ts @@ -0,0 +1 @@ +export * from "./breadcrumb"; diff --git a/packages/core/src/components/button.test.tsx b/packages/core/src/components/button/button.test.tsx similarity index 100% rename from packages/core/src/components/button.test.tsx rename to packages/core/src/components/button/button.test.tsx diff --git a/packages/core/src/components/button.tsx b/packages/core/src/components/button/button.tsx similarity index 100% rename from packages/core/src/components/button.tsx rename to packages/core/src/components/button/button.tsx diff --git a/packages/core/src/components/button/index.ts b/packages/core/src/components/button/index.ts new file mode 100644 index 00000000..98d55acd --- /dev/null +++ b/packages/core/src/components/button/index.ts @@ -0,0 +1 @@ +export * from "./button"; diff --git a/packages/core/src/components/card.test.tsx b/packages/core/src/components/card/card.test.tsx similarity index 100% rename from packages/core/src/components/card.test.tsx rename to packages/core/src/components/card/card.test.tsx diff --git a/packages/core/src/components/card.tsx b/packages/core/src/components/card/card.tsx similarity index 100% rename from packages/core/src/components/card.tsx rename to packages/core/src/components/card/card.tsx diff --git a/packages/core/src/components/card/index.ts b/packages/core/src/components/card/index.ts new file mode 100644 index 00000000..1d243e76 --- /dev/null +++ b/packages/core/src/components/card/index.ts @@ -0,0 +1 @@ +export * from "./card"; diff --git a/packages/core/src/components/checkbox.test.tsx b/packages/core/src/components/checkbox/checkbox.test.tsx similarity index 99% rename from packages/core/src/components/checkbox.test.tsx rename to packages/core/src/components/checkbox/checkbox.test.tsx index a0de8fec..b256a93b 100644 --- a/packages/core/src/components/checkbox.test.tsx +++ b/packages/core/src/components/checkbox/checkbox.test.tsx @@ -4,7 +4,7 @@ import userEvent from "@testing-library/user-event"; import { renderRHFForm } from "../../tests/rhf-test-utils"; import { Checkbox } from "./checkbox"; -import { Field } from "./field"; +import { Field } from "../field"; afterEach(() => { cleanup(); diff --git a/packages/core/src/components/checkbox.tsx b/packages/core/src/components/checkbox/checkbox.tsx similarity index 100% rename from packages/core/src/components/checkbox.tsx rename to packages/core/src/components/checkbox/checkbox.tsx diff --git a/packages/core/src/components/checkbox/index.ts b/packages/core/src/components/checkbox/index.ts new file mode 100644 index 00000000..057f1678 --- /dev/null +++ b/packages/core/src/components/checkbox/index.ts @@ -0,0 +1 @@ +export * from "./checkbox"; diff --git a/packages/core/src/components/combobox-standalone.test.tsx b/packages/core/src/components/combobox/combobox-standalone.test.tsx similarity index 100% rename from packages/core/src/components/combobox-standalone.test.tsx rename to packages/core/src/components/combobox/combobox-standalone.test.tsx diff --git a/packages/core/src/components/combobox-standalone.tsx b/packages/core/src/components/combobox/combobox-standalone.tsx similarity index 98% rename from packages/core/src/components/combobox-standalone.tsx rename to packages/core/src/components/combobox/combobox-standalone.tsx index fa192609..69c63f16 100644 --- a/packages/core/src/components/combobox-standalone.tsx +++ b/packages/core/src/components/combobox/combobox-standalone.tsx @@ -22,9 +22,9 @@ import { useFilter, } from "./combobox"; -import { defaultMapItem, isGroupedItems } from "./dropdown-items"; -import type { MappedItem, ItemGroup, ExtractItem } from "./dropdown-items"; -import { AsyncErrorState, resolveAsyncContent } from "./async-error-state"; +import { defaultMapItem, isGroupedItems } from "../dropdown-items"; +import type { MappedItem, ItemGroup, ExtractItem } from "../dropdown-items"; +import { AsyncErrorState, resolveAsyncContent } from "../async-error-state"; import type { AsyncFetcher } from "@/hooks/use-async-items"; /** Fetcher type for `Combobox.Async`. */ diff --git a/packages/core/src/components/combobox.test.tsx b/packages/core/src/components/combobox/combobox.test.tsx similarity index 100% rename from packages/core/src/components/combobox.test.tsx rename to packages/core/src/components/combobox/combobox.test.tsx diff --git a/packages/core/src/components/combobox.tsx b/packages/core/src/components/combobox/combobox.tsx similarity index 100% rename from packages/core/src/components/combobox.tsx rename to packages/core/src/components/combobox/combobox.tsx diff --git a/packages/core/src/components/combobox/index.ts b/packages/core/src/components/combobox/index.ts new file mode 100644 index 00000000..2801849b --- /dev/null +++ b/packages/core/src/components/combobox/index.ts @@ -0,0 +1,2 @@ +export * from "./combobox"; +export * from "./combobox-standalone"; diff --git a/packages/core/src/components/command-palette-hook.test.tsx b/packages/core/src/components/command-palette/command-palette-hook.test.tsx similarity index 100% rename from packages/core/src/components/command-palette-hook.test.tsx rename to packages/core/src/components/command-palette/command-palette-hook.test.tsx diff --git a/packages/core/src/components/command-palette.test.tsx b/packages/core/src/components/command-palette/command-palette.test.tsx similarity index 99% rename from packages/core/src/components/command-palette.test.tsx rename to packages/core/src/components/command-palette/command-palette.test.tsx index 0cf98908..0a54a5d0 100644 --- a/packages/core/src/components/command-palette.test.tsx +++ b/packages/core/src/components/command-palette/command-palette.test.tsx @@ -18,7 +18,7 @@ import { import { MemoryRouter } from "react-router"; import type { ReactNode } from "react"; import type { Resource } from "@/resource"; -import type { NavItem } from "../routing/navigation"; +import type { NavItem } from "../../routing/navigation"; // Mock NavItems for testing const mockNavItems: NavItem[] = [ diff --git a/packages/core/src/components/command-palette.tsx b/packages/core/src/components/command-palette/command-palette.tsx similarity index 99% rename from packages/core/src/components/command-palette.tsx rename to packages/core/src/components/command-palette/command-palette.tsx index 94005e01..39137f57 100644 --- a/packages/core/src/components/command-palette.tsx +++ b/packages/core/src/components/command-palette/command-palette.tsx @@ -7,7 +7,7 @@ import { Input } from "@/components/input"; import { useT } from "@/i18n-labels"; import { cn } from "@/lib/utils"; import { filterRoutes, NavigatableRoute } from "@/routing/path"; -import { useNavItems, NavItem, NavItemResource } from "../routing/navigation"; +import { useNavItems, NavItem, NavItemResource } from "../../routing/navigation"; import { useCommandPaletteActions, useCommandPaletteState, diff --git a/packages/core/src/components/command-palette/index.ts b/packages/core/src/components/command-palette/index.ts new file mode 100644 index 00000000..3c7408bf --- /dev/null +++ b/packages/core/src/components/command-palette/index.ts @@ -0,0 +1 @@ +export * from "./command-palette"; diff --git a/packages/core/src/components/content.tsx b/packages/core/src/components/content/content.tsx similarity index 96% rename from packages/core/src/components/content.tsx rename to packages/core/src/components/content/content.tsx index ff66b57f..6257d69b 100644 --- a/packages/core/src/components/content.tsx +++ b/packages/core/src/components/content/content.tsx @@ -1,7 +1,7 @@ import { NavLink, Outlet } from "react-router"; import { useAppShell } from "@/contexts/appshell-context"; -import { Button } from "./button"; -import { Toaster } from "./sonner"; +import { Button } from "../button"; +import { Toaster } from "../sonner"; import { useT } from "@/i18n-labels"; import { useTitleResolver } from "@/hooks/i18n"; diff --git a/packages/core/src/components/content/index.ts b/packages/core/src/components/content/index.ts new file mode 100644 index 00000000..eb30f0f5 --- /dev/null +++ b/packages/core/src/components/content/index.ts @@ -0,0 +1 @@ +export * from "./content"; diff --git a/packages/core/src/components/csv-importer/CsvImporter.tsx b/packages/core/src/components/csv-importer/CsvImporter.tsx index e197c83b..b3ba8830 100644 --- a/packages/core/src/components/csv-importer/CsvImporter.tsx +++ b/packages/core/src/components/csv-importer/CsvImporter.tsx @@ -13,7 +13,7 @@ import { } from "lucide-react"; import { cn } from "@/lib/utils"; -import { Combobox } from "@/components/combobox-standalone"; +import { Combobox } from "@/components/combobox"; import type { CsvImporterProps, CsvImporterStep, diff --git a/packages/core/src/components/data-table/pagination.tsx b/packages/core/src/components/data-table/pagination.tsx index 9eb22e60..109d1022 100644 --- a/packages/core/src/components/data-table/pagination.tsx +++ b/packages/core/src/components/data-table/pagination.tsx @@ -1,6 +1,6 @@ import { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight } from "lucide-react"; import { Button } from "@/components/button"; -import { Select } from "@/components/select-standalone"; +import { Select } from "@/components/select"; import { useDataTableContext } from "./data-table-context"; import { useDataTableT } from "./i18n"; diff --git a/packages/core/src/components/data-table/toolbar.tsx b/packages/core/src/components/data-table/toolbar.tsx index 06fc311c..629d9abb 100644 --- a/packages/core/src/components/data-table/toolbar.tsx +++ b/packages/core/src/components/data-table/toolbar.tsx @@ -6,7 +6,7 @@ import { useCollectionControlOptional } from "@/contexts/collection-control-cont import { Button } from "@/components/button"; import { Input } from "@/components/input"; import { Checkbox } from "@/components/checkbox"; -import { Select } from "@/components/select-standalone"; +import { Select } from "@/components/select"; import { DatePicker } from "@/components/date-field"; import { Calendar } from "@/components/calendar"; import { Tooltip } from "@/components/tooltip"; diff --git a/packages/core/src/components/default-error-boundary.tsx b/packages/core/src/components/default-error-boundary/default-error-boundary.tsx similarity index 98% rename from packages/core/src/components/default-error-boundary.tsx rename to packages/core/src/components/default-error-boundary/default-error-boundary.tsx index 53d5f3cc..ab250ab1 100644 --- a/packages/core/src/components/default-error-boundary.tsx +++ b/packages/core/src/components/default-error-boundary/default-error-boundary.tsx @@ -1,5 +1,5 @@ import { useRouteError, isRouteErrorResponse } from "react-router"; -import { Button } from "./button"; +import { Button } from "../button"; import { AlertCircle } from "lucide-react"; import { useT } from "@/i18n-labels"; diff --git a/packages/core/src/components/default-error-boundary/index.ts b/packages/core/src/components/default-error-boundary/index.ts new file mode 100644 index 00000000..c033b2a5 --- /dev/null +++ b/packages/core/src/components/default-error-boundary/index.ts @@ -0,0 +1 @@ +export * from "./default-error-boundary"; diff --git a/packages/core/src/components/dialog.test.tsx b/packages/core/src/components/dialog/dialog.test.tsx similarity index 100% rename from packages/core/src/components/dialog.test.tsx rename to packages/core/src/components/dialog/dialog.test.tsx diff --git a/packages/core/src/components/dialog.tsx b/packages/core/src/components/dialog/dialog.tsx similarity index 100% rename from packages/core/src/components/dialog.tsx rename to packages/core/src/components/dialog/dialog.tsx diff --git a/packages/core/src/components/dialog/index.ts b/packages/core/src/components/dialog/index.ts new file mode 100644 index 00000000..e5c28748 --- /dev/null +++ b/packages/core/src/components/dialog/index.ts @@ -0,0 +1 @@ +export * from "./dialog"; diff --git a/packages/core/src/components/document-head.test.tsx b/packages/core/src/components/document-head/document-head.test.tsx similarity index 100% rename from packages/core/src/components/document-head.test.tsx rename to packages/core/src/components/document-head/document-head.test.tsx diff --git a/packages/core/src/components/document-head.tsx b/packages/core/src/components/document-head/document-head.tsx similarity index 100% rename from packages/core/src/components/document-head.tsx rename to packages/core/src/components/document-head/document-head.tsx diff --git a/packages/core/src/components/document-head/index.ts b/packages/core/src/components/document-head/index.ts new file mode 100644 index 00000000..c5eba60a --- /dev/null +++ b/packages/core/src/components/document-head/index.ts @@ -0,0 +1 @@ +export * from "./document-head"; diff --git a/packages/core/src/components/dropdown-items.ts b/packages/core/src/components/dropdown-items/dropdown-items.ts similarity index 100% rename from packages/core/src/components/dropdown-items.ts rename to packages/core/src/components/dropdown-items/dropdown-items.ts diff --git a/packages/core/src/components/dropdown-items/index.ts b/packages/core/src/components/dropdown-items/index.ts new file mode 100644 index 00000000..403c0f37 --- /dev/null +++ b/packages/core/src/components/dropdown-items/index.ts @@ -0,0 +1 @@ +export * from "./dropdown-items"; diff --git a/packages/core/src/components/dynamic-breadcrumb.tsx b/packages/core/src/components/dynamic-breadcrumb/dynamic-breadcrumb.tsx similarity index 100% rename from packages/core/src/components/dynamic-breadcrumb.tsx rename to packages/core/src/components/dynamic-breadcrumb/dynamic-breadcrumb.tsx diff --git a/packages/core/src/components/dynamic-breadcrumb/index.ts b/packages/core/src/components/dynamic-breadcrumb/index.ts new file mode 100644 index 00000000..76fd90bc --- /dev/null +++ b/packages/core/src/components/dynamic-breadcrumb/index.ts @@ -0,0 +1 @@ +export * from "./dynamic-breadcrumb"; diff --git a/packages/core/src/components/field.test.tsx b/packages/core/src/components/field/field.test.tsx similarity index 100% rename from packages/core/src/components/field.test.tsx rename to packages/core/src/components/field/field.test.tsx diff --git a/packages/core/src/components/field.tsx b/packages/core/src/components/field/field.tsx similarity index 100% rename from packages/core/src/components/field.tsx rename to packages/core/src/components/field/field.tsx diff --git a/packages/core/src/components/field/index.ts b/packages/core/src/components/field/index.ts new file mode 100644 index 00000000..6ef9f38e --- /dev/null +++ b/packages/core/src/components/field/index.ts @@ -0,0 +1 @@ +export * from "./field"; diff --git a/packages/core/src/components/fieldset.test.tsx b/packages/core/src/components/fieldset/fieldset.test.tsx similarity index 100% rename from packages/core/src/components/fieldset.test.tsx rename to packages/core/src/components/fieldset/fieldset.test.tsx diff --git a/packages/core/src/components/fieldset.tsx b/packages/core/src/components/fieldset/fieldset.tsx similarity index 100% rename from packages/core/src/components/fieldset.tsx rename to packages/core/src/components/fieldset/fieldset.tsx diff --git a/packages/core/src/components/fieldset/index.ts b/packages/core/src/components/fieldset/index.ts new file mode 100644 index 00000000..aab84cdd --- /dev/null +++ b/packages/core/src/components/fieldset/index.ts @@ -0,0 +1 @@ +export * from "./fieldset"; diff --git a/packages/core/src/components/form.test.tsx b/packages/core/src/components/form/form.test.tsx similarity index 99% rename from packages/core/src/components/form.test.tsx rename to packages/core/src/components/form/form.test.tsx index 3578c177..988ec44b 100644 --- a/packages/core/src/components/form.test.tsx +++ b/packages/core/src/components/form/form.test.tsx @@ -3,7 +3,7 @@ import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { Controller, useForm } from "react-hook-form"; import { Form } from "./form"; -import { Field } from "./field"; +import { Field } from "../field"; afterEach(() => { cleanup(); diff --git a/packages/core/src/components/form.tsx b/packages/core/src/components/form/form.tsx similarity index 100% rename from packages/core/src/components/form.tsx rename to packages/core/src/components/form/form.tsx diff --git a/packages/core/src/components/form/index.ts b/packages/core/src/components/form/index.ts new file mode 100644 index 00000000..c4a75a7a --- /dev/null +++ b/packages/core/src/components/form/index.ts @@ -0,0 +1 @@ +export * from "./form"; diff --git a/packages/core/src/components/input/index.ts b/packages/core/src/components/input/index.ts new file mode 100644 index 00000000..4ce4a889 --- /dev/null +++ b/packages/core/src/components/input/index.ts @@ -0,0 +1 @@ +export * from "./input"; diff --git a/packages/core/src/components/input.test.tsx b/packages/core/src/components/input/input.test.tsx similarity index 100% rename from packages/core/src/components/input.test.tsx rename to packages/core/src/components/input/input.test.tsx diff --git a/packages/core/src/components/input.tsx b/packages/core/src/components/input/input.tsx similarity index 100% rename from packages/core/src/components/input.tsx rename to packages/core/src/components/input/input.tsx diff --git a/packages/core/src/components/layout/index.ts b/packages/core/src/components/layout/index.ts new file mode 100644 index 00000000..f7ad5481 --- /dev/null +++ b/packages/core/src/components/layout/index.ts @@ -0,0 +1 @@ +export * from "./Layout"; diff --git a/packages/core/src/components/menu/index.ts b/packages/core/src/components/menu/index.ts new file mode 100644 index 00000000..4fbc74d7 --- /dev/null +++ b/packages/core/src/components/menu/index.ts @@ -0,0 +1 @@ +export * from "./menu"; diff --git a/packages/core/src/components/menu.test.tsx b/packages/core/src/components/menu/menu.test.tsx similarity index 100% rename from packages/core/src/components/menu.test.tsx rename to packages/core/src/components/menu/menu.test.tsx diff --git a/packages/core/src/components/menu.tsx b/packages/core/src/components/menu/menu.tsx similarity index 100% rename from packages/core/src/components/menu.tsx rename to packages/core/src/components/menu/menu.tsx diff --git a/packages/core/src/components/select/index.ts b/packages/core/src/components/select/index.ts new file mode 100644 index 00000000..2e324c14 --- /dev/null +++ b/packages/core/src/components/select/index.ts @@ -0,0 +1,2 @@ +export * from "./select"; +export * from "./select-standalone"; diff --git a/packages/core/src/components/select-standalone.test.tsx b/packages/core/src/components/select/select-standalone.test.tsx similarity index 100% rename from packages/core/src/components/select-standalone.test.tsx rename to packages/core/src/components/select/select-standalone.test.tsx diff --git a/packages/core/src/components/select-standalone.tsx b/packages/core/src/components/select/select-standalone.tsx similarity index 98% rename from packages/core/src/components/select-standalone.tsx rename to packages/core/src/components/select/select-standalone.tsx index 52778af6..19224950 100644 --- a/packages/core/src/components/select-standalone.tsx +++ b/packages/core/src/components/select/select-standalone.tsx @@ -10,9 +10,9 @@ import { SelectGroupLabel, SelectParts, } from "./select"; -import { defaultMapItem, isGroupedItems } from "./dropdown-items"; -import type { MappedItem, ItemGroup, ExtractItem } from "./dropdown-items"; -import { AsyncErrorState, resolveAsyncContent } from "./async-error-state"; +import { defaultMapItem, isGroupedItems } from "../dropdown-items"; +import type { MappedItem, ItemGroup, ExtractItem } from "../dropdown-items"; +import { AsyncErrorState, resolveAsyncContent } from "../async-error-state"; /** * Fetcher type for `Select.Async`. diff --git a/packages/core/src/components/select.test.tsx b/packages/core/src/components/select/select.test.tsx similarity index 100% rename from packages/core/src/components/select.test.tsx rename to packages/core/src/components/select/select.test.tsx diff --git a/packages/core/src/components/select.tsx b/packages/core/src/components/select/select.tsx similarity index 100% rename from packages/core/src/components/select.tsx rename to packages/core/src/components/select/select.tsx diff --git a/packages/core/src/components/separator/index.ts b/packages/core/src/components/separator/index.ts new file mode 100644 index 00000000..8cb65e02 --- /dev/null +++ b/packages/core/src/components/separator/index.ts @@ -0,0 +1 @@ +export * from "./separator"; diff --git a/packages/core/src/components/separator.test.tsx b/packages/core/src/components/separator/separator.test.tsx similarity index 100% rename from packages/core/src/components/separator.test.tsx rename to packages/core/src/components/separator/separator.test.tsx diff --git a/packages/core/src/components/separator.tsx b/packages/core/src/components/separator/separator.tsx similarity index 100% rename from packages/core/src/components/separator.tsx rename to packages/core/src/components/separator/separator.tsx diff --git a/packages/core/src/components/sheet/index.ts b/packages/core/src/components/sheet/index.ts new file mode 100644 index 00000000..7d8ca084 --- /dev/null +++ b/packages/core/src/components/sheet/index.ts @@ -0,0 +1 @@ +export * from "./sheet"; diff --git a/packages/core/src/components/sheet.test.tsx b/packages/core/src/components/sheet/sheet.test.tsx similarity index 100% rename from packages/core/src/components/sheet.test.tsx rename to packages/core/src/components/sheet/sheet.test.tsx diff --git a/packages/core/src/components/sheet.tsx b/packages/core/src/components/sheet/sheet.tsx similarity index 100% rename from packages/core/src/components/sheet.tsx rename to packages/core/src/components/sheet/sheet.tsx diff --git a/packages/core/src/components/sidebar/default-header.tsx b/packages/core/src/components/sidebar/default-header.tsx index b4e74608..9897f5c8 100644 --- a/packages/core/src/components/sidebar/default-header.tsx +++ b/packages/core/src/components/sidebar/default-header.tsx @@ -1,4 +1,4 @@ -import { SidebarTrigger, useSidebar } from "@/components/sidebar"; +import { SidebarTrigger, useSidebar } from "./primitives"; import { AppearanceSwitcher } from "@/components/appearance-switcher"; import { DynamicBreadcrumb } from "@/components/dynamic-breadcrumb"; diff --git a/packages/core/src/components/sidebar/default-sidebar.test.tsx b/packages/core/src/components/sidebar/default-sidebar.test.tsx index 94541c40..f653e3fb 100644 --- a/packages/core/src/components/sidebar/default-sidebar.test.tsx +++ b/packages/core/src/components/sidebar/default-sidebar.test.tsx @@ -2,7 +2,7 @@ import { render, screen, cleanup, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { describe, it, expect, afterEach, assert, vi } from "vitest"; import { MemoryRouter } from "react-router"; -import { SidebarProvider } from "@/components/sidebar"; +import { SidebarProvider } from "./primitives"; import { AppShellConfigContext, type RootConfiguration } from "@/contexts/appshell-context"; import { CommandPaletteProvider } from "@/contexts/command-palette-context"; import { DefaultSidebar } from "./default-sidebar"; diff --git a/packages/core/src/components/sidebar/default-sidebar.tsx b/packages/core/src/components/sidebar/default-sidebar.tsx index eb111367..55c18047 100644 --- a/packages/core/src/components/sidebar/default-sidebar.tsx +++ b/packages/core/src/components/sidebar/default-sidebar.tsx @@ -16,7 +16,7 @@ import { SidebarHeader, SidebarTrigger, useSidebar, -} from "@/components/sidebar"; +} from "./primitives"; import { useAppShellConfig } from "@/contexts/appshell-context"; import { useCommandPaletteState } from "@/contexts/command-palette-context"; import { Link } from "react-router"; diff --git a/packages/core/src/components/sidebar.tsx b/packages/core/src/components/sidebar/primitives.tsx similarity index 100% rename from packages/core/src/components/sidebar.tsx rename to packages/core/src/components/sidebar/primitives.tsx diff --git a/packages/core/src/components/sidebar/sidebar-group.tsx b/packages/core/src/components/sidebar/sidebar-group.tsx index f094f354..e0f42588 100644 --- a/packages/core/src/components/sidebar/sidebar-group.tsx +++ b/packages/core/src/components/sidebar/sidebar-group.tsx @@ -7,7 +7,7 @@ import { SidebarMenuButton, SidebarMenuAction, SidebarMenuSub, -} from "@/components/sidebar"; +} from "./primitives"; import { useT } from "@/i18n-labels"; import { useAppShellConfig } from "@/contexts/appshell-context"; import { buildLocaleResolver, type LocalizedString } from "@/lib/i18n"; diff --git a/packages/core/src/components/sidebar/sidebar-item.tsx b/packages/core/src/components/sidebar/sidebar-item.tsx index 03949b88..f8edaf9a 100644 --- a/packages/core/src/components/sidebar/sidebar-item.tsx +++ b/packages/core/src/components/sidebar/sidebar-item.tsx @@ -1,7 +1,7 @@ import type { ReactNode } from "react"; import { useLocation, Link } from "react-router"; import { ExternalLink } from "lucide-react"; -import { SidebarMenuItem, SidebarMenuButton } from "@/components/sidebar"; +import { SidebarMenuItem, SidebarMenuButton } from "./primitives"; import { usePageMeta } from "@/hooks/use-page-meta"; export type SidebarItemRenderProps = { diff --git a/packages/core/src/components/sidebar/sidebar-layout.tsx b/packages/core/src/components/sidebar/sidebar-layout.tsx index 1d4aeefc..9ecdc68d 100644 --- a/packages/core/src/components/sidebar/sidebar-layout.tsx +++ b/packages/core/src/components/sidebar/sidebar-layout.tsx @@ -1,5 +1,5 @@ import { useRef, type RefObject } from "react"; -import { SidebarProvider, SidebarInset } from "@/components/sidebar"; +import { SidebarProvider, SidebarInset } from "./primitives"; import { AppShellOutlet } from "@/components/content"; import { AppShellScrollContainerProvider } from "@/contexts/scroll-container-context"; import { DefaultSidebar } from "./default-sidebar"; diff --git a/packages/core/src/components/sidebar/sidebar-separator.tsx b/packages/core/src/components/sidebar/sidebar-separator.tsx index 9b1891e4..579d5b02 100644 --- a/packages/core/src/components/sidebar/sidebar-separator.tsx +++ b/packages/core/src/components/sidebar/sidebar-separator.tsx @@ -1,4 +1,4 @@ -import { SidebarSeparator as ShadcnSidebarSeparator } from "@/components/sidebar"; +import { SidebarSeparator as ShadcnSidebarSeparator } from "./primitives"; /** * A visual divider for sidebar navigation. diff --git a/packages/core/src/components/sidebar/sidebar.test.tsx b/packages/core/src/components/sidebar/sidebar.test.tsx index cd2fc291..c56351df 100644 --- a/packages/core/src/components/sidebar/sidebar.test.tsx +++ b/packages/core/src/components/sidebar/sidebar.test.tsx @@ -13,7 +13,7 @@ import { SidebarMenuSubItem, SidebarMenuSubButton, SidebarTrigger, -} from "@/components/sidebar"; +} from "./primitives"; import { AppShellConfigContext, type RootConfiguration } from "@/contexts/appshell-context"; import { SidebarItem } from "./sidebar-item"; import { SidebarGroup } from "./sidebar-group"; diff --git a/packages/core/src/components/sonner/index.ts b/packages/core/src/components/sonner/index.ts new file mode 100644 index 00000000..9e01ee35 --- /dev/null +++ b/packages/core/src/components/sonner/index.ts @@ -0,0 +1 @@ +export * from "./sonner"; diff --git a/packages/core/src/components/sonner.tsx b/packages/core/src/components/sonner/sonner.tsx similarity index 100% rename from packages/core/src/components/sonner.tsx rename to packages/core/src/components/sonner/sonner.tsx diff --git a/packages/core/src/components/table/index.ts b/packages/core/src/components/table/index.ts new file mode 100644 index 00000000..0e948df9 --- /dev/null +++ b/packages/core/src/components/table/index.ts @@ -0,0 +1 @@ +export * from "./table"; diff --git a/packages/core/src/components/table.test.tsx b/packages/core/src/components/table/table.test.tsx similarity index 100% rename from packages/core/src/components/table.test.tsx rename to packages/core/src/components/table/table.test.tsx diff --git a/packages/core/src/components/table.tsx b/packages/core/src/components/table/table.tsx similarity index 100% rename from packages/core/src/components/table.tsx rename to packages/core/src/components/table/table.tsx diff --git a/packages/core/src/components/tabs/index.ts b/packages/core/src/components/tabs/index.ts new file mode 100644 index 00000000..811d3d4a --- /dev/null +++ b/packages/core/src/components/tabs/index.ts @@ -0,0 +1 @@ +export * from "./tabs"; diff --git a/packages/core/src/components/tabs.test.tsx b/packages/core/src/components/tabs/tabs.test.tsx similarity index 100% rename from packages/core/src/components/tabs.test.tsx rename to packages/core/src/components/tabs/tabs.test.tsx diff --git a/packages/core/src/components/tabs.tsx b/packages/core/src/components/tabs/tabs.tsx similarity index 100% rename from packages/core/src/components/tabs.tsx rename to packages/core/src/components/tabs/tabs.tsx diff --git a/packages/core/src/components/timeline/index.ts b/packages/core/src/components/timeline/index.ts new file mode 100644 index 00000000..ab509301 --- /dev/null +++ b/packages/core/src/components/timeline/index.ts @@ -0,0 +1 @@ +export * from "./timeline"; diff --git a/packages/core/src/components/timeline.test.tsx b/packages/core/src/components/timeline/timeline.test.tsx similarity index 100% rename from packages/core/src/components/timeline.test.tsx rename to packages/core/src/components/timeline/timeline.test.tsx diff --git a/packages/core/src/components/timeline.tsx b/packages/core/src/components/timeline/timeline.tsx similarity index 100% rename from packages/core/src/components/timeline.tsx rename to packages/core/src/components/timeline/timeline.tsx diff --git a/packages/core/src/components/tooltip/index.ts b/packages/core/src/components/tooltip/index.ts new file mode 100644 index 00000000..3c61782a --- /dev/null +++ b/packages/core/src/components/tooltip/index.ts @@ -0,0 +1 @@ +export * from "./tooltip"; diff --git a/packages/core/src/components/tooltip.test.tsx b/packages/core/src/components/tooltip/tooltip.test.tsx similarity index 100% rename from packages/core/src/components/tooltip.test.tsx rename to packages/core/src/components/tooltip/tooltip.test.tsx diff --git a/packages/core/src/components/tooltip.tsx b/packages/core/src/components/tooltip/tooltip.tsx similarity index 100% rename from packages/core/src/components/tooltip.tsx rename to packages/core/src/components/tooltip/tooltip.tsx diff --git a/packages/core/src/components/with-guard/index.ts b/packages/core/src/components/with-guard/index.ts new file mode 100644 index 00000000..4050cf9a --- /dev/null +++ b/packages/core/src/components/with-guard/index.ts @@ -0,0 +1 @@ +export * from "./with-guard"; diff --git a/packages/core/src/components/with-guard.test.tsx b/packages/core/src/components/with-guard/with-guard.test.tsx similarity index 100% rename from packages/core/src/components/with-guard.test.tsx rename to packages/core/src/components/with-guard/with-guard.test.tsx diff --git a/packages/core/src/components/with-guard.tsx b/packages/core/src/components/with-guard/with-guard.tsx similarity index 100% rename from packages/core/src/components/with-guard.tsx rename to packages/core/src/components/with-guard/with-guard.tsx diff --git a/packages/core/src/contexts/scroll-container-context.test.tsx b/packages/core/src/contexts/scroll-container-context.test.tsx index 75ac377e..d70920c3 100644 --- a/packages/core/src/contexts/scroll-container-context.test.tsx +++ b/packages/core/src/contexts/scroll-container-context.test.tsx @@ -1,7 +1,7 @@ import { render, cleanup, waitFor } from "@testing-library/react"; import { describe, it, expect, afterEach, vi } from "vitest"; import { useEffect, type RefObject } from "react"; -import { SidebarLayout } from "@/components/sidebar/sidebar-layout"; +import { SidebarLayout } from "@/components/sidebar"; import { AppShell } from "@/components/appshell"; import { defineModule } from "@/resource"; import { Home } from "lucide-react"; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 88c78282..ff022320 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,5 +1,5 @@ export { AppShell, type AppShellProps } from "./components/appshell"; -export { SidebarLayout, DefaultSidebar, DefaultHeader } from "./components/sidebar/index"; +export { SidebarLayout, DefaultSidebar, DefaultHeader } from "./components/sidebar"; export { CommandPalette } from "./components/command-palette"; export { useOpenCommandPalette, @@ -20,7 +20,7 @@ export { type SidebarLayoutProps, type DefaultSidebarProps, type DefaultHeaderProps, -} from "./components/sidebar/index"; +} from "./components/sidebar"; // Guard component for conditional rendering export { WithGuard, type WithGuardProps } from "./components/with-guard"; @@ -132,7 +132,7 @@ export { DocumentProgressCard, type DocumentProgressCardProps, } from "./components/document-progress-card"; -export { Layout, type LayoutProps } from "./components/layout/Layout"; +export { Layout, type LayoutProps } from "./components/layout"; export { Grid, type GridProps, type GridItemProps } from "./components/grid"; export { Button, buttonVariants, type ButtonProps } from "./components/button"; export { Avatar, avatarVariants, type AvatarProps } from "./components/avatar"; @@ -148,9 +148,9 @@ export { Menu } from "./components/menu"; export { Sheet } from "./components/sheet"; export { Tabs } from "./components/tabs"; export { Tooltip } from "./components/tooltip"; -export { Select, type SelectAsyncFetcher } from "./components/select-standalone"; -export { Combobox, type ComboboxAsyncFetcher } from "./components/combobox-standalone"; -export { Autocomplete, type AutocompleteAsyncFetcher } from "./components/autocomplete-standalone"; +export { Select, type SelectAsyncFetcher } from "./components/select"; +export { Combobox, type ComboboxAsyncFetcher } from "./components/combobox"; +export { Autocomplete, type AutocompleteAsyncFetcher } from "./components/autocomplete"; export { DateField, DatePicker, diff --git a/packages/vite-plugin/README.md b/packages/vite-plugin/README.md index 48a607a2..7cf81049 100644 --- a/packages/vite-plugin/README.md +++ b/packages/vite-plugin/README.md @@ -146,7 +146,7 @@ Vite resolves node_modules packages first by default. To intercept `@tailor-plat ## AppShell.WithPages (Internal) ```typescript -// packages/core/src/components/appshell.tsx +// packages/core/src/components/appshell/appshell.tsx /** * @internal From d9d266327758db1d24c12f0c87446ef67a81fa32 Mon Sep 17 00:00:00 2001 From: IzumiSy Date: Fri, 21 Aug 2026 16:27:20 +0900 Subject: [PATCH 2/5] Fix pattern fit heading labels --- .agents/references/component-design.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.agents/references/component-design.md b/.agents/references/component-design.md index a39b03a3..0105d56f 100644 --- a/.agents/references/component-design.md +++ b/.agents/references/component-design.md @@ -124,7 +124,7 @@ function Component({ className, variant, size, ...props }: ComponentProps) { export { Component, componentVariants, type ComponentProps }; ``` -### Pattern B — Compound namespace object +### Compound namespace object Use when the consumer must compose meaningful sub-components directly. @@ -172,7 +172,7 @@ const ComponentName = { export { ComponentName }; ``` -### Pattern D — Standalone + `Parts` +### Standalone + `Parts` Use when there is a dominant pre-assembled use case, but advanced consumers still need composition escape hatches. From 2b40dcd2bcfed7aa00ece48fe38f61e0e6451898 Mon Sep 17 00:00:00 2001 From: IzumiSy Date: Fri, 21 Aug 2026 16:38:30 +0900 Subject: [PATCH 3/5] Move internal-only components under internals --- .../autocomplete/autocomplete-standalone.test.tsx | 4 ++-- .../src/components/autocomplete/autocomplete-standalone.tsx | 2 +- packages/core/src/components/checkbox/checkbox.test.tsx | 2 +- .../src/components/combobox/combobox-standalone.test.tsx | 4 ++-- .../core/src/components/combobox/combobox-standalone.tsx | 2 +- .../core/src/components/command-palette/command-palette.tsx | 2 +- packages/core/src/components/field/field.test.tsx | 2 +- packages/core/src/components/input/input.test.tsx | 2 +- .../components/{ => internals}/app-info/app-info.test.tsx | 2 +- .../src/components/{ => internals}/app-info/app-info.tsx | 2 +- .../core/src/components/{ => internals}/app-info/index.ts | 0 .../{ => internals}/async-error-state/async-error-state.tsx | 0 .../components/{ => internals}/async-error-state/index.ts | 0 .../components/{ => internals}/breadcrumb/breadcrumb.tsx | 0 .../core/src/components/{ => internals}/breadcrumb/index.ts | 0 .../core/src/components/{ => internals}/content/content.tsx | 2 +- .../core/src/components/{ => internals}/content/index.ts | 0 .../default-error-boundary/default-error-boundary.tsx | 2 +- .../{ => internals}/default-error-boundary/index.ts | 0 .../{ => internals}/document-head/document-head.test.tsx | 0 .../{ => internals}/document-head/document-head.tsx | 2 +- .../src/components/{ => internals}/document-head/index.ts | 0 .../dynamic-breadcrumb/dynamic-breadcrumb.tsx | 2 +- .../components/{ => internals}/dynamic-breadcrumb/index.ts | 0 .../core/src/components/{ => internals}/separator/index.ts | 0 .../components/{ => internals}/separator/separator.test.tsx | 0 .../src/components/{ => internals}/separator/separator.tsx | 0 .../core/src/components/{ => internals}/sonner/index.ts | 0 .../core/src/components/{ => internals}/sonner/sonner.tsx | 0 .../core/src/components/select/select-standalone.test.tsx | 4 ++-- packages/core/src/components/select/select-standalone.tsx | 2 +- packages/core/src/components/sidebar/default-header.tsx | 2 +- .../core/src/components/sidebar/default-sidebar.test.tsx | 2 +- packages/core/src/components/sidebar/primitives.tsx | 2 +- packages/core/src/components/sidebar/sidebar-layout.tsx | 2 +- packages/core/src/components/sidebar/sidebar.test.tsx | 2 +- packages/core/src/components/with-guard/with-guard.test.tsx | 2 +- packages/core/src/contexts/appshell-context.tsx | 2 +- packages/core/src/fs-routes/converter.tsx | 2 +- packages/core/src/hooks/use-page-meta.test.tsx | 2 +- packages/core/src/resource.tsx | 2 +- packages/core/src/routing/router.tsx | 2 +- packages/core/src/routing/routes.test.tsx | 2 +- packages/core/src/routing/routes.tsx | 6 +++--- 44 files changed, 34 insertions(+), 34 deletions(-) rename packages/core/src/components/{ => internals}/app-info/app-info.test.tsx (98%) rename packages/core/src/components/{ => internals}/app-info/app-info.tsx (98%) rename packages/core/src/components/{ => internals}/app-info/index.ts (100%) rename packages/core/src/components/{ => internals}/async-error-state/async-error-state.tsx (100%) rename packages/core/src/components/{ => internals}/async-error-state/index.ts (100%) rename packages/core/src/components/{ => internals}/breadcrumb/breadcrumb.tsx (100%) rename packages/core/src/components/{ => internals}/breadcrumb/index.ts (100%) rename packages/core/src/components/{ => internals}/content/content.tsx (98%) rename packages/core/src/components/{ => internals}/content/index.ts (100%) rename packages/core/src/components/{ => internals}/default-error-boundary/default-error-boundary.tsx (98%) rename packages/core/src/components/{ => internals}/default-error-boundary/index.ts (100%) rename packages/core/src/components/{ => internals}/document-head/document-head.test.tsx (100%) rename packages/core/src/components/{ => internals}/document-head/document-head.tsx (98%) rename packages/core/src/components/{ => internals}/document-head/index.ts (100%) rename packages/core/src/components/{ => internals}/dynamic-breadcrumb/dynamic-breadcrumb.tsx (98%) rename packages/core/src/components/{ => internals}/dynamic-breadcrumb/index.ts (100%) rename packages/core/src/components/{ => internals}/separator/index.ts (100%) rename packages/core/src/components/{ => internals}/separator/separator.test.tsx (100%) rename packages/core/src/components/{ => internals}/separator/separator.tsx (100%) rename packages/core/src/components/{ => internals}/sonner/index.ts (100%) rename packages/core/src/components/{ => internals}/sonner/sonner.tsx (100%) diff --git a/packages/core/src/components/autocomplete/autocomplete-standalone.test.tsx b/packages/core/src/components/autocomplete/autocomplete-standalone.test.tsx index d56f870f..08d51ae3 100644 --- a/packages/core/src/components/autocomplete/autocomplete-standalone.test.tsx +++ b/packages/core/src/components/autocomplete/autocomplete-standalone.test.tsx @@ -1,8 +1,8 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { renderRHFForm } from "../../tests/rhf-test-utils"; -import { Field } from "./field"; +import { renderRHFForm } from "../../../tests/rhf-test-utils"; +import { Field } from "../field"; import { Autocomplete } from "./autocomplete-standalone"; afterEach(() => { diff --git a/packages/core/src/components/autocomplete/autocomplete-standalone.tsx b/packages/core/src/components/autocomplete/autocomplete-standalone.tsx index d0a375a7..f4a6b4c4 100644 --- a/packages/core/src/components/autocomplete/autocomplete-standalone.tsx +++ b/packages/core/src/components/autocomplete/autocomplete-standalone.tsx @@ -18,7 +18,7 @@ import { } from "./autocomplete"; import { defaultMapItem, isGroupedItems } from "../dropdown-items"; import type { MappedItem, ItemGroup, ExtractItem } from "../dropdown-items"; -import { AsyncErrorState, resolveAsyncContent } from "../async-error-state"; +import { AsyncErrorState, resolveAsyncContent } from "../internals/async-error-state"; import type { AsyncFetcher } from "@/hooks/use-async-items"; /** Fetcher type for `Autocomplete.Async`. */ diff --git a/packages/core/src/components/checkbox/checkbox.test.tsx b/packages/core/src/components/checkbox/checkbox.test.tsx index b256a93b..70c8e17e 100644 --- a/packages/core/src/components/checkbox/checkbox.test.tsx +++ b/packages/core/src/components/checkbox/checkbox.test.tsx @@ -2,7 +2,7 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { renderRHFForm } from "../../tests/rhf-test-utils"; +import { renderRHFForm } from "../../../tests/rhf-test-utils"; import { Checkbox } from "./checkbox"; import { Field } from "../field"; diff --git a/packages/core/src/components/combobox/combobox-standalone.test.tsx b/packages/core/src/components/combobox/combobox-standalone.test.tsx index 4decb597..d807170f 100644 --- a/packages/core/src/components/combobox/combobox-standalone.test.tsx +++ b/packages/core/src/components/combobox/combobox-standalone.test.tsx @@ -1,8 +1,8 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { renderRHFForm } from "../../tests/rhf-test-utils"; -import { Field } from "./field"; +import { renderRHFForm } from "../../../tests/rhf-test-utils"; +import { Field } from "../field"; import { Combobox } from "./combobox-standalone"; afterEach(() => { diff --git a/packages/core/src/components/combobox/combobox-standalone.tsx b/packages/core/src/components/combobox/combobox-standalone.tsx index 69c63f16..085cf3ba 100644 --- a/packages/core/src/components/combobox/combobox-standalone.tsx +++ b/packages/core/src/components/combobox/combobox-standalone.tsx @@ -24,7 +24,7 @@ import { import { defaultMapItem, isGroupedItems } from "../dropdown-items"; import type { MappedItem, ItemGroup, ExtractItem } from "../dropdown-items"; -import { AsyncErrorState, resolveAsyncContent } from "../async-error-state"; +import { AsyncErrorState, resolveAsyncContent } from "../internals/async-error-state"; import type { AsyncFetcher } from "@/hooks/use-async-items"; /** Fetcher type for `Combobox.Async`. */ diff --git a/packages/core/src/components/command-palette/command-palette.tsx b/packages/core/src/components/command-palette/command-palette.tsx index 39137f57..211c1fb9 100644 --- a/packages/core/src/components/command-palette/command-palette.tsx +++ b/packages/core/src/components/command-palette/command-palette.tsx @@ -1,6 +1,6 @@ import { useReducer, useEffect, useMemo, useCallback, useRef, Suspense } from "react"; import { useNavigate, Await } from "react-router"; -import { useAppInfoPageRoute } from "@/components/app-info"; +import { useAppInfoPageRoute } from "@/components/internals/app-info"; import { SearchIcon, LoaderCircleIcon } from "lucide-react"; import { Dialog } from "@/components/dialog"; import { Input } from "@/components/input"; diff --git a/packages/core/src/components/field/field.test.tsx b/packages/core/src/components/field/field.test.tsx index 926ac639..e3ce5aac 100644 --- a/packages/core/src/components/field/field.test.tsx +++ b/packages/core/src/components/field/field.test.tsx @@ -1,7 +1,7 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { renderRHFForm } from "../../tests/rhf-test-utils"; +import { renderRHFForm } from "../../../tests/rhf-test-utils"; import { Field } from "./field"; afterEach(() => { diff --git a/packages/core/src/components/input/input.test.tsx b/packages/core/src/components/input/input.test.tsx index a2b024e6..373356ed 100644 --- a/packages/core/src/components/input/input.test.tsx +++ b/packages/core/src/components/input/input.test.tsx @@ -1,7 +1,7 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { renderRHFForm } from "../../tests/rhf-test-utils"; +import { renderRHFForm } from "../../../tests/rhf-test-utils"; import { Input } from "./input"; afterEach(() => { diff --git a/packages/core/src/components/app-info/app-info.test.tsx b/packages/core/src/components/internals/app-info/app-info.test.tsx similarity index 98% rename from packages/core/src/components/app-info/app-info.test.tsx rename to packages/core/src/components/internals/app-info/app-info.test.tsx index 62250e43..0f61b01a 100644 --- a/packages/core/src/components/app-info/app-info.test.tsx +++ b/packages/core/src/components/internals/app-info/app-info.test.tsx @@ -1,6 +1,6 @@ import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; -import packageJson from "../../../package.json"; +import packageJson from "../../../../package.json"; import { BuiltInCommandPalette } from "@/components/command-palette"; import { AppShellConfigContext, diff --git a/packages/core/src/components/app-info/app-info.tsx b/packages/core/src/components/internals/app-info/app-info.tsx similarity index 98% rename from packages/core/src/components/app-info/app-info.tsx rename to packages/core/src/components/internals/app-info/app-info.tsx index 725d7c9e..b85ecbf9 100644 --- a/packages/core/src/components/app-info/app-info.tsx +++ b/packages/core/src/components/internals/app-info/app-info.tsx @@ -1,4 +1,4 @@ -import packageJson from "../../../package.json"; +import packageJson from "../../../../package.json"; import { Button } from "@/components/button"; import { Card } from "@/components/card"; import { useAppShellConfig, type AppInfoEntry } from "@/contexts/appshell-context"; diff --git a/packages/core/src/components/app-info/index.ts b/packages/core/src/components/internals/app-info/index.ts similarity index 100% rename from packages/core/src/components/app-info/index.ts rename to packages/core/src/components/internals/app-info/index.ts diff --git a/packages/core/src/components/async-error-state/async-error-state.tsx b/packages/core/src/components/internals/async-error-state/async-error-state.tsx similarity index 100% rename from packages/core/src/components/async-error-state/async-error-state.tsx rename to packages/core/src/components/internals/async-error-state/async-error-state.tsx diff --git a/packages/core/src/components/async-error-state/index.ts b/packages/core/src/components/internals/async-error-state/index.ts similarity index 100% rename from packages/core/src/components/async-error-state/index.ts rename to packages/core/src/components/internals/async-error-state/index.ts diff --git a/packages/core/src/components/breadcrumb/breadcrumb.tsx b/packages/core/src/components/internals/breadcrumb/breadcrumb.tsx similarity index 100% rename from packages/core/src/components/breadcrumb/breadcrumb.tsx rename to packages/core/src/components/internals/breadcrumb/breadcrumb.tsx diff --git a/packages/core/src/components/breadcrumb/index.ts b/packages/core/src/components/internals/breadcrumb/index.ts similarity index 100% rename from packages/core/src/components/breadcrumb/index.ts rename to packages/core/src/components/internals/breadcrumb/index.ts diff --git a/packages/core/src/components/content/content.tsx b/packages/core/src/components/internals/content/content.tsx similarity index 98% rename from packages/core/src/components/content/content.tsx rename to packages/core/src/components/internals/content/content.tsx index 6257d69b..e6b29139 100644 --- a/packages/core/src/components/content/content.tsx +++ b/packages/core/src/components/internals/content/content.tsx @@ -1,6 +1,6 @@ import { NavLink, Outlet } from "react-router"; import { useAppShell } from "@/contexts/appshell-context"; -import { Button } from "../button"; +import { Button } from "../../button"; import { Toaster } from "../sonner"; import { useT } from "@/i18n-labels"; import { useTitleResolver } from "@/hooks/i18n"; diff --git a/packages/core/src/components/content/index.ts b/packages/core/src/components/internals/content/index.ts similarity index 100% rename from packages/core/src/components/content/index.ts rename to packages/core/src/components/internals/content/index.ts diff --git a/packages/core/src/components/default-error-boundary/default-error-boundary.tsx b/packages/core/src/components/internals/default-error-boundary/default-error-boundary.tsx similarity index 98% rename from packages/core/src/components/default-error-boundary/default-error-boundary.tsx rename to packages/core/src/components/internals/default-error-boundary/default-error-boundary.tsx index ab250ab1..9f1d49f4 100644 --- a/packages/core/src/components/default-error-boundary/default-error-boundary.tsx +++ b/packages/core/src/components/internals/default-error-boundary/default-error-boundary.tsx @@ -1,5 +1,5 @@ import { useRouteError, isRouteErrorResponse } from "react-router"; -import { Button } from "../button"; +import { Button } from "../../button"; import { AlertCircle } from "lucide-react"; import { useT } from "@/i18n-labels"; diff --git a/packages/core/src/components/default-error-boundary/index.ts b/packages/core/src/components/internals/default-error-boundary/index.ts similarity index 100% rename from packages/core/src/components/default-error-boundary/index.ts rename to packages/core/src/components/internals/default-error-boundary/index.ts diff --git a/packages/core/src/components/document-head/document-head.test.tsx b/packages/core/src/components/internals/document-head/document-head.test.tsx similarity index 100% rename from packages/core/src/components/document-head/document-head.test.tsx rename to packages/core/src/components/internals/document-head/document-head.test.tsx diff --git a/packages/core/src/components/document-head/document-head.tsx b/packages/core/src/components/internals/document-head/document-head.tsx similarity index 98% rename from packages/core/src/components/document-head/document-head.tsx rename to packages/core/src/components/internals/document-head/document-head.tsx index b206ca04..f2fbf62f 100644 --- a/packages/core/src/components/document-head/document-head.tsx +++ b/packages/core/src/components/internals/document-head/document-head.tsx @@ -1,6 +1,6 @@ import { useAppShellConfig } from "@/contexts/appshell-context"; import { useBreadcrumbOverrideOptional } from "@/contexts/breadcrumb-context"; -import { usePathSegments } from "@/components/dynamic-breadcrumb"; +import { usePathSegments } from "../dynamic-breadcrumb"; import { DEFAULT_FAVICONS, type FaviconLink } from "@/lib/default-favicon"; const SEPARATOR = " · "; diff --git a/packages/core/src/components/document-head/index.ts b/packages/core/src/components/internals/document-head/index.ts similarity index 100% rename from packages/core/src/components/document-head/index.ts rename to packages/core/src/components/internals/document-head/index.ts diff --git a/packages/core/src/components/dynamic-breadcrumb/dynamic-breadcrumb.tsx b/packages/core/src/components/internals/dynamic-breadcrumb/dynamic-breadcrumb.tsx similarity index 98% rename from packages/core/src/components/dynamic-breadcrumb/dynamic-breadcrumb.tsx rename to packages/core/src/components/internals/dynamic-breadcrumb/dynamic-breadcrumb.tsx index 66563f18..2060a6f6 100644 --- a/packages/core/src/components/dynamic-breadcrumb/dynamic-breadcrumb.tsx +++ b/packages/core/src/components/internals/dynamic-breadcrumb/dynamic-breadcrumb.tsx @@ -7,7 +7,7 @@ import { BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, -} from "@/components/breadcrumb"; +} from "../breadcrumb"; import { processPathSegments } from "@/routing/path"; import { useBreadcrumbOverride } from "@/contexts/breadcrumb-context"; import { useT } from "@/i18n-labels"; diff --git a/packages/core/src/components/dynamic-breadcrumb/index.ts b/packages/core/src/components/internals/dynamic-breadcrumb/index.ts similarity index 100% rename from packages/core/src/components/dynamic-breadcrumb/index.ts rename to packages/core/src/components/internals/dynamic-breadcrumb/index.ts diff --git a/packages/core/src/components/separator/index.ts b/packages/core/src/components/internals/separator/index.ts similarity index 100% rename from packages/core/src/components/separator/index.ts rename to packages/core/src/components/internals/separator/index.ts diff --git a/packages/core/src/components/separator/separator.test.tsx b/packages/core/src/components/internals/separator/separator.test.tsx similarity index 100% rename from packages/core/src/components/separator/separator.test.tsx rename to packages/core/src/components/internals/separator/separator.test.tsx diff --git a/packages/core/src/components/separator/separator.tsx b/packages/core/src/components/internals/separator/separator.tsx similarity index 100% rename from packages/core/src/components/separator/separator.tsx rename to packages/core/src/components/internals/separator/separator.tsx diff --git a/packages/core/src/components/sonner/index.ts b/packages/core/src/components/internals/sonner/index.ts similarity index 100% rename from packages/core/src/components/sonner/index.ts rename to packages/core/src/components/internals/sonner/index.ts diff --git a/packages/core/src/components/sonner/sonner.tsx b/packages/core/src/components/internals/sonner/sonner.tsx similarity index 100% rename from packages/core/src/components/sonner/sonner.tsx rename to packages/core/src/components/internals/sonner/sonner.tsx diff --git a/packages/core/src/components/select/select-standalone.test.tsx b/packages/core/src/components/select/select-standalone.test.tsx index 838ab5f1..fba92c11 100644 --- a/packages/core/src/components/select/select-standalone.test.tsx +++ b/packages/core/src/components/select/select-standalone.test.tsx @@ -1,8 +1,8 @@ import { afterEach, describe, expect, it, vi } from "vitest"; import { cleanup, render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { renderRHFForm } from "../../tests/rhf-test-utils"; -import { Field } from "./field"; +import { renderRHFForm } from "../../../tests/rhf-test-utils"; +import { Field } from "../field"; import { Select } from "./select-standalone"; afterEach(() => { diff --git a/packages/core/src/components/select/select-standalone.tsx b/packages/core/src/components/select/select-standalone.tsx index 19224950..6ff5945e 100644 --- a/packages/core/src/components/select/select-standalone.tsx +++ b/packages/core/src/components/select/select-standalone.tsx @@ -12,7 +12,7 @@ import { } from "./select"; import { defaultMapItem, isGroupedItems } from "../dropdown-items"; import type { MappedItem, ItemGroup, ExtractItem } from "../dropdown-items"; -import { AsyncErrorState, resolveAsyncContent } from "../async-error-state"; +import { AsyncErrorState, resolveAsyncContent } from "../internals/async-error-state"; /** * Fetcher type for `Select.Async`. diff --git a/packages/core/src/components/sidebar/default-header.tsx b/packages/core/src/components/sidebar/default-header.tsx index 9897f5c8..eda741f1 100644 --- a/packages/core/src/components/sidebar/default-header.tsx +++ b/packages/core/src/components/sidebar/default-header.tsx @@ -1,6 +1,6 @@ import { SidebarTrigger, useSidebar } from "./primitives"; import { AppearanceSwitcher } from "@/components/appearance-switcher"; -import { DynamicBreadcrumb } from "@/components/dynamic-breadcrumb"; +import { DynamicBreadcrumb } from "@/components/internals/dynamic-breadcrumb"; const HidableSidebarTrigger = () => { const { open, isIconMode, collapsible } = useSidebar(); diff --git a/packages/core/src/components/sidebar/default-sidebar.test.tsx b/packages/core/src/components/sidebar/default-sidebar.test.tsx index f653e3fb..9202d66f 100644 --- a/packages/core/src/components/sidebar/default-sidebar.test.tsx +++ b/packages/core/src/components/sidebar/default-sidebar.test.tsx @@ -13,7 +13,7 @@ import { SidebarSeparator } from "./sidebar-separator"; import { defineModule, defineResource } from "@/resource"; import { AppShell } from "@/components/appshell"; import { Home, Package } from "lucide-react"; -import { DefaultErrorBoundary } from "@/components/default-error-boundary"; +import { DefaultErrorBoundary } from "@/components/internals/default-error-boundary"; const mockNavigatorPlatform = (platform: string) => vi.spyOn(window.navigator, "platform", "get").mockReturnValue(platform); diff --git a/packages/core/src/components/sidebar/primitives.tsx b/packages/core/src/components/sidebar/primitives.tsx index 86d5e6d4..b6d3a0ed 100644 --- a/packages/core/src/components/sidebar/primitives.tsx +++ b/packages/core/src/components/sidebar/primitives.tsx @@ -8,7 +8,7 @@ import { useIsTablet } from "@/hooks/use-tablet"; import { cn } from "@/lib/utils"; import { Button } from "@/components/button"; import { Input } from "@/components/input"; -import { Separator } from "@/components/separator"; +import { Separator } from "@/components/internals/separator"; import { Sheet } from "@/components/sheet"; import { Tooltip } from "@/components/tooltip"; diff --git a/packages/core/src/components/sidebar/sidebar-layout.tsx b/packages/core/src/components/sidebar/sidebar-layout.tsx index 9ecdc68d..f40de8cc 100644 --- a/packages/core/src/components/sidebar/sidebar-layout.tsx +++ b/packages/core/src/components/sidebar/sidebar-layout.tsx @@ -1,6 +1,6 @@ import { useRef, type RefObject } from "react"; import { SidebarProvider, SidebarInset } from "./primitives"; -import { AppShellOutlet } from "@/components/content"; +import { AppShellOutlet } from "@/components/internals/content"; import { AppShellScrollContainerProvider } from "@/contexts/scroll-container-context"; import { DefaultSidebar } from "./default-sidebar"; import { DefaultHeader } from "./default-header"; diff --git a/packages/core/src/components/sidebar/sidebar.test.tsx b/packages/core/src/components/sidebar/sidebar.test.tsx index c56351df..3d6a6350 100644 --- a/packages/core/src/components/sidebar/sidebar.test.tsx +++ b/packages/core/src/components/sidebar/sidebar.test.tsx @@ -20,7 +20,7 @@ import { SidebarGroup } from "./sidebar-group"; import { SidebarSeparator } from "./sidebar-separator"; import { defineModule, defineResource } from "@/resource"; import { Home, Package } from "lucide-react"; -import { DefaultErrorBoundary } from "@/components/default-error-boundary"; +import { DefaultErrorBoundary } from "@/components/internals/default-error-boundary"; import { Link } from "react-router"; afterEach(() => { diff --git a/packages/core/src/components/with-guard/with-guard.test.tsx b/packages/core/src/components/with-guard/with-guard.test.tsx index 34e995e0..5f1159e3 100644 --- a/packages/core/src/components/with-guard/with-guard.test.tsx +++ b/packages/core/src/components/with-guard/with-guard.test.tsx @@ -7,7 +7,7 @@ import { type RootConfiguration, } from "@/contexts/appshell-context"; import { pass, hidden, redirectTo, type Guard } from "@/resource"; -import { DefaultErrorBoundary } from "@/components/default-error-boundary"; +import { DefaultErrorBoundary } from "@/components/internals/default-error-boundary"; afterEach(() => { cleanup(); diff --git a/packages/core/src/contexts/appshell-context.tsx b/packages/core/src/contexts/appshell-context.tsx index e1141539..e8e9b0ce 100644 --- a/packages/core/src/contexts/appshell-context.tsx +++ b/packages/core/src/contexts/appshell-context.tsx @@ -1,6 +1,6 @@ import { ErrorBoundaryComponent, Modules, Resource } from "@/resource"; import { createContext, useContext, type ReactNode } from "react"; -import { DefaultErrorBoundary } from "@/components/default-error-boundary"; +import { DefaultErrorBoundary } from "@/components/internals/default-error-boundary"; import { DEFAULT_LOCALE, detectBrowserLocale, diff --git a/packages/core/src/fs-routes/converter.tsx b/packages/core/src/fs-routes/converter.tsx index 88fb8a67..820a6f82 100644 --- a/packages/core/src/fs-routes/converter.tsx +++ b/packages/core/src/fs-routes/converter.tsx @@ -1,7 +1,7 @@ import { parsePath } from "@tailor-platform/app-shell-vite-plugin/parser"; import type { Module, Resource, Guard } from "@/resource"; import { withGuardsLoader, titleFromPath } from "@/resource"; -import { DefaultErrorBoundary } from "@/components/default-error-boundary"; +import { DefaultErrorBoundary } from "@/components/internals/default-error-boundary"; import type { LocalizedString } from "@/lib/i18n"; import type { PageEntry, PageComponent } from "./types"; diff --git a/packages/core/src/hooks/use-page-meta.test.tsx b/packages/core/src/hooks/use-page-meta.test.tsx index d2b862fa..07803d1a 100644 --- a/packages/core/src/hooks/use-page-meta.test.tsx +++ b/packages/core/src/hooks/use-page-meta.test.tsx @@ -5,7 +5,7 @@ import { AppShellConfigContext, type RootConfiguration } from "@/contexts/appshe import { usePageMeta } from "./use-page-meta"; import { defineModule, defineResource } from "@/resource"; import { Folder, Home, Settings, ShoppingCart } from "lucide-react"; -import { DefaultErrorBoundary } from "@/components/default-error-boundary"; +import { DefaultErrorBoundary } from "@/components/internals/default-error-boundary"; const createTestModules = () => [ defineModule({ diff --git a/packages/core/src/resource.tsx b/packages/core/src/resource.tsx index 05f2c618..a0cb64a3 100644 --- a/packages/core/src/resource.tsx +++ b/packages/core/src/resource.tsx @@ -1,6 +1,6 @@ import { ReactNode } from "react"; import { capitalCase } from "change-case"; -import { DefaultErrorBoundary } from "./components/default-error-boundary"; +import { DefaultErrorBoundary } from "./components/internals/default-error-boundary"; import { useAppShellConfig, type ContextData } from "./contexts/appshell-context"; import { buildLocaleResolver, type LocalizedString } from "./lib/i18n"; import { labels } from "./i18n-labels"; diff --git a/packages/core/src/routing/router.tsx b/packages/core/src/routing/router.tsx index ef039df9..ece1b3dc 100644 --- a/packages/core/src/routing/router.tsx +++ b/packages/core/src/routing/router.tsx @@ -5,7 +5,7 @@ import type { RouteObject } from "react-router"; import { createContentRoutes, wrapErrorBoundary } from "./routes"; import { useAppShellConfig, type RootConfiguration } from "@/contexts/appshell-context"; import { createNavItemsLoader } from "@/routing/navigation"; -import { DocumentHead } from "@/components/document-head"; +import { DocumentHead } from "@/components/internals/document-head"; // ============================================================================ // Root Route diff --git a/packages/core/src/routing/routes.test.tsx b/packages/core/src/routing/routes.test.tsx index 796fc922..d1c44306 100644 --- a/packages/core/src/routing/routes.test.tsx +++ b/packages/core/src/routing/routes.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it, assert } from "vitest"; import { createContentRoutes } from "./routes"; -import { EmptyOutlet, SettingsWrapper } from "@/components/content"; +import { EmptyOutlet, SettingsWrapper } from "@/components/internals/content"; import { defineModule, defineResource, pass, redirectTo, hidden } from "@/resource"; const createMockResource = (path: string) => diff --git a/packages/core/src/routing/routes.tsx b/packages/core/src/routing/routes.tsx index 820408d4..d0c5bb3d 100644 --- a/packages/core/src/routing/routes.tsx +++ b/packages/core/src/routing/routes.tsx @@ -1,8 +1,8 @@ import type { ComponentType, ReactNode } from "react"; import { RouteObject, Navigate } from "react-router"; -import { AppInfoPage, APP_INFO_SLUG } from "@/components/app-info"; -import { EmptyOutlet, SettingsWrapper } from "@/components/content"; -import { DefaultErrorBoundary } from "@/components/default-error-boundary"; +import { AppInfoPage, APP_INFO_SLUG } from "@/components/internals/app-info"; +import { EmptyOutlet, SettingsWrapper } from "@/components/internals/content"; +import { DefaultErrorBoundary } from "@/components/internals/default-error-boundary"; import { Modules, Resource, From fd509bd8242e892275fa696790d40637e2efef73 Mon Sep 17 00:00:00 2001 From: IzumiSy Date: Fri, 21 Aug 2026 16:46:20 +0900 Subject: [PATCH 4/5] Move routing and sidebar internals to owning modules --- packages/core/src/components/internals/content/index.ts | 1 - packages/core/src/components/internals/document-head/index.ts | 1 - .../core/src/components/internals/dynamic-breadcrumb/index.ts | 1 - packages/core/src/components/sidebar/default-header.tsx | 2 +- .../dynamic-breadcrumb => sidebar}/dynamic-breadcrumb.tsx | 2 +- packages/core/src/components/sidebar/sidebar-layout.tsx | 2 +- .../src/{components/internals/content => routing}/content.tsx | 4 ++-- .../document-head => routing}/document-head.test.tsx | 0 .../internals/document-head => routing}/document-head.tsx | 2 +- packages/core/src/routing/router.tsx | 2 +- packages/core/src/routing/routes.test.tsx | 2 +- packages/core/src/routing/routes.tsx | 2 +- 12 files changed, 9 insertions(+), 12 deletions(-) delete mode 100644 packages/core/src/components/internals/content/index.ts delete mode 100644 packages/core/src/components/internals/document-head/index.ts delete mode 100644 packages/core/src/components/internals/dynamic-breadcrumb/index.ts rename packages/core/src/components/{internals/dynamic-breadcrumb => sidebar}/dynamic-breadcrumb.tsx (98%) rename packages/core/src/{components/internals/content => routing}/content.tsx (95%) rename packages/core/src/{components/internals/document-head => routing}/document-head.test.tsx (100%) rename packages/core/src/{components/internals/document-head => routing}/document-head.tsx (98%) diff --git a/packages/core/src/components/internals/content/index.ts b/packages/core/src/components/internals/content/index.ts deleted file mode 100644 index eb30f0f5..00000000 --- a/packages/core/src/components/internals/content/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./content"; diff --git a/packages/core/src/components/internals/document-head/index.ts b/packages/core/src/components/internals/document-head/index.ts deleted file mode 100644 index c5eba60a..00000000 --- a/packages/core/src/components/internals/document-head/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./document-head"; diff --git a/packages/core/src/components/internals/dynamic-breadcrumb/index.ts b/packages/core/src/components/internals/dynamic-breadcrumb/index.ts deleted file mode 100644 index 76fd90bc..00000000 --- a/packages/core/src/components/internals/dynamic-breadcrumb/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./dynamic-breadcrumb"; diff --git a/packages/core/src/components/sidebar/default-header.tsx b/packages/core/src/components/sidebar/default-header.tsx index eda741f1..37e7a65c 100644 --- a/packages/core/src/components/sidebar/default-header.tsx +++ b/packages/core/src/components/sidebar/default-header.tsx @@ -1,6 +1,6 @@ import { SidebarTrigger, useSidebar } from "./primitives"; import { AppearanceSwitcher } from "@/components/appearance-switcher"; -import { DynamicBreadcrumb } from "@/components/internals/dynamic-breadcrumb"; +import { DynamicBreadcrumb } from "./dynamic-breadcrumb"; const HidableSidebarTrigger = () => { const { open, isIconMode, collapsible } = useSidebar(); diff --git a/packages/core/src/components/internals/dynamic-breadcrumb/dynamic-breadcrumb.tsx b/packages/core/src/components/sidebar/dynamic-breadcrumb.tsx similarity index 98% rename from packages/core/src/components/internals/dynamic-breadcrumb/dynamic-breadcrumb.tsx rename to packages/core/src/components/sidebar/dynamic-breadcrumb.tsx index 2060a6f6..b458e039 100644 --- a/packages/core/src/components/internals/dynamic-breadcrumb/dynamic-breadcrumb.tsx +++ b/packages/core/src/components/sidebar/dynamic-breadcrumb.tsx @@ -7,7 +7,7 @@ import { BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, -} from "../breadcrumb"; +} from "../internals/breadcrumb"; import { processPathSegments } from "@/routing/path"; import { useBreadcrumbOverride } from "@/contexts/breadcrumb-context"; import { useT } from "@/i18n-labels"; diff --git a/packages/core/src/components/sidebar/sidebar-layout.tsx b/packages/core/src/components/sidebar/sidebar-layout.tsx index f40de8cc..e50ae610 100644 --- a/packages/core/src/components/sidebar/sidebar-layout.tsx +++ b/packages/core/src/components/sidebar/sidebar-layout.tsx @@ -1,6 +1,6 @@ import { useRef, type RefObject } from "react"; import { SidebarProvider, SidebarInset } from "./primitives"; -import { AppShellOutlet } from "@/components/internals/content"; +import { AppShellOutlet } from "@/routing/content"; import { AppShellScrollContainerProvider } from "@/contexts/scroll-container-context"; import { DefaultSidebar } from "./default-sidebar"; import { DefaultHeader } from "./default-header"; diff --git a/packages/core/src/components/internals/content/content.tsx b/packages/core/src/routing/content.tsx similarity index 95% rename from packages/core/src/components/internals/content/content.tsx rename to packages/core/src/routing/content.tsx index e6b29139..fcf86be1 100644 --- a/packages/core/src/components/internals/content/content.tsx +++ b/packages/core/src/routing/content.tsx @@ -1,7 +1,7 @@ import { NavLink, Outlet } from "react-router"; import { useAppShell } from "@/contexts/appshell-context"; -import { Button } from "../../button"; -import { Toaster } from "../sonner"; +import { Button } from "@/components/button"; +import { Toaster } from "@/components/internals/sonner"; import { useT } from "@/i18n-labels"; import { useTitleResolver } from "@/hooks/i18n"; diff --git a/packages/core/src/components/internals/document-head/document-head.test.tsx b/packages/core/src/routing/document-head.test.tsx similarity index 100% rename from packages/core/src/components/internals/document-head/document-head.test.tsx rename to packages/core/src/routing/document-head.test.tsx diff --git a/packages/core/src/components/internals/document-head/document-head.tsx b/packages/core/src/routing/document-head.tsx similarity index 98% rename from packages/core/src/components/internals/document-head/document-head.tsx rename to packages/core/src/routing/document-head.tsx index f2fbf62f..dc5cef0d 100644 --- a/packages/core/src/components/internals/document-head/document-head.tsx +++ b/packages/core/src/routing/document-head.tsx @@ -1,6 +1,6 @@ import { useAppShellConfig } from "@/contexts/appshell-context"; import { useBreadcrumbOverrideOptional } from "@/contexts/breadcrumb-context"; -import { usePathSegments } from "../dynamic-breadcrumb"; +import { usePathSegments } from "@/components/sidebar/dynamic-breadcrumb"; import { DEFAULT_FAVICONS, type FaviconLink } from "@/lib/default-favicon"; const SEPARATOR = " · "; diff --git a/packages/core/src/routing/router.tsx b/packages/core/src/routing/router.tsx index ece1b3dc..58c19999 100644 --- a/packages/core/src/routing/router.tsx +++ b/packages/core/src/routing/router.tsx @@ -5,7 +5,7 @@ import type { RouteObject } from "react-router"; import { createContentRoutes, wrapErrorBoundary } from "./routes"; import { useAppShellConfig, type RootConfiguration } from "@/contexts/appshell-context"; import { createNavItemsLoader } from "@/routing/navigation"; -import { DocumentHead } from "@/components/internals/document-head"; +import { DocumentHead } from "./document-head"; // ============================================================================ // Root Route diff --git a/packages/core/src/routing/routes.test.tsx b/packages/core/src/routing/routes.test.tsx index d1c44306..fd88db80 100644 --- a/packages/core/src/routing/routes.test.tsx +++ b/packages/core/src/routing/routes.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it, assert } from "vitest"; import { createContentRoutes } from "./routes"; -import { EmptyOutlet, SettingsWrapper } from "@/components/internals/content"; +import { EmptyOutlet, SettingsWrapper } from "./content"; import { defineModule, defineResource, pass, redirectTo, hidden } from "@/resource"; const createMockResource = (path: string) => diff --git a/packages/core/src/routing/routes.tsx b/packages/core/src/routing/routes.tsx index d0c5bb3d..c8d987c8 100644 --- a/packages/core/src/routing/routes.tsx +++ b/packages/core/src/routing/routes.tsx @@ -1,7 +1,7 @@ import type { ComponentType, ReactNode } from "react"; import { RouteObject, Navigate } from "react-router"; import { AppInfoPage, APP_INFO_SLUG } from "@/components/internals/app-info"; -import { EmptyOutlet, SettingsWrapper } from "@/components/internals/content"; +import { EmptyOutlet, SettingsWrapper } from "./content"; import { DefaultErrorBoundary } from "@/components/internals/default-error-boundary"; import { Modules, From f5ceaca583317d0cfeafeab1b3bcadb4de7ac048 Mon Sep 17 00:00:00 2001 From: IzumiSy Date: Fri, 21 Aug 2026 16:50:42 +0900 Subject: [PATCH 5/5] Document internals placement guidance --- .agents/references/component-design.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.agents/references/component-design.md b/.agents/references/component-design.md index 0105d56f..346e740d 100644 --- a/.agents/references/component-design.md +++ b/.agents/references/component-design.md @@ -53,6 +53,7 @@ Review whether the shipped contract stays stable and understandable for consumer - consumers should not need repo-only imports or example-only setup for the component to work as documented - JS entrypoints should not pick up CSS side effects unless that contract is explicit - docs, examples, exports, and implementation should tell the same import story +- `components/internals/*` is for internal-only shared UI building blocks; do not re-export those paths from package root or document them as consumer imports --- @@ -64,10 +65,18 @@ Be skeptical when a heavier pattern adds public surface without reducing real co ### Standard filesystem shape -Every component or helper family under `components/` gets its own directory. +Every public component or helper family under `components/` gets its own directory. Implementation size does **not** decide whether something is a file or a directory. The stable entrypoint is always `components//index.ts`. +For internal-only shared UI building blocks that are reused across multiple +component families, use `components/internals//index.ts` instead. +Do not surface those paths from `packages/*/src/index.ts`. + +If a piece has a narrower owner than `components/` — for example routing-owned +UI like document head helpers, or sidebar-owned UI like a dynamic breadcrumb — +keep it with that owner instead of putting it under `components/internals/`. + ```text components/ component-name/