ID registration primitive
This commit is contained in:
parent
bedfa33117
commit
b291ceab50
15
packages/core/src/primitives/create-register-id.ts
Normal file
15
packages/core/src/primitives/create-register-id.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import type { Accessor } from "solid-js";
|
||||
import { createSignal } from "solid-js";
|
||||
|
||||
/**
|
||||
* Creates a reactive slot for an element's ID.
|
||||
* Child parts (e.g. Dialog.Title) call setId on mount and clear it on cleanup.
|
||||
* Parent parts (e.g. Dialog.Content) read getId to set aria-labelledby etc.
|
||||
*/
|
||||
export function createRegisterId(): [
|
||||
Accessor<string | undefined>,
|
||||
(id: string | undefined) => void,
|
||||
] {
|
||||
const [id, setId] = createSignal<string | undefined>(undefined);
|
||||
return [id, setId];
|
||||
}
|
||||
5
packages/core/src/primitives/index.ts
Normal file
5
packages/core/src/primitives/index.ts
Normal file
@ -0,0 +1,5 @@
|
||||
export { createControllableSignal } from "./create-controllable-signal";
|
||||
export type { CreateControllableSignalOptions } from "./create-controllable-signal";
|
||||
export { createDisclosureState } from "./create-disclosure-state";
|
||||
export type { CreateDisclosureStateOptions, DisclosureState } from "./create-disclosure-state";
|
||||
export { createRegisterId } from "./create-register-id";
|
||||
32
packages/core/tests/primitives/create-register-id.test.ts
Normal file
32
packages/core/tests/primitives/create-register-id.test.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import { createRoot } from "solid-js";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { createRegisterId } from "../../src/primitives/create-register-id";
|
||||
|
||||
describe("createRegisterId", () => {
|
||||
it("starts with undefined", () => {
|
||||
createRoot((dispose) => {
|
||||
const [getId] = createRegisterId();
|
||||
expect(getId()).toBeUndefined();
|
||||
dispose();
|
||||
});
|
||||
});
|
||||
|
||||
it("returns registered id after set", () => {
|
||||
createRoot((dispose) => {
|
||||
const [getId, setId] = createRegisterId();
|
||||
setId("my-id");
|
||||
expect(getId()).toBe("my-id");
|
||||
dispose();
|
||||
});
|
||||
});
|
||||
|
||||
it("returns undefined after clearing", () => {
|
||||
createRoot((dispose) => {
|
||||
const [getId, setId] = createRegisterId();
|
||||
setId("my-id");
|
||||
setId(undefined);
|
||||
expect(getId()).toBeUndefined();
|
||||
dispose();
|
||||
});
|
||||
});
|
||||
});
|
||||
Loading…
x
Reference in New Issue
Block a user