diff --git a/README.md b/README.md index 7a9bbf4..1341bbb 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Leverages Svelte's fine-grained reactivity system for optimal performance and sm Components are headless by default, giving you complete control over styling while providing sensible defaults. -### 🎨 **Composable** +### 🧩 **Composable** Build complex UIs by combining simple, reusable components. Each component is designed to work seamlessly with others through the Bond pattern and context API. Create sophisticated features like multi-level dropdowns, nested accordions, or custom form controls by composing atomic components together. @@ -522,23 +522,17 @@ This example demonstrates the power of component composition by combining `Dropd ```bash bun install - # or - npm install ``` 3. **Start development server:** ```bash bun dev - # or - npm run dev ``` 4. **Run Storybook:** ```bash - bun storybook - # or - npm run storybook + bun run storybook:dev ``` ### Building @@ -548,7 +542,7 @@ This example demonstrates the power of component composition by combining `Dropd bun run build # Build Storybook -bun run build-storybook +bun run storybook:build ``` --- diff --git a/package.json b/package.json index c7ad7bf..f87f7f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@svelte-atoms/core", - "version": "1.0.0-alpha.20", + "version": "1.0.0-alpha.21", "description": "A modular, accessible, and extensible Svelte UI component library.", "repository": { "type": "git", diff --git a/src/lib/components/collapsible/bond.svelte.ts b/src/lib/components/collapsible/bond.svelte.ts index 9f015ab..2fc792c 100644 --- a/src/lib/components/collapsible/bond.svelte.ts +++ b/src/lib/components/collapsible/bond.svelte.ts @@ -50,19 +50,31 @@ export class CollapsibleBond extends Bond< } header(props: Record = {}) { + const isDisabled = this.state?.props?.disabled ?? false; + const isOpen = this.state?.props?.open ?? false; + const isButton = this.elements.header instanceof HTMLButtonElement; + return { - 'aria-disabled': this.state?.props?.disabled ?? false, - 'aria-expanded': this.state?.props?.open ?? false, + 'aria-disabled': isDisabled ? 'true' : 'false', + 'aria-expanded': isOpen ? 'true' : 'false', 'aria-controls': `collapsible-body-${this.id}`, - disabled: this.elements.header instanceof HTMLButtonElement ? this.state?.props.disabled : '', - role: this.elements.header instanceof HTMLButtonElement ? undefined : 'button', - tabindex: this.state?.props?.open ? 0 : -1, // Make focusable if open + disabled: isButton ? isDisabled : undefined, + role: isButton ? undefined : 'button', + tabindex: isButton ? undefined : isDisabled ? -1 : 0, id: `collapsible-header-${this.id}`, 'data-atom': this.id ?? '', 'data-kind': 'collapsible-header', ...props, onclick: () => { - this.state.toggle(); + if (!isDisabled) { + this.state.toggle(); + } + }, + onkeydown: (e: KeyboardEvent) => { + if (!isDisabled && (e.key === 'Enter' || e.key === ' ')) { + e.preventDefault(); + this.state.toggle(); + } }, [createAttachmentKey()]: (node: HTMLElement) => { this.elements.header = node; @@ -71,13 +83,15 @@ export class CollapsibleBond extends Bond< } body(props: Record = {}) { + const isOpen = this.state?.props?.open ?? false; + return { 'aria-labelledby': `collapsible-header-${this.id}`, - 'aria-hidden': !this.state?.props?.open, // Hide when closed - role: 'region', // Announce as a region + role: 'region', id: `collapsible-body-${this.id}`, 'data-atom': this.id ?? '', 'data-kind': 'collapsible-body', + inert: isOpen ? undefined : true, ...props, [createAttachmentKey()]: (node: HTMLElement) => { this.elements.body = node; diff --git a/src/lib/components/collapsible/collapsible-root.svelte b/src/lib/components/collapsible/collapsible-root.svelte index f9137e2..1ea283f 100644 --- a/src/lib/components/collapsible/collapsible-root.svelte +++ b/src/lib/components/collapsible/collapsible-root.svelte @@ -30,7 +30,6 @@ value = nanoid(), data = undefined, disabled = false, - as = 'div' as E, factory = _factory, children = undefined, onmount = undefined, @@ -71,16 +70,15 @@ {@render children?.({ collapsible: bond })} diff --git a/src/lib/components/collapsible/collapsible.stories.svelte b/src/lib/components/collapsible/collapsible.stories.svelte index b8977b8..f06ce9c 100644 --- a/src/lib/components/collapsible/collapsible.stories.svelte +++ b/src/lib/components/collapsible/collapsible.stories.svelte @@ -1,11 +1,9 @@