You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 3748a2d
Browse filesBrowse the repository at this point in the historyBrowse files
| An async action from a button or row: pending, an error, one lock |`usePendingAction` (`src/hooks/`) |
37
-
| A form: values, validation, submit, field errors |`useForm` (`src/components/form/`), with `validateAsync` for a server-side check |
38
-
| A `<form>` element, without the browser's validation popup |`Form` (`src/primitives/form/`) |
39
-
| A model save whose Clerk errors should land on form fields |`save`in the model (`src/utils/errors.ts`), or reject with `FormSubmitError`|
40
-
| A confirm step before an action |`useConfirmController` (`src/blocks/confirm/`) with `Confirmation` (`src/blocks/confirmation/`) |
41
-
| A delete that needs the user to type a phrase |`useConfirmController` (`src/blocks/confirm/`) with `Destructive` (`src/blocks/destructive/`) |
42
-
| An action that may need step-up verification |`useReverificationFlow` (`src/features/reverification/`) in the model, passed to `useConfirmController`|
43
-
| A direct action that needs step-up verification |`useReverificationFlow` in the model, with `ReverificationDialog` (`src/blocks/reverification/`) in the view |
44
-
| Showing any error to the user | One of the owners above. They call `toLocalizableError` and resolve copy with `useErrorText`|
45
-
| Moving focus after a list row is removed |`useListRemovalFocus` (`src/hooks/`) |
46
-
| A debounced, abortable async check as the user types |`useDebouncedAsync` (`src/hooks/`) |
47
-
| A spinner that should not flash or flicker |`useSpinDelay` (`src/hooks/`) |
48
-
| A placeholder for content that is still loading |`Skeleton` (`src/components/skeleton/`), see [Skeletons](docs/skeletons.md)|
49
-
| A date shown to the user |`formatDate` (`src/utils/format-date.ts`) |
50
-
| A value turned into kebab case, e.g. for a `data-*` attribute |`kebabCase` (`src/utils/kebab-case.ts`) |
51
-
| Current time for display labels |`useNow`+ `MosaicProvider` ([#10098](https://github.com/clerk/javascript/pull/10098), once available)|
| An inline message row that animates open and closed |`useHeldMessage`, `useMessageHeight`, `FeedbackBody` (`src/utils/feedback.tsx`) + `styles/feedback.styles.ts`|
54
-
| A table whose sorting, paging and search are done by the server |`useServerDataTable` (`src/hooks/`) |
55
-
| Data read from a Clerk resource that should be cached across mounts | A query hook in `src/queries/`, called from the model (`use-user-sessions-query.ts`)|
56
-
| An item changed in place in an infinite list, kept until the next reload |`replaceInPages` (`src/utils/infinite-pages.ts`), passed to the list's `setData`|
57
-
| Siblings that slide when an item is added or removed |`useLayoutAnimation` (`src/primitives/hooks/`) |
58
-
| An input that reformats as the user types without moving the caret |`useFormattedInput` (`src/primitives/hooks/`) |
59
-
| An interaction with an async lifecycle or two values that move together | A machine in the controller file, via `setup()` (`src/machine/`) |
60
-
| Styles several components share |`src/styles/*.styles.ts`|
| An async action from a button or row: pending, an error, one lock |`usePendingAction` (`src/hooks/`) |
37
+
| A form: values, validation, submit, field errors |`useForm` (`src/components/form/`), with `validateAsync` for a server-side check |
38
+
| A `<form>` element, without the browser's validation popup |`Form` (`src/primitives/form/`) |
39
+
| A model save whose Clerk errors should land on form fields |`save` (`src/utils/errors.ts`) in the model, or reject with `FormSubmitError`|
40
+
| A confirm step before an action |`useConfirmController` (`src/blocks/confirm/`) with `Confirmation` (`src/blocks/confirmation/`) |
41
+
| A delete that needs the user to type a phrase |`useConfirmController` (`src/blocks/confirm/`) with `Destructive` (`src/blocks/destructive/`) |
42
+
| An action that may need step-up verification |`useReverificationFlow` (`src/features/reverification/`) in the model, passed to `useConfirmController`|
43
+
| A direct action that needs step-up verification |`useReverificationFlow` in the model, with `ReverificationDialog` (`src/blocks/reverification/`) in the view |
44
+
| Showing any error to the user | One of the owners above. They call `toLocalizableError` and resolve copy with `useErrorText`|
45
+
| Moving focus after a list row is removed |`useListRemovalFocus` (`src/hooks/`) |
46
+
| A debounced, abortable async check as the user types |`useDebouncedAsync` (`src/hooks/`) |
47
+
| A spinner that should not flash or flicker |`useSpinDelay` (`src/hooks/`) |
48
+
| A placeholder for content that is still loading |`Skeleton` (`src/components/skeleton/`), see [Skeletons](docs/skeletons.md)|
49
+
| A date shown to the user |`formatDate` (`src/utils/format-date.ts`) |
50
+
| A value turned into kebab case, e.g. for a `data-*` attribute |`kebabCase` (`src/utils/kebab-case.ts`) |
51
+
| Current time for display labels |`useNow`(`src/hooks/`) |
| An inline message row that animates open and closed |`useHeldMessage`, `useMessageHeight`, `FeedbackBody` (`src/utils/feedback.tsx`) + `src/styles/feedback.styles.ts`|
54
+
| A table whose sorting, paging and search are done by the server |`useServerDataTable` (`src/hooks/`) |
55
+
| Data read from a Clerk resource that should be cached across mounts | A query hook in `src/queries/`, called from the model (`src/queries/use-user-sessions-query.ts`) |
56
+
| An item changed in place in an infinite list, kept until the next reload |`replaceInPages` (`src/utils/infinite-pages.ts`), passed to the list's `setData`|
57
+
| Siblings that slide when an item is added or removed |`useLayoutAnimation` (`src/primitives/hooks/`) |
58
+
| An input that reformats as the user types without moving the caret |`useFormattedInput` (`src/primitives/hooks/`) |
59
+
| An interaction with an async lifecycle or two values that move together | A machine in the controller file, via `setup()` (`src/machine/`) |
60
+
| Styles several components share |`src/styles/*.styles.ts`|
61
61
62
62
## Signs you are about to invent a pattern
63
63
@@ -96,7 +96,7 @@ A PR that adds, renames or changes the signature of a shared helper in `src/hook
96
96
97
97
## Lint
98
98
99
-
Mosaic runs stricter lint rules than the rest of the repo: the `packages/mosaic` block in the root `eslint.config.mjs`, plus the layer import guards in `packages/mosaic/eslint/config.mjs`, which only load through `packages/mosaic/eslint.config.mjs`. Lint with `pnpm lint` from `packages/mosaic`. Running `eslint` from the repo root skips the import guards.
99
+
Mosaic runs stricter lint rules than the rest of the repo: the `packages/mosaic` block in the root `eslint.config.mjs`, plus the layer boundaries, test rules and effect rules in `packages/mosaic/eslint/config.mjs`, which only load through `packages/mosaic/eslint.config.mjs`. Lint with `pnpm lint` from `packages/mosaic`. Running `eslint` from the repo root skips them.
100
100
101
101
Every disable directive in `src` needs a `-- reason` (`@eslint-community/eslint-comments/require-description`). The reason is not a code comment under the root no-comments rule. Write why the rule does not apply here, not what the code does; it is what a reviewer judges.
0 commit comments