Skip to content

Commit

Permalink
fix(Checkbox): requiring CheckboxGroup pulling out Label and Descript…
Browse files Browse the repository at this point in the history
…ion for slots instead of properties. Pulling out checkbox classes so they can be overridden
  • Loading branch information
Craig Howell committed Oct 1, 2022
1 parent a9f0997 commit eea49e0
Show file tree
Hide file tree
Showing 6 changed files with 174 additions and 94 deletions.
55 changes: 25 additions & 30 deletions src/lib/components/checkbox/Checkbox.svelte
Original file line number Diff line number Diff line change
@@ -1,44 +1,39 @@
<script lang="ts" context="module">
export const CHECKBOX_GROUP_CHECKBOX_CONTEXT_ID = 'checkbox-group-checkbox-context-id';
</script>

<script lang="ts">
import { getContext } from 'svelte';
import { useContext } from '$lib/utils/useContext';
import { setContext } from 'svelte';
import { twMerge } from 'tailwind-merge';
import { CHECKBOX_GROUP_CONTEXT_ID } from './CheckboxGroup.svelte';
export let name: string;
export let value: string;
export let label: string;
export let description: string | undefined = undefined;
const context: { checkbox: boolean; inline: boolean } = getContext(CHECKBOX_GROUP_CONTEXT_ID);
useContext({
context_id: CHECKBOX_GROUP_CONTEXT_ID,
parent: 'CheckboxGroup',
component: 'CheckboxGroup.Checkbox'
});
setContext(CHECKBOX_GROUP_CHECKBOX_CONTEXT_ID, {
checkbox: true,
name
});
const defaultClass =
'checkbox checked:bg-primary dark:checked:bg-primary hover:border-primary dark:hover:border-primary bg-light-surface dark:bg-dark-surface h-6 w-6 text-primary light-border-base dark:dark-border-base rounded-md cursor-pointer transition-all duration-150';
const finalClass = twMerge(defaultClass, $$props.class);
</script>

