diff --git a/.agents/references/component-design.md b/.agents/references/component-design.md index 15c7904f..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 --- @@ -62,9 +63,47 @@ 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 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/ + 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"; @@ -94,7 +133,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. @@ -142,26 +181,7 @@ 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` +### 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/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/autocomplete-standalone.test.tsx b/packages/core/src/components/autocomplete/autocomplete-standalone.test.tsx similarity index 99% rename from packages/core/src/components/autocomplete-standalone.test.tsx rename to packages/core/src/components/autocomplete/autocomplete-standalone.test.tsx index d56f870f..08d51ae3 100644 --- a/packages/core/src/components/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-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..f4a6b4c4 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 "../internals/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/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 98% rename from packages/core/src/components/checkbox.test.tsx rename to packages/core/src/components/checkbox/checkbox.test.tsx index a0de8fec..70c8e17e 100644 --- a/packages/core/src/components/checkbox.test.tsx +++ b/packages/core/src/components/checkbox/checkbox.test.tsx @@ -2,9 +2,9 @@ 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"; +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 99% rename from packages/core/src/components/combobox-standalone.test.tsx rename to packages/core/src/components/combobox/combobox-standalone.test.tsx index 4decb597..d807170f 100644 --- a/packages/core/src/components/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-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..085cf3ba 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 "../internals/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..211c1fb9 100644 --- a/packages/core/src/components/command-palette.tsx +++ b/packages/core/src/components/command-palette/command-palette.tsx @@ -1,13 +1,13 @@ 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"; 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/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/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/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/field.test.tsx b/packages/core/src/components/field/field.test.tsx similarity index 99% rename from packages/core/src/components/field.test.tsx rename to packages/core/src/components/field/field.test.tsx index 926ac639..e3ce5aac 100644 --- a/packages/core/src/components/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/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 98% rename from packages/core/src/components/input.test.tsx rename to packages/core/src/components/input/input.test.tsx index a2b024e6..373356ed 100644 --- a/packages/core/src/components/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/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/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.test.tsx rename to packages/core/src/components/internals/app-info/app-info.test.tsx index 67fcb053..0f61b01a 100644 --- a/packages/core/src/components/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.tsx b/packages/core/src/components/internals/app-info/app-info.tsx similarity index 98% rename from packages/core/src/components/app-info.tsx rename to packages/core/src/components/internals/app-info/app-info.tsx index 560ba38e..b85ecbf9 100644 --- a/packages/core/src/components/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/internals/app-info/index.ts b/packages/core/src/components/internals/app-info/index.ts new file mode 100644 index 00000000..6c4b18c4 --- /dev/null +++ b/packages/core/src/components/internals/app-info/index.ts @@ -0,0 +1 @@ +export * from "./app-info"; diff --git a/packages/core/src/components/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.tsx rename to packages/core/src/components/internals/async-error-state/async-error-state.tsx diff --git a/packages/core/src/components/internals/async-error-state/index.ts b/packages/core/src/components/internals/async-error-state/index.ts new file mode 100644 index 00000000..09c1c519 --- /dev/null +++ b/packages/core/src/components/internals/async-error-state/index.ts @@ -0,0 +1 @@ +export * from "./async-error-state"; diff --git a/packages/core/src/components/breadcrumb.tsx b/packages/core/src/components/internals/breadcrumb/breadcrumb.tsx similarity index 100% rename from packages/core/src/components/breadcrumb.tsx rename to packages/core/src/components/internals/breadcrumb/breadcrumb.tsx diff --git a/packages/core/src/components/internals/breadcrumb/index.ts b/packages/core/src/components/internals/breadcrumb/index.ts new file mode 100644 index 00000000..96d5a266 --- /dev/null +++ b/packages/core/src/components/internals/breadcrumb/index.ts @@ -0,0 +1 @@ +export * from "./breadcrumb"; diff --git a/packages/core/src/components/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.tsx rename to packages/core/src/components/internals/default-error-boundary/default-error-boundary.tsx index 53d5f3cc..9f1d49f4 100644 --- a/packages/core/src/components/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/internals/default-error-boundary/index.ts b/packages/core/src/components/internals/default-error-boundary/index.ts new file mode 100644 index 00000000..c033b2a5 --- /dev/null +++ b/packages/core/src/components/internals/default-error-boundary/index.ts @@ -0,0 +1 @@ +export * from "./default-error-boundary"; diff --git a/packages/core/src/components/internals/separator/index.ts b/packages/core/src/components/internals/separator/index.ts new file mode 100644 index 00000000..8cb65e02 --- /dev/null +++ b/packages/core/src/components/internals/separator/index.ts @@ -0,0 +1 @@ +export * from "./separator"; diff --git a/packages/core/src/components/separator.test.tsx b/packages/core/src/components/internals/separator/separator.test.tsx similarity index 100% rename from packages/core/src/components/separator.test.tsx rename to packages/core/src/components/internals/separator/separator.test.tsx diff --git a/packages/core/src/components/separator.tsx b/packages/core/src/components/internals/separator/separator.tsx similarity index 100% rename from packages/core/src/components/separator.tsx rename to packages/core/src/components/internals/separator/separator.tsx diff --git a/packages/core/src/components/internals/sonner/index.ts b/packages/core/src/components/internals/sonner/index.ts new file mode 100644 index 00000000..9e01ee35 --- /dev/null +++ b/packages/core/src/components/internals/sonner/index.ts @@ -0,0 +1 @@ +export * from "./sonner"; diff --git a/packages/core/src/components/sonner.tsx b/packages/core/src/components/internals/sonner/sonner.tsx similarity index 100% rename from packages/core/src/components/sonner.tsx rename to packages/core/src/components/internals/sonner/sonner.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 99% rename from packages/core/src/components/select-standalone.test.tsx rename to packages/core/src/components/select/select-standalone.test.tsx index 838ab5f1..fba92c11 100644 --- a/packages/core/src/components/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-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..6ff5945e 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 "../internals/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/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..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 "@/components/sidebar"; +import { SidebarTrigger, useSidebar } from "./primitives"; import { AppearanceSwitcher } from "@/components/appearance-switcher"; -import { DynamicBreadcrumb } from "@/components/dynamic-breadcrumb"; +import { DynamicBreadcrumb } from "./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 94541c40..9202d66f 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"; @@ -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/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/dynamic-breadcrumb.tsx b/packages/core/src/components/sidebar/dynamic-breadcrumb.tsx similarity index 98% rename from packages/core/src/components/dynamic-breadcrumb.tsx rename to packages/core/src/components/sidebar/dynamic-breadcrumb.tsx index 66563f18..b458e039 100644 --- a/packages/core/src/components/dynamic-breadcrumb.tsx +++ b/packages/core/src/components/sidebar/dynamic-breadcrumb.tsx @@ -7,7 +7,7 @@ import { BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, -} from "@/components/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.tsx b/packages/core/src/components/sidebar/primitives.tsx similarity index 99% rename from packages/core/src/components/sidebar.tsx rename to packages/core/src/components/sidebar/primitives.tsx index 86d5e6d4..b6d3a0ed 100644 --- a/packages/core/src/components/sidebar.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-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..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 "@/components/sidebar"; -import { AppShellOutlet } from "@/components/content"; +import { SidebarProvider, SidebarInset } from "./primitives"; +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/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..3d6a6350 100644 --- a/packages/core/src/components/sidebar/sidebar.test.tsx +++ b/packages/core/src/components/sidebar/sidebar.test.tsx @@ -13,14 +13,14 @@ 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"; 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/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 98% rename from packages/core/src/components/with-guard.test.tsx rename to packages/core/src/components/with-guard/with-guard.test.tsx index 34e995e0..5f1159e3 100644 --- a/packages/core/src/components/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/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/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/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/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/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/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/components/content.tsx b/packages/core/src/routing/content.tsx similarity index 95% rename from packages/core/src/components/content.tsx rename to packages/core/src/routing/content.tsx index ff66b57f..fcf86be1 100644 --- a/packages/core/src/components/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/document-head.test.tsx b/packages/core/src/routing/document-head.test.tsx similarity index 100% rename from packages/core/src/components/document-head.test.tsx rename to packages/core/src/routing/document-head.test.tsx diff --git a/packages/core/src/components/document-head.tsx b/packages/core/src/routing/document-head.tsx similarity index 98% rename from packages/core/src/components/document-head.tsx rename to packages/core/src/routing/document-head.tsx index b206ca04..dc5cef0d 100644 --- a/packages/core/src/components/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 "@/components/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 ef039df9..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/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 796fc922..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/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 820408d4..c8d987c8 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 "./content"; +import { DefaultErrorBoundary } from "@/components/internals/default-error-boundary"; import { Modules, Resource, 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