refactor(code-snippet): pass snippet button class for multi-line

- Remove exported props from CopyButton, skeleton
- Replace onMount with reactive statement
- Forward events to skeleton
- Clean up Story
This commit is contained in:
Eric Liu 2019-12-18 09:10:49 -08:00
commit 40a7be5c79
3 changed files with 23 additions and 26 deletions

View file

@ -2,7 +2,7 @@
let className = undefined; let className = undefined;
export { className as class }; export { className as class };
export let type = 'single'; export let type = 'single';
export let props = {}; export let style = undefined;
import { cx } from '../../lib'; import { cx } from '../../lib';
@ -16,13 +16,13 @@
</script> </script>
{#if type === 'single'} {#if type === 'single'}
<div {...props} class={_class}> <div on:click on:mouseover on:mouseenter on:mouseleave {style} class={_class}>
<div class={cx('--snippet-container')}> <div class={cx('--snippet-container')}>
<span /> <span />
</div> </div>
</div> </div>
{:else if type === 'multi'} {:else if type === 'multi'}
<div {...props} class={_class}> <div on:click on:mouseover on:mouseenter on:mouseleave {style} class={_class}>
<div class={cx('--snippet-container')}> <div class={cx('--snippet-container')}>
<span /> <span />
<span /> <span />

View file

@ -5,31 +5,27 @@
import Layout from '../../internal/ui/Layout.svelte'; import Layout from '../../internal/ui/Layout.svelte';
import CodeSnippet from './CodeSnippet.svelte'; import CodeSnippet from './CodeSnippet.svelte';
import CodeSnippetSkeleton from './CodeSnippet.Skeleton.svelte'; import CodeSnippetSkeleton from './CodeSnippet.Skeleton.svelte';
const inlineProps = { light, feedback, copyLabel };
const singleLineProps = {
feedback,
copyButtonDescription,
'aria-label': $$props['aria-label']
};
const multiLineProps = { feedback, showLessText, showMoreText };
</script> </script>
<Layout> <Layout>
<div> <div>
{#if story === 'skeleton'} {#if story === 'skeleton'}
<div style="width: 800px"> <div style="width: 800px">
<CodeSnippetSkeleton type="single" props={{ style: 'margin-bottom: 8px' }} /> <CodeSnippetSkeleton type="single" style="margin-bottom: 8px" />
<CodeSnippetSkeleton type="multi" /> <CodeSnippetSkeleton type="multi" />
</div> </div>
{:else if story === 'inline'} {:else if story === 'inline'}
<CodeSnippet type="inline" {...inlineProps}>{'node -v'}</CodeSnippet> <CodeSnippet type="inline" {light} {feedback} {copyLabel}>{'node -v'}</CodeSnippet>
{:else if story === 'single line'} {:else if story === 'single line'}
<CodeSnippet type="single" {...singleLineProps}> <CodeSnippet
type="single"
{feedback}
{copyButtonDescription}
aria-label={$$props['aria-label']}>
{'node -v Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis, veritatis voluptate id incidunt molestiae officia possimus, quasi itaque alias, architecto hic, dicta fugit? Debitis delectus quidem explicabo vitae fuga laboriosam!'} {'node -v Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis, veritatis voluptate id incidunt molestiae officia possimus, quasi itaque alias, architecto hic, dicta fugit? Debitis delectus quidem explicabo vitae fuga laboriosam!'}
</CodeSnippet> </CodeSnippet>
{:else if story === 'multi line'} {:else if story === 'multi line'}
<CodeSnippet type="multi" {...multiLineProps}> <CodeSnippet type="multi" {feedback} {showLessText} {showMoreText}>
{`@mixin grid-container { {`@mixin grid-container {
width: 100%; width: 100%;
padding-right: padding(mobile); padding-right: padding(mobile);

View file

@ -10,7 +10,6 @@
export let light = false; export let light = false;
export let props = {}; export let props = {};
import { onMount } from 'svelte';
import ChevronDown16 from 'carbon-icons-svelte/lib/ChevronDown16'; import ChevronDown16 from 'carbon-icons-svelte/lib/ChevronDown16';
import { cx } from '../../lib'; import { cx } from '../../lib';
import Button from '../Button'; import Button from '../Button';
@ -20,18 +19,16 @@
const id = Math.random(); const id = Math.random();
let codeRef = undefined; let codeRef = undefined;
let expandedCode = false; let expandedCode = false;
let shouldShowMoreLessBtn = false; let showMoreLessBtn = false;
onMount(() => {
if (codeRef) {
const { height } = codeRef.getBoundingClientRect();
shouldShowMoreLessBtn = type === 'multi' && height > 255;
}
});
$: if (codeRef) {
const { height } = codeRef.getBoundingClientRect();
showMoreLessBtn = type === 'multi' && height > 255;
}
$: _class = cx( $: _class = cx(
'--snippet', '--snippet',
type && `--snippet--${type}`, type && `--snippet--${type}`,
type === 'inline' && '--btn--copy',
expandedCode && '--snippet--expand', expandedCode && '--snippet--expand',
light && '--snippet--light', light && '--snippet--light',
className className
@ -64,8 +61,12 @@
</pre> </pre>
</code> </code>
</div> </div>
<CopyButton on:click {feedback} iconDescription={copyButtonDescription} /> <CopyButton
{#if shouldShowMoreLessBtn} on:click
class={cx('--snippet-button')}
{feedback}
iconDescription={copyButtonDescription} />
{#if showMoreLessBtn}
<Button <Button
kind="ghost" kind="ghost"
size="small" size="small"