<div class="relative flex items-start">
<div class="flex items-center h-5">
<input
id={name}
{name}
type="checkbox"
{value}
class="checkbox checked:bg-primary dark:checked:bg-primary hover:border-primary dark:hover:border-primary bg-light-surface dark:bg-dark-surface h-6 w-6 text-primary light-border-base dark:dark-border-base rounded-md cursor-pointer transition-all duration-150"
/>
<input id={name} {name} type="checkbox" {value} class={finalClass} style={$$props.style} />
</div>
<div class="ml-3 text-sm">
<label
for={name}
class="font-medium text-light-content dark:text-dark-content cursor-pointer transition-all duration-150"
>{label}</label
>
{#if description && context && !context.inline}
<p
id="{name}-description"
class="text-light-secondary-content dark:text-dark-secondary-content transition-all duration-150"
>
{description}
</p>
{:else if description}
<span
id="{name}-description"
class="text-light-secondary-content dark:text-dark-secondary-content transition-all duration-150"
><span class="sr-only">{label} </span> | {description}</span
>
{/if}
<slot name="label" />
<slot name="description" />
</div>
</div>

Expand Down
34 changes: 34 additions & 0 deletions src/lib/components/checkbox/Description.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<script lang="ts">
import { twMerge } from 'tailwind-merge';
import { CHECKBOX_GROUP_CONTEXT_ID } from './CheckboxGroup.svelte';
import { CHECKBOX_GROUP_CHECKBOX_CONTEXT_ID } from './Checkbox.svelte';
import { useContext } from '../../utils/useContext';
import { getContext } from 'svelte';
useContext({
context_id: CHECKBOX_GROUP_CONTEXT_ID,
parent: 'CheckboxGroup',
component: 'CheckboxGroup.Checkbox.Label'
});
useContext({
context_id: CHECKBOX_GROUP_CHECKBOX_CONTEXT_ID,
parent: 'CheckboxGroup.Checkbox',
component: 'CheckboxGroup.Checkbox.Label'
});
const { inline }: { inline: boolean } = getContext(CHECKBOX_GROUP_CONTEXT_ID);
const { name }: { name: string } = getContext(CHECKBOX_GROUP_CHECKBOX_CONTEXT_ID);
const defaultClass =
'text-light-secondary-content dark:text-dark-secondary-content transition-all duration-150';
const finalClass = twMerge(defaultClass, $$props.class);
</script>

{#if inline}
<span id="{name}-description" class={finalClass} style={$$props.style}> | <slot /></span>
{:else}
<p id="{name}-description" class={finalClass} style={$$props.style}>
<slot />
</p>
{/if}
9 changes: 9 additions & 0 deletions src/lib/components/checkbox/GroupLabel.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<script lang="ts">
import { twMerge } from 'tailwind-merge';
const defaultClass =
'transition-all duration-150 text-light-secondary-content dark:text-dark-secondary-content font-medium text-sm';
const finalClass = twMerge(defaultClass, $$props.class);
</script>

<legend class={finalClass} style={$$props.style}><slot />></legend>
22 changes: 20 additions & 2 deletions src/lib/components/checkbox/Label.svelte
Original file line number Diff line number Diff line change
@@ -1,9 +1,27 @@
<script lang="ts">
import { twMerge } from 'tailwind-merge';
import { CHECKBOX_GROUP_CONTEXT_ID } from './CheckboxGroup.svelte';
import { useContext } from '../../utils/useContext';
import { getContext } from 'svelte';
import { CHECKBOX_GROUP_CHECKBOX_CONTEXT_ID } from './Checkbox.svelte';
useContext({
context_id: CHECKBOX_GROUP_CONTEXT_ID,
parent: 'CheckboxGroup',
component: 'CheckboxGroup.Checkbox.Label'
});
useContext({
context_id: CHECKBOX_GROUP_CHECKBOX_CONTEXT_ID,
parent: 'CheckboxGroup.Checkbox',
component: 'CheckboxGroup.Checkbox.Label'
});
const { name }: { name: string } = getContext(CHECKBOX_GROUP_CHECKBOX_CONTEXT_ID);
const defaultClass =
'transition-all duration-150 text-light-secondary-content dark:text-dark-secondary-content font-medium text-sm';
'font-medium text-light-content dark:text-dark-content cursor-pointer transition-all duration-150';
const finalClass = twMerge(defaultClass, $$props.class);
</script>

<legend class={finalClass} style={$$props.style}><slot />></legend>
<label for={name} class={finalClass} style={$$props.style}><slot /></label>
18 changes: 14 additions & 4 deletions src/lib/components/checkbox/index.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
import OriginalCheckboxGroup from './CheckboxGroup.svelte';
import GroupLabel from './GroupLabel.svelte';
import OriginalCheckbox from './Checkbox.svelte';
import Label from './Label.svelte';
import Checkbox from './Checkbox.svelte';
import Description from './Description.svelte';

const CheckboxGroup = OriginalCheckboxGroup as CheckboxGroupStatic;
CheckboxGroup.Label = Label;
CheckboxGroup.Checkbox = Checkbox;
CheckboxGroup.Label = GroupLabel;
CheckboxGroup.Checkbox = OriginalCheckbox as CheckboxStatic;
CheckboxGroup.Checkbox.Label = Label;
CheckboxGroup.Checkbox.Description = Description;

export default CheckboxGroup;

export interface CheckboxGroupStatic {
new (...args: ConstructorParameters<typeof OriginalCheckboxGroup>): OriginalCheckboxGroup;
Label: typeof GroupLabel;
Checkbox: CheckboxStatic;
}

export interface CheckboxStatic {
new (...args: ConstructorParameters<typeof OriginalCheckbox>): OriginalCheckbox;
Label: typeof Label;
Checkbox: typeof Checkbox;
Description: typeof Description;
}
130 changes: 72 additions & 58 deletions src/routes/checkbox/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -7,77 +7,91 @@
<Card.Header slot="header">Checkbox</Card.Header>
<Card.Content slot="content" class="p-4">
<CheckboxGroup>
<CheckboxGroup.Checkbox label="Checkbox-1" name="cb-1" value="cb-1" />
<CheckboxGroup.Checkbox label="Checkbox-2" name="cb-2" value="cb-2" />
<CheckboxGroup.Checkbox label="Checkbox-3" name="cb-3" value="cb-3" />
<CheckboxGroup.Checkbox label="Checkbox-4" name="cb-4" value="cb-4" />
<CheckboxGroup.Checkbox name="cb-1" value="cb-1">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-1</CheckboxGroup.Checkbox.Label>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-2" value="cb-2">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-2</CheckboxGroup.Checkbox.Label>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-3" value="cb-3">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-3</CheckboxGroup.Checkbox.Label>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-4" value="cb-4">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-4</CheckboxGroup.Checkbox.Label>
</CheckboxGroup.Checkbox>
</CheckboxGroup>
<br />
<CheckboxGroup>
<CheckboxGroup.Label slot="label">Checkbox Group</CheckboxGroup.Label>
<CheckboxGroup.Checkbox label="Checkbox-5" name="cb-5" value="cb-5" />
<CheckboxGroup.Checkbox label="Checkbox-6" name="cb-6" value="cb-6" />
<CheckboxGroup.Checkbox label="Checkbox-7" name="cb-7" value="cb-7" />
<CheckboxGroup.Checkbox label="Checkbox-8" name="cb-8" value="cb-8" />
<CheckboxGroup.Checkbox name="cb-5" value="cb-5">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-5</CheckboxGroup.Checkbox.Label>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-6" value="cb-6">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-6</CheckboxGroup.Checkbox.Label>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-7" value="cb-7">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-7</CheckboxGroup.Checkbox.Label>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-8" value="cb-8">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-8</CheckboxGroup.Checkbox.Label>
</CheckboxGroup.Checkbox>
</CheckboxGroup>
<br />
<CheckboxGroup>
<CheckboxGroup.Label slot="label">Checkbox Group</CheckboxGroup.Label>
<CheckboxGroup.Checkbox label="Checkbox-9" name="cb-9" value="cb-9" description="desc-9" />
<CheckboxGroup.Checkbox
label="Checkbox-10"
name="cb-10"
value="cb-10"
description="desc-10"
/>
<CheckboxGroup.Checkbox
label="Checkbox-11"
name="cb-11"
value="cb-11"
description="desc-11"
/>
<CheckboxGroup.Checkbox
label="Checkbox-12"
name="cb-12"
value="cb-12"
description="desc-12"
/>
<CheckboxGroup.Checkbox name="cb-9" value="cb-9">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-9</CheckboxGroup.Checkbox.Label>
<CheckboxGroup.Checkbox.Description slot="description"
>desc-9</CheckboxGroup.Checkbox.Description
>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-10" value="cb-10">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-10</CheckboxGroup.Checkbox.Label>
<CheckboxGroup.Checkbox.Description slot="description"
>desc-10</CheckboxGroup.Checkbox.Description
>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-11" value="cb-11">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-11</CheckboxGroup.Checkbox.Label>
<CheckboxGroup.Checkbox.Description slot="description"
>desc-11</CheckboxGroup.Checkbox.Description
>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-12" value="cb-12">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-12</CheckboxGroup.Checkbox.Label>
<CheckboxGroup.Checkbox.Description slot="description"
>desc-12</CheckboxGroup.Checkbox.Description
>
</CheckboxGroup.Checkbox>
</CheckboxGroup>
<br />
<CheckboxGroup inline>
<CheckboxGroup.Label slot="label">Checkbox Group</CheckboxGroup.Label>
<CheckboxGroup.Checkbox
label="Checkbox-13"
name="cb-13"
value="cb-13"
description="desc-13"
/>
<CheckboxGroup.Checkbox
label="Checkbox-14"
name="cb-14"
value="cb-14"
description="desc-14"
/>
<CheckboxGroup.Checkbox
label="Checkbox-15"
name="cb-15"
value="cb-15"
description="desc-15"
/>
<CheckboxGroup.Checkbox
label="Checkbox-16"
name="cb-16"
value="cb-16"
description="desc-16"
/>
<CheckboxGroup.Checkbox name="cb-13" value="cb-13">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-13</CheckboxGroup.Checkbox.Label>
<CheckboxGroup.Checkbox.Description slot="description"
>desc-13</CheckboxGroup.Checkbox.Description
>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-14" value="cb-14">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-14</CheckboxGroup.Checkbox.Label>
<CheckboxGroup.Checkbox.Description slot="description"
>desc-14</CheckboxGroup.Checkbox.Description
>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-15" value="cb-15">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-15</CheckboxGroup.Checkbox.Label>
<CheckboxGroup.Checkbox.Description slot="description"
>desc-15</CheckboxGroup.Checkbox.Description
>
</CheckboxGroup.Checkbox>
<CheckboxGroup.Checkbox name="cb-16" value="cb-16">
<CheckboxGroup.Checkbox.Label slot="label">Checkbox-16</CheckboxGroup.Checkbox.Label>
<CheckboxGroup.Checkbox.Description slot="description"
>desc-16</CheckboxGroup.Checkbox.Description
>
</CheckboxGroup.Checkbox>
</CheckboxGroup>
<br />
<CheckboxGroup.Checkbox
label="Checkbox-17"
name="cb-17"
value="cb-17"
description="desc-17"
/>
</Card.Content>
</Card>
</Col>

0 comments on commit eea49e0

Please sign in to comment.