mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-15 18:31:06 +00:00
191 lines
4.8 KiB
Svelte
191 lines
4.8 KiB
Svelte
<script>
|
|
import {
|
|
Grid,
|
|
Link,
|
|
Row,
|
|
Column,
|
|
Content,
|
|
Button,
|
|
Select,
|
|
SelectItem,
|
|
InlineNotification,
|
|
Tabs,
|
|
Tab,
|
|
TabContent,
|
|
} from "carbon-components-svelte";
|
|
import Code from "carbon-icons-svelte/lib/Code.svelte";
|
|
import { page, metatags } from "@sveltech/routify";
|
|
import { onMount } from "svelte";
|
|
import { theme } from "../store";
|
|
import ComponentApi from "../components/ComponentApi.svelte";
|
|
import COMPONENT_API from "../COMPONENT_API.json";
|
|
|
|
export let component = $page.title;
|
|
export let components = [component];
|
|
export let unreleased = false;
|
|
export let unstable = false;
|
|
|
|
metatags.title = $page.title;
|
|
|
|
// TODO: `find` is not supported in IE
|
|
$: api_components = components.map((i) =>
|
|
COMPONENT_API.components.find((_) => _.moduleName === i)
|
|
);
|
|
$: multiple = api_components.length > 1;
|
|
|
|
onMount(() => {
|
|
const currentTheme = window.location.search.split("?theme=")[1];
|
|
|
|
if (["white", "g10", "g80", "g90", "g100"].includes(currentTheme)) {
|
|
theme.set(currentTheme);
|
|
}
|
|
});
|
|
|
|
function formatSourceURL(multiple) {
|
|
const filePath = api_components[0]?.filePath ?? "";
|
|
|
|
if (multiple) {
|
|
/**
|
|
* Link to folder for doc with multiple components.
|
|
* @example "src/Breadcrumb"
|
|
*/
|
|
return filePath.split("/").slice(0, -1).join("/");
|
|
}
|
|
|
|
/**
|
|
* Else, link to the component source.
|
|
* @example "src/Tile/ClickableTile.svelte"
|
|
*/
|
|
return filePath;
|
|
}
|
|
|
|
// TODO: [refactor] read from package.json value
|
|
$: sourceCode = `https://github.com/carbon-design-system/carbon-components-svelte/tree/master/${formatSourceURL(
|
|
multiple
|
|
)}`;
|
|
</script>
|
|
|
|
<Content data-components>
|
|
<Grid class="fix-overflow">
|
|
<Row>
|
|
<Column>
|
|
<h1>{component}</h1>
|
|
<div class="bar">
|
|
<Select
|
|
id="select-theme"
|
|
inline
|
|
labelText="Theme"
|
|
bind:selected="{$theme}"
|
|
>
|
|
<SelectItem value="white" text="White" />
|
|
<SelectItem value="g10" text="Gray 10" />
|
|
<SelectItem value="g80" text="Gray 80" />
|
|
<SelectItem value="g90" text="Gray 90" />
|
|
<SelectItem value="g100" text="Gray 100" />
|
|
</Select>
|
|
<Button
|
|
kind="ghost"
|
|
target="_blank"
|
|
size="field"
|
|
href="{sourceCode}"
|
|
icon="{Code}"
|
|
>
|
|
Source code
|
|
</Button>
|
|
</div>
|
|
{#if unreleased}
|
|
<InlineNotification
|
|
lowContrast
|
|
kind="info"
|
|
title="Unreleased"
|
|
subtitle="This component has not been released yet."
|
|
hideCloseButton
|
|
/>
|
|
{/if}
|
|
{#if unstable}
|
|
<InlineNotification
|
|
lowContrast
|
|
kind="warning"
|
|
title="Unstable component"
|
|
subtitle="Expect the API of this component to change. Use at your own risk."
|
|
hideCloseButton
|
|
/>
|
|
{/if}
|
|
</Column>
|
|
</Row>
|
|
|
|
<Row>
|
|
<Column class="prose">
|
|
<div class="toc mobile">
|
|
<h5>Examples</h5>
|
|
<slot name="aside" />
|
|
</div>
|
|
<slot />
|
|
<h2 id="component-api">Component API</h2>
|
|
<p>
|
|
API documentation is
|
|
<Link
|
|
inline
|
|
href="https://github.com/carbon-design-system/sveld"
|
|
target="_blank"
|
|
>
|
|
auto-generated by sveld.
|
|
</Link>
|
|
</p>
|
|
</Column>
|
|
</Row>
|
|
|
|
<Row>
|
|
<Column class="prose" noGutter="{multiple}">
|
|
{#if multiple}
|
|
<Tabs class="override-tabs">
|
|
{#each api_components as component (component.moduleName)}
|
|
<Tab label="{component.moduleName}" />
|
|
{/each}
|
|
<div slot="content" style="padding-top: var(--cds-spacing-06)">
|
|
{#each api_components as component (component.moduleName)}
|
|
<TabContent>
|
|
<ComponentApi component="{component}" />
|
|
</TabContent>
|
|
{/each}
|
|
</div>
|
|
</Tabs>
|
|
{:else}
|
|
<ComponentApi component="{api_components[0]}" />
|
|
{/if}
|
|
</Column>
|
|
</Row>
|
|
</Grid>
|
|
|
|
<Column class="table" xlg="{4}" lg="{5}">
|
|
<div class="toc">
|
|
<h5>Examples</h5>
|
|
<slot name="aside" />
|
|
</div>
|
|
</Column>
|
|
</Content>
|
|
|
|
<style>
|
|
.bar {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
margin-bottom: var(--cds-layout-02);
|
|
border-bottom: 1px solid var(--cds-ui-03);
|
|
}
|
|
|
|
:global(.toc h5) {
|
|
margin-top: var(--cds-spacing-06);
|
|
margin-bottom: var(--cds-spacing-03);
|
|
}
|
|
|
|
.toc.mobile {
|
|
display: none;
|
|
}
|
|
|
|
@media (max-width: 1056px) {
|
|
.toc.mobile {
|
|
display: block;
|
|
margin-bottom: var(--cds-spacing-09);
|
|
}
|
|
}
|
|
</style>
|