diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index ee348e5701..7da4123674 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -39,4 +39,4 @@ jobs: projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} exitOnceUploaded: true onlyChanged: true - externals: "[\"components/**/*.scss\", \"components/tailwind.config*.js\"]" + externals: "[\"libs/components/**/*.scss\", \"libs/components/tailwind.config*.js\"]" diff --git a/libs/components/src/dialog/dialog-close.directive.ts b/libs/components/src/dialog/dialog-close.directive.ts new file mode 100644 index 0000000000..11f894e04d --- /dev/null +++ b/libs/components/src/dialog/dialog-close.directive.ts @@ -0,0 +1,18 @@ +import { DialogRef } from "@angular/cdk/dialog"; +import { Directive, Input, Optional } from "@angular/core"; + +@Directive({ + selector: "[bitDialogClose]", + host: { + "(click)": "close()", + }, +}) +export class DialogCloseDirective { + @Input("bit-dialog-close") dialogResult: any; + + constructor(@Optional() public dialogRef: DialogRef) {} + + close() { + this.dialogRef.close(this.dialogResult); + } +} diff --git a/libs/components/src/dialog/dialog-service.stories.ts b/libs/components/src/dialog/dialog-service.stories.ts new file mode 100644 index 0000000000..50514d3c75 --- /dev/null +++ b/libs/components/src/dialog/dialog-service.stories.ts @@ -0,0 +1,78 @@ +import { DialogModule, DialogRef, DIALOG_DATA } from "@angular/cdk/dialog"; +import { Component, Inject } from "@angular/core"; +import { Meta, moduleMetadata, Story } from "@storybook/angular"; + +import { ButtonModule } from "../button"; + +import { DialogCloseDirective } from "./dialog-close.directive"; +import { DialogService } from "./dialog.service"; +import { DialogComponent } from "./dialog/dialog.component"; + +interface Animal { + animal: string; +} + +@Component({ + selector: "app-story-dialog", + template: ``, +}) +class StoryDialogComponent { + constructor(public dialogService: DialogService) {} + + openDialog() { + this.dialogService.open(StoryDialogContentComponent, { + data: { + animal: "panda", + }, + }); + } +} + +@Component({ + selector: "story-dialog-content", + template: ` + + Dialog Title + + Dialog body text goes here. +
+ Animal: {{ animal }} +
+
+ + +
+
+ `, +}) +class StoryDialogContentComponent { + constructor(public dialogRef: DialogRef, @Inject(DIALOG_DATA) private data: Animal) {} + + get animal() { + return this.data?.animal; + } +} + +export default { + title: "Component Library/Dialogs/Service", + component: StoryDialogComponent, + decorators: [ + moduleMetadata({ + declarations: [DialogComponent, StoryDialogContentComponent, DialogCloseDirective], + imports: [ButtonModule, DialogModule], + providers: [DialogService], + }), + ], + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library", + }, + }, +} as Meta; + +const Template: Story = (args: StoryDialogComponent) => ({ + props: args, +}); + +export const Default = Template.bind({}); diff --git a/libs/components/src/dialog/dialog.module.ts b/libs/components/src/dialog/dialog.module.ts new file mode 100644 index 0000000000..828ae368ad --- /dev/null +++ b/libs/components/src/dialog/dialog.module.ts @@ -0,0 +1,16 @@ +import { DialogModule as CdkDialogModule } from "@angular/cdk/dialog"; +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; + +import { DialogCloseDirective } from "./dialog-close.directive"; +import { DialogService } from "./dialog.service"; +import { DialogComponent } from "./dialog/dialog.component"; +import { SimpleDialogComponent } from "./simple-dialog/simple-dialog.component"; + +@NgModule({ + imports: [CommonModule, CdkDialogModule], + declarations: [DialogCloseDirective, DialogComponent, SimpleDialogComponent], + exports: [CdkDialogModule, DialogComponent, SimpleDialogComponent], + providers: [DialogService], +}) +export class DialogModule {} diff --git a/libs/components/src/dialog/dialog.service.ts b/libs/components/src/dialog/dialog.service.ts new file mode 100644 index 0000000000..1569df7224 --- /dev/null +++ b/libs/components/src/dialog/dialog.service.ts @@ -0,0 +1,18 @@ +import { Dialog, DialogConfig, DialogRef } from "@angular/cdk/dialog"; +import { ComponentType } from "@angular/cdk/overlay"; +import { Injectable, TemplateRef } from "@angular/core"; + +@Injectable() +export class DialogService extends Dialog { + override open( + componentOrTemplateRef: ComponentType | TemplateRef, + config?: DialogConfig> + ): DialogRef { + config = { + backdropClass: ["tw-fixed", "tw-bg-black", "tw-bg-opacity-30", "tw-inset-0", "tw-z-40"], + ...config, + }; + + return super.open(componentOrTemplateRef, config); + } +} diff --git a/libs/components/src/modal/modal.component.html b/libs/components/src/dialog/dialog/dialog.component.html similarity index 72% rename from libs/components/src/modal/modal.component.html rename to libs/components/src/dialog/dialog/dialog.component.html index a4528a4a0e..c71e38120b 100644 --- a/libs/components/src/modal/modal.component.html +++ b/libs/components/src/dialog/dialog/dialog.component.html @@ -6,20 +6,20 @@ class="tw-flex tw-gap-4 tw-border-0 tw-border-b tw-border-solid tw-border-secondary-300 tw-p-4" >

- +

-
- +
- +
diff --git a/libs/components/src/dialog/dialog/dialog.component.ts b/libs/components/src/dialog/dialog/dialog.component.ts new file mode 100644 index 0000000000..3727b08b5b --- /dev/null +++ b/libs/components/src/dialog/dialog/dialog.component.ts @@ -0,0 +1,23 @@ +import { Component, Input } from "@angular/core"; + +@Component({ + selector: "bit-dialog", + templateUrl: "./dialog.component.html", +}) +export class DialogComponent { + @Input() dialogSize: "small" | "default" | "large" = "default"; + + get width() { + switch (this.dialogSize) { + case "small": { + return "tw-w-96"; + } + case "large": { + return "tw-w-75vw"; + } + default: { + return "tw-w-50vw"; + } + } + } +} diff --git a/libs/components/src/dialog/dialog/dialog.stories.ts b/libs/components/src/dialog/dialog/dialog.stories.ts new file mode 100644 index 0000000000..3f2220d49f --- /dev/null +++ b/libs/components/src/dialog/dialog/dialog.stories.ts @@ -0,0 +1,81 @@ +import { Meta, moduleMetadata, Story } from "@storybook/angular"; + +import { ButtonModule } from "../../button"; + +import { DialogComponent } from "./dialog.component"; + +export default { + title: "Component Library/Dialogs/Dialog", + component: DialogComponent, + decorators: [ + moduleMetadata({ + imports: [ButtonModule], + }), + ], + args: { + dialogSize: "small", + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library", + }, + }, +} as Meta; + +const Template: Story = (args: DialogComponent) => ({ + props: args, + template: ` + + {{title}} + Dialog body text goes here. +
+ + +
+
+ `, +}); + +export const Default = Template.bind({}); +Default.args = { + dialogSize: "default", + title: "Default", +}; + +export const Small = Template.bind({}); +Small.args = { + dialogSize: "small", + title: "Small", +}; + +export const Large = Template.bind({}); +Large.args = { + dialogSize: "large", + title: "Large", +}; + +const TemplateScrolling: Story = (args: DialogComponent) => ({ + props: args, + template: ` + + Scrolling Example + + Dialog body text goes here.
+ + repeating lines of characters
+
+ end of sequence! +
+
+ + +
+
+ `, +}); + +export const ScrollingContent = TemplateScrolling.bind({}); +ScrollingContent.args = { + dialogSize: "small", +}; diff --git a/libs/components/src/dialog/index.ts b/libs/components/src/dialog/index.ts new file mode 100644 index 0000000000..67872beb1f --- /dev/null +++ b/libs/components/src/dialog/index.ts @@ -0,0 +1,2 @@ +export * from "./dialog.module"; +export * from "./dialog.service"; diff --git a/libs/components/src/modal/modal-simple.component.html b/libs/components/src/dialog/simple-dialog/simple-dialog.component.html similarity index 72% rename from libs/components/src/modal/modal-simple.component.html rename to libs/components/src/dialog/simple-dialog/simple-dialog.component.html index e4ff97d5ba..90a4a51e06 100644 --- a/libs/components/src/modal/modal-simple.component.html +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.component.html @@ -2,18 +2,18 @@ class="tw-my-4 tw-flex tw-max-h-screen tw-max-w-sm tw-flex-col tw-overflow-hidden tw-rounded tw-border tw-border-solid tw-border-secondary-300 tw-bg-text-contrast tw-text-main" >
- +

- +

- +
- +
diff --git a/libs/components/src/modal/modal-simple.component.ts b/libs/components/src/dialog/simple-dialog/simple-dialog.component.ts similarity index 57% rename from libs/components/src/modal/modal-simple.component.ts rename to libs/components/src/dialog/simple-dialog/simple-dialog.component.ts index b083e784cf..48a4d62c83 100644 --- a/libs/components/src/modal/modal-simple.component.ts +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.component.ts @@ -1,13 +1,13 @@ import { Component, ContentChild, Directive } from "@angular/core"; -@Directive({ selector: "[bit-modal-icon]" }) +@Directive({ selector: "[bit-dialog-icon]" }) export class IconDirective {} @Component({ - selector: "bit-simple-modal", - templateUrl: "./modal-simple.component.html", + selector: "bit-simple-dialog", + templateUrl: "./simple-dialog.component.html", }) -export class ModalSimpleComponent { +export class SimpleDialogComponent { @ContentChild(IconDirective) icon!: IconDirective; get hasIcon() { diff --git a/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts b/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts new file mode 100644 index 0000000000..a74220f3cb --- /dev/null +++ b/libs/components/src/dialog/simple-dialog/simple-dialog.stories.ts @@ -0,0 +1,81 @@ +import { Meta, moduleMetadata, Story } from "@storybook/angular"; + +import { ButtonModule } from "../../button"; + +import { IconDirective, SimpleDialogComponent } from "./simple-dialog.component"; + +export default { + title: "Component Library/Dialogs/Simple Dialog", + component: SimpleDialogComponent, + decorators: [ + moduleMetadata({ + imports: [ButtonModule], + declarations: [IconDirective], + }), + ], + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library", + }, + }, +} as Meta; + +const Template: Story = (args: SimpleDialogComponent) => ({ + props: args, + template: ` + + Alert Dialog + Message Content +
+ + +
+
+ `, +}); + +export const Default = Template.bind({}); + +const TemplateWithIcon: Story = (args: SimpleDialogComponent) => ({ + props: args, + template: ` + + + Premium Subscription Available + Message Content +
+ + +
+
+ `, +}); + +export const CustomIcon = TemplateWithIcon.bind({}); + +const TemplateScroll: Story = (args: SimpleDialogComponent) => ({ + props: args, + template: ` + + Alert Dialog + + Message Content + Message text goes here.
+ + repeating lines of characters
+
+ end of sequence! +
+
+ + +
+
+ `, +}); + +export const ScrollingContent = TemplateScroll.bind({}); +ScrollingContent.args = { + useDefaultIcon: true, +}; diff --git a/libs/components/src/index.ts b/libs/components/src/index.ts index 27da8cf6ef..e5c4c5cb13 100644 --- a/libs/components/src/index.ts +++ b/libs/components/src/index.ts @@ -5,7 +5,7 @@ export * from "./callout"; export * from "./form-field"; export * from "./icon"; export * from "./menu"; -export * from "./modal"; +export * from "./dialog"; export * from "./submit-button"; export * from "./tabs"; export * from "./toggle-group"; diff --git a/libs/components/src/modal/index.ts b/libs/components/src/modal/index.ts deleted file mode 100644 index 5c8ac1f8e8..0000000000 --- a/libs/components/src/modal/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./modal.component"; -export * from "./modal-simple.component"; -export * from "./modal.module"; diff --git a/libs/components/src/modal/modal-simple.stories.ts b/libs/components/src/modal/modal-simple.stories.ts deleted file mode 100644 index 5f28e63bb0..0000000000 --- a/libs/components/src/modal/modal-simple.stories.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; - -import { ButtonModule } from "../button"; - -import { IconDirective, ModalSimpleComponent } from "./modal-simple.component"; - -export default { - title: "Component Library/Modals/Simple Modal", - component: ModalSimpleComponent, - decorators: [ - moduleMetadata({ - imports: [ButtonModule], - declarations: [IconDirective], - }), - ], - parameters: { - design: { - type: "figma", - url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library", - }, - }, -} as Meta; - -const Template: Story = (args: ModalSimpleComponent) => ({ - props: args, - template: ` - - Alert Modal - - Message Content - -
- - -
-
- `, -}); - -export const Default = Template.bind({}); - -const TemplateWithIcon: Story = (args: ModalSimpleComponent) => ({ - props: args, - template: ` - - - Premium Subscription Available - - Message Content - -
- - -
-
- `, -}); - -export const CustomIcon = TemplateWithIcon.bind({}); - -const TemplateScroll: Story = (args: ModalSimpleComponent) => ({ - props: args, - template: ` - - Alert Modal - - Message Content - Message text goes here.
- - repeating lines of characters
-
- end of sequence! -
-
- - -
-
- `, -}); - -export const ScrollingContent = TemplateScroll.bind({}); -ScrollingContent.args = { - useDefaultIcon: true, -}; diff --git a/libs/components/src/modal/modal.component.ts b/libs/components/src/modal/modal.component.ts deleted file mode 100644 index 208929bf02..0000000000 --- a/libs/components/src/modal/modal.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component, Input } from "@angular/core"; - -@Component({ - selector: "bit-modal", - templateUrl: "./modal.component.html", -}) -export class ModalComponent { - @Input() modalSize: "small" | "default" | "large"; - - get width() { - switch (this.modalSize) { - case "small": { - return "tw-max-w-xs"; - } - case "large": { - return "tw-max-w-4xl"; - } - default: { - return "tw-max-w-xl"; - } - } - } -} diff --git a/libs/components/src/modal/modal.module.ts b/libs/components/src/modal/modal.module.ts deleted file mode 100644 index 340a6b2dee..0000000000 --- a/libs/components/src/modal/modal.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from "@angular/common"; -import { NgModule } from "@angular/core"; - -import { ModalSimpleComponent } from "./modal-simple.component"; -import { ModalComponent } from "./modal.component"; - -@NgModule({ - imports: [CommonModule], - exports: [ModalComponent, ModalSimpleComponent], - declarations: [ModalComponent, ModalSimpleComponent], -}) -export class ModalModule {} diff --git a/libs/components/src/modal/modal.stories.ts b/libs/components/src/modal/modal.stories.ts deleted file mode 100644 index 6225dbe6aa..0000000000 --- a/libs/components/src/modal/modal.stories.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Meta, moduleMetadata, Story } from "@storybook/angular"; - -import { ButtonModule } from "../button"; - -import { ModalComponent } from "./modal.component"; - -export default { - title: "Component Library/Modals/Modal", - component: ModalComponent, - decorators: [ - moduleMetadata({ - imports: [ButtonModule], - }), - ], - args: { - modalSize: "small", - }, - parameters: { - design: { - type: "figma", - url: "https://www.figma.com/file/Zt3YSeb6E6lebAffrNLa0h/Tailwind-Component-Library", - }, - }, -} as Meta; - -const Template: Story = (args: ModalComponent) => ({ - props: args, - template: ` - - Modal Title - - Modal body text goes here. - -
- - -
-
- `, -}); - -export const Default = Template.bind({}); -Default.args = { - modalSize: "default", -}; - -export const Small = Template.bind({}); -Small.args = { - modalSize: "small", -}; - -export const Large = Template.bind({}); -Large.args = { - modalSize: "large", -}; - -const TemplateScrolling: Story = (args: ModalComponent) => ({ - props: args, - template: ` - - Modal Title - - Modal body text goes here.
- - repeating lines of characters
-
- end of sequence! -
-
- - -
-
- `, -}); - -export const ScrollingContent = TemplateScrolling.bind({}); -ScrollingContent.args = { - modalSize: "small", -}; diff --git a/libs/components/tailwind.config.base.js b/libs/components/tailwind.config.base.js index 31ff19cb50..dff31e69db 100644 --- a/libs/components/tailwind.config.base.js +++ b/libs/components/tailwind.config.base.js @@ -10,6 +10,7 @@ module.exports = { colors: { transparent: colors.transparent, current: colors.current, + black: colors.black, primary: { 300: "var(--color-primary-300)", 500: "var(--color-primary-500)", @@ -68,6 +69,12 @@ module.exports = { DEFAULT: theme("colors.background"), ...theme("colors"), }), + extend: { + width: { + "50vw": "50vw", + "75vw": "75vw", + }, + }, }, plugins: [], };