From 53716d7a5fc138119a0c88ae479d6d7ea88263be Mon Sep 17 00:00:00 2001 From: Gabriel Duete Date: Fri, 31 Jan 2025 11:07:58 -0300 Subject: [PATCH] feat(divider): create new component (#692) --- packages/core/src/components.d.ts | 15 +++++++ .../core/src/components/divider/divider.scss | 10 +++++ .../src/components/divider/divider.spec.ts | 39 +++++++++++++++++++ .../core/src/components/divider/divider.tsx | 14 +++++++ .../divider/stories/divider.args.ts | 23 +++++++++++ .../divider/stories/divider.core.stories.tsx | 31 +++++++++++++++ .../divider/stories/divider.react.stories.tsx | 38 ++++++++++++++++++ .../divider/stories/divider.vue.stories.tsx | 36 +++++++++++++++++ 8 files changed, 206 insertions(+) create mode 100644 packages/core/src/components/divider/divider.scss create mode 100644 packages/core/src/components/divider/divider.spec.ts create mode 100644 packages/core/src/components/divider/divider.tsx create mode 100644 packages/core/src/components/divider/stories/divider.args.ts create mode 100644 packages/core/src/components/divider/stories/divider.core.stories.tsx create mode 100644 packages/core/src/components/divider/stories/divider.react.stories.tsx create mode 100644 packages/core/src/components/divider/stories/divider.vue.stories.tsx diff --git a/packages/core/src/components.d.ts b/packages/core/src/components.d.ts index b222fa3cd..3e79316e4 100644 --- a/packages/core/src/components.d.ts +++ b/packages/core/src/components.d.ts @@ -121,6 +121,9 @@ export namespace Components { | DatetimeChangeEventDetail; "yearValues"?: number[] | string; } + interface AtomDivider { + "type": 'horizontal' | 'vertical'; + } interface AtomGrid { "fixed"?: boolean; } @@ -490,6 +493,12 @@ declare global { prototype: HTMLAtomDatetimeElement; new (): HTMLAtomDatetimeElement; }; + interface HTMLAtomDividerElement extends Components.AtomDivider, HTMLStencilElement { + } + var HTMLAtomDividerElement: { + prototype: HTMLAtomDividerElement; + new (): HTMLAtomDividerElement; + }; interface HTMLAtomGridElement extends Components.AtomGrid, HTMLStencilElement { } var HTMLAtomGridElement: { @@ -708,6 +717,7 @@ declare global { "atom-col": HTMLAtomColElement; "atom-container": HTMLAtomContainerElement; "atom-datetime": HTMLAtomDatetimeElement; + "atom-divider": HTMLAtomDividerElement; "atom-grid": HTMLAtomGridElement; "atom-icon": HTMLAtomIconElement; "atom-input": HTMLAtomInputElement; @@ -841,6 +851,9 @@ declare namespace LocalJSX { | DatetimeChangeEventDetail; "yearValues"?: number[] | string; } + interface AtomDivider { + "type"?: 'horizontal' | 'vertical'; + } interface AtomGrid { "fixed"?: boolean; } @@ -1091,6 +1104,7 @@ declare namespace LocalJSX { "atom-col": AtomCol; "atom-container": AtomContainer; "atom-datetime": AtomDatetime; + "atom-divider": AtomDivider; "atom-grid": AtomGrid; "atom-icon": AtomIcon; "atom-input": AtomInput; @@ -1121,6 +1135,7 @@ declare module "@stencil/core" { "atom-col": LocalJSX.AtomCol & JSXBase.HTMLAttributes; "atom-container": LocalJSX.AtomContainer & JSXBase.HTMLAttributes; "atom-datetime": LocalJSX.AtomDatetime & JSXBase.HTMLAttributes; + "atom-divider": LocalJSX.AtomDivider & JSXBase.HTMLAttributes; "atom-grid": LocalJSX.AtomGrid & JSXBase.HTMLAttributes; "atom-icon": LocalJSX.AtomIcon & JSXBase.HTMLAttributes; "atom-input": LocalJSX.AtomInput & JSXBase.HTMLAttributes; diff --git a/packages/core/src/components/divider/divider.scss b/packages/core/src/components/divider/divider.scss new file mode 100644 index 000000000..2f3de4971 --- /dev/null +++ b/packages/core/src/components/divider/divider.scss @@ -0,0 +1,10 @@ +.atom-divider { + background-color: var(--color-neutral-light-3); + height: 1px; + width: 100%; + + &.is-vertical { + height: 100%; + width: 1px; + } +} diff --git a/packages/core/src/components/divider/divider.spec.ts b/packages/core/src/components/divider/divider.spec.ts new file mode 100644 index 000000000..9fb07f3d7 --- /dev/null +++ b/packages/core/src/components/divider/divider.spec.ts @@ -0,0 +1,39 @@ +import { newSpecPage } from '@stencil/core/testing' + +import { AtomDivider } from './divider' + +describe('atom-divider', () => { + it('should render with default prop horizontal', async () => { + const page = await newSpecPage({ + components: [AtomDivider], + html: ``, + }) + + await page.waitForChanges() + + expect(page.root).toEqualHtml(` + + +
+
+
+ `) + }) +}) + +it('should render with prop vertical', async () => { + const page = await newSpecPage({ + components: [AtomDivider], + html: ``, + }) + + await page.waitForChanges() + + expect(page.root).toEqualHtml(` + + +
+
+
+ `) +}) diff --git a/packages/core/src/components/divider/divider.tsx b/packages/core/src/components/divider/divider.tsx new file mode 100644 index 000000000..14c6ee98d --- /dev/null +++ b/packages/core/src/components/divider/divider.tsx @@ -0,0 +1,14 @@ +import { Component, h, Prop } from '@stencil/core' + +@Component({ + tag: 'atom-divider', + styleUrl: 'divider.scss', + shadow: true, +}) +export class AtomDivider { + @Prop() type: 'horizontal' | 'vertical' = 'horizontal' + + render() { + return
+ } +} diff --git a/packages/core/src/components/divider/stories/divider.args.ts b/packages/core/src/components/divider/stories/divider.args.ts new file mode 100644 index 000000000..36250cc6e --- /dev/null +++ b/packages/core/src/components/divider/stories/divider.args.ts @@ -0,0 +1,23 @@ +export const DividerStoryArgs = { + decorators: [], + parameters: { + actions: { + handles: [], + }, + docs: { + description: { + component: + 'The Divider is a thin line that helps separate and group content in the interface. This component can also be used to define rhythm and order.', + }, + }, + }, + argTypes: { + type: { + control: 'select', + options: ['horizontal', 'vertical'], + defaultValue: { summary: 'horizontal' }, + description: + 'The type of the divider, will change your anatomy. The component can be used to separate content in two directions, vertical or horizontal.', + }, + }, +} diff --git a/packages/core/src/components/divider/stories/divider.core.stories.tsx b/packages/core/src/components/divider/stories/divider.core.stories.tsx new file mode 100644 index 000000000..44dc9d615 --- /dev/null +++ b/packages/core/src/components/divider/stories/divider.core.stories.tsx @@ -0,0 +1,31 @@ +import { Meta, StoryObj } from '@storybook/web-components' +import { html } from 'lit' + +import { DividerStoryArgs } from './divider.args' + +export default { + title: 'Components/Divider', + ...DividerStoryArgs, +} as Meta + +const createDivider = (args) => { + return args.type === 'vertical' + ? html`
+ +
` + : html`` +} + +export const Horizontal: StoryObj = { + render: (args) => createDivider(args), + args: { + type: 'horizontal', + }, +} + +export const Vertical: StoryObj = { + render: (args) => createDivider(args), + args: { + type: 'vertical', + }, +} diff --git a/packages/core/src/components/divider/stories/divider.react.stories.tsx b/packages/core/src/components/divider/stories/divider.react.stories.tsx new file mode 100644 index 000000000..0529424d1 --- /dev/null +++ b/packages/core/src/components/divider/stories/divider.react.stories.tsx @@ -0,0 +1,38 @@ +import { AtomDivider } from '@juntossomosmais/atomium/react' +import { Meta, StoryObj } from '@storybook/react' +import React from 'react' + +import { DividerStoryArgs } from './divider.args' + +export default { + title: 'Components/Divider', + component: AtomDivider, + ...DividerStoryArgs, +} as Meta + +const createDivider = (args) => + args.type === 'vertical' ? ( +
+ +
+ ) : ( + + ) + +export const Horizontal: StoryObj = { + render: (args) => createDivider(args), + args: { + type: 'horizontal', + }, +} + +export const Vertical: StoryObj = { + render: (args) => createDivider(args), + args: { + type: 'vertical', + }, +} diff --git a/packages/core/src/components/divider/stories/divider.vue.stories.tsx b/packages/core/src/components/divider/stories/divider.vue.stories.tsx new file mode 100644 index 000000000..1fc8be771 --- /dev/null +++ b/packages/core/src/components/divider/stories/divider.vue.stories.tsx @@ -0,0 +1,36 @@ +import { AtomDivider } from '@juntossomosmais/atomium/vue' +import { Meta, StoryObj } from '@storybook/vue3' + +import { DividerStoryArgs } from './divider.args' + +export default { + title: 'Components/Divider', + ...DividerStoryArgs, +} as Meta + +const createDivider = (args) => ({ + components: { AtomDivider }, + setup() { + return { args } + }, + template: ` +
+ +
+ + `, +}) + +export const Horizontal: StoryObj = { + render: (args) => createDivider(args), + args: { + type: 'horizontal', + }, +} + +export const Vertical: StoryObj = { + render: (args) => createDivider(args), + args: { + type: 'vertical', + }, +}