From 6c30e5f1ff087ccf18a83206e63ae44404ed57fc Mon Sep 17 00:00:00 2001 From: Aaron Reisman Date: Tue, 16 Jun 2026 21:11:56 +0700 Subject: [PATCH 1/6] Enable oxfmt sorting + JSDoc formatting Turn on oxfmt's sorting/normalization in the root `vite.config.ts` `fmt` block so `vp check` keeps these consistent automatically: - sortTailwindcss: sort Tailwind classes. `functions: ["cva", "cx"]` (propel writes classes inside those, incl. cva's `class:` key). `stylesheet` points at a new tooling-only Tailwind entry (see below) so base + custom utilities sort canonically. - sortImports: group + sort imports. `sortSideEffects` stays false (default), so CSS side-effect imports like `import "./preview.css"` keep their position. - sortPackageJson: canonical key order for package.json (script order left as-is). - jsdoc: normalize JSDoc/TSDoc blocks (tag aliases, capitalization, wrapping). Add `packages/propel/tailwind.css` as the single tooling Tailwind entry (`@import "tailwindcss"` + propel's tokens). `src/styles/propel.css` deliberately does not import Tailwind (the consumer owns that), so it can't drive a sorter on its own; the tooling entry can. It lives at the package root so the build never publishes it, and `.storybook/preview.css` now imports it too (one source of truth). The rest of the diff is the one-time reformat. Behavior-preserving: `vp check` clean and `vp run -r test` 700/700 across the four themes. --- packages/propel/.storybook/main.ts | 2 +- packages/propel/.storybook/preview.css | 9 +- packages/propel/.storybook/preview.tsx | 1 + .../accordion/accordion.stories.tsx | 30 ++-- .../propel/src/components/accordion/index.tsx | 20 +-- .../avatar-group/avatar-group.stories.tsx | 5 +- .../src/components/avatar-group/index.tsx | 1 + .../src/components/avatar/avatar.stories.tsx | 17 ++- .../propel/src/components/avatar/index.tsx | 10 +- .../src/components/badge/badge.stories.tsx | 5 +- .../propel/src/components/badge/index.tsx | 8 +- .../src/components/banner/banner.stories.tsx | 18 +-- .../propel/src/components/banner/index.tsx | 17 +-- .../breadcrumb/breadcrumb.stories.tsx | 37 +++-- .../src/components/breadcrumb/index.tsx | 63 ++++---- .../src/components/button/button.stories.tsx | 31 ++-- .../propel/src/components/button/index.tsx | 27 ++-- .../components/calendar/calendar.stories.tsx | 31 ++-- .../propel/src/components/calendar/index.tsx | 14 +- .../components/checkbox/checkbox.stories.tsx | 47 +++--- .../propel/src/components/checkbox/index.tsx | 23 ++- .../components/dropdown/dropdown.stories.tsx | 68 ++++----- .../propel/src/components/dropdown/index.tsx | 142 +++++++++--------- .../icon-button/icon-button.stories.tsx | 23 +-- .../src/components/icon-button/index.tsx | 15 +- .../propel/src/components/input/index.tsx | 55 +++---- .../src/components/input/input.stories.tsx | 40 ++--- .../propel/src/components/nav-item/index.tsx | 47 +++--- .../components/nav-item/nav-item.stories.tsx | 19 +-- .../src/components/pagination/index.tsx | 32 ++-- .../pagination/pagination.stories.tsx | 41 ++--- .../propel/src/components/popover/index.tsx | 42 +++--- .../components/popover/popover.stories.tsx | 34 ++--- .../propel/src/components/progress/index.tsx | 12 +- .../components/progress/progress.stories.tsx | 6 +- .../propel/src/components/radio/index.tsx | 18 +-- .../src/components/radio/radio.stories.tsx | 31 ++-- .../src/components/scroll-area/index.tsx | 16 +- .../scroll-area/scroll-area.stories.tsx | 7 +- .../propel/src/components/search/index.tsx | 21 ++- .../src/components/search/search.stories.tsx | 21 ++- .../propel/src/components/switch/index.tsx | 20 +-- .../src/components/switch/switch.stories.tsx | 13 +- packages/propel/src/components/tabs/index.tsx | 36 ++--- .../src/components/tabs/tabs.stories.tsx | 39 +++-- .../propel/src/components/toast/index.tsx | 54 ++++--- .../src/components/toast/toast.stories.tsx | 72 +++++---- .../propel/src/components/toolbar/index.tsx | 89 ++++++----- .../components/toolbar/toolbar.stories.tsx | 28 ++-- .../propel/src/components/tooltip/index.tsx | 54 +++---- .../components/tooltip/tooltip.stories.tsx | 53 ++++--- .../src/components/workspace-avatar/index.tsx | 1 + .../workspace-avatar.stories.tsx | 1 + .../propel/src/internal/loading-button.ts | 9 +- packages/propel/src/internal/node-slot.ts | 2 +- .../propel/src/internal/overlay-panel.tsx | 5 +- packages/propel/src/internal/scrollbar.ts | 2 +- .../propel/src/patterns/comment.stories.tsx | 29 ++-- .../propel/src/storybook/icon-control.tsx | 13 +- packages/propel/tailwind.css | 15 ++ packages/propel/vite.config.ts | 5 +- vite.config.ts | 16 ++ 62 files changed, 838 insertions(+), 824 deletions(-) create mode 100644 packages/propel/tailwind.css diff --git a/packages/propel/.storybook/main.ts b/packages/propel/.storybook/main.ts index 49dd3b4b..5163d9d3 100644 --- a/packages/propel/.storybook/main.ts +++ b/packages/propel/.storybook/main.ts @@ -1,5 +1,5 @@ -import tailwindcss from "@tailwindcss/vite"; import type { StorybookConfig } from "@storybook/react-vite"; +import tailwindcss from "@tailwindcss/vite"; const config: StorybookConfig = { framework: "@storybook/react-vite", diff --git a/packages/propel/.storybook/preview.css b/packages/propel/.storybook/preview.css index 66c6f1f8..bc4cabd7 100644 --- a/packages/propel/.storybook/preview.css +++ b/packages/propel/.storybook/preview.css @@ -1,8 +1,7 @@ -/* Storybook's Tailwind entry: pull in Tailwind, then propel's tokens + styles. - propel.css's `@source "../"` makes Tailwind scan src/ (components + stories), - so the utility classes propel uses are generated for the preview. */ -@import "tailwindcss"; -@import "../src/styles/propel.css"; +/* Storybook's Tailwind entry: the shared tooling entry (Tailwind + propel's tokens). + propel.css's `@source "../"` makes Tailwind scan src/ (components + stories), so + the utility classes propel uses are generated for the preview. */ +@import "../tailwind.css"; /* Make the preview canvas adapt to the active theme so the toolbar toggle is visually meaningful (bg + text follow light/dark/contrast). */ diff --git a/packages/propel/.storybook/preview.tsx b/packages/propel/.storybook/preview.tsx index bcc60225..92d1d769 100644 --- a/packages/propel/.storybook/preview.tsx +++ b/packages/propel/.storybook/preview.tsx @@ -1,6 +1,7 @@ import { DirectionProvider } from "@base-ui/react/direction-provider"; import type { Decorator, Preview } from "@storybook/react-vite"; import { useLayoutEffect } from "react"; + import "./preview.css"; import { type Theme, THEMES } from "./themes"; diff --git a/packages/propel/src/components/accordion/accordion.stories.tsx b/packages/propel/src/components/accordion/accordion.stories.tsx index 5eff34da..00a6411a 100644 --- a/packages/propel/src/components/accordion/accordion.stories.tsx +++ b/packages/propel/src/components/accordion/accordion.stories.tsx @@ -1,6 +1,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { CircleHelp } from "lucide-react"; import { expect } from "storybook/test"; + import { Accordion, AccordionItem, AccordionPanel, AccordionTrigger } from "./index"; // Design-review convention — when to add a pseudo-states "States" story: @@ -87,16 +88,16 @@ export const WithIcon: Story = { }; /** - * The trigger's interaction states side by side. The accordion trigger styles - * interaction purely with CSS utilities (`hover:bg-layer-transparent-hover` and - * `focus-visible:ring-2 focus-visible:ring-accent-strong`), so - * storybook-addon-pseudo-states can force them statically — no real pointer/keyboard. + * The trigger's interaction states side by side. The accordion trigger styles interaction purely + * with CSS utilities (`hover:bg-layer-transparent-hover` and `focus-visible:ring-2 + * focus-visible:ring-accent-strong`), so storybook-addon-pseudo-states can force them statically — + * no real pointer/keyboard. * - * One accordion with a row per state: each trigger `