Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Card - Convert to TypeScript #1997

Merged
merged 6 commits into from Mar 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/funny-files-pay.md
@@ -0,0 +1,5 @@
---
"@hashicorp/design-system-components": minor
---

`Card` - Converted component to TypeScript
1 change: 1 addition & 0 deletions packages/components/package.json
Expand Up @@ -132,6 +132,7 @@
"./components/hds/button-set/index.js": "./dist/_app_/components/hds/button-set/index.js",
"./components/hds/button/index.js": "./dist/_app_/components/hds/button/index.js",
"./components/hds/card/container.js": "./dist/_app_/components/hds/card/container.js",
"./components/hds/card/types.js": "./dist/_app_/components/hds/card/types.js",
"./components/hds/code-block/copy-button.js": "./dist/_app_/components/hds/code-block/copy-button.js",
"./components/hds/code-block/description.js": "./dist/_app_/components/hds/code-block/description.js",
"./components/hds/code-block/index.js": "./dist/_app_/components/hds/code-block/index.js",
Expand Down
1 change: 0 additions & 1 deletion packages/components/src/components/hds/card/container.hbs
@@ -1,4 +1,3 @@
{{! @glint-nocheck: not typesafe yet }}
{{!
Copyright (c) HashiCorp, Inc.
SPDX-License-Identifier: MPL-2.0
Expand Down
Expand Up @@ -5,31 +5,60 @@

import Component from '@glimmer/component';
import { assert } from '@ember/debug';
import {
HdsCardBackgroundValues,
HdsCardLevelValues,
HdsCardOverflowValues,
} from './types.ts';
import type {
HdsCardBackground,
HdsCardLevel,
HdsCardOverflow,
} from './types.ts';

export const DEFAULT_LEVEL = HdsCardLevelValues.Base;
export const DEFAULT_BACKGROUND = HdsCardBackgroundValues.NeutralPrimary;
export const DEFAULT_OVERFLOW = HdsCardOverflowValues.Visible;
export const AVAILABLE_LEVELS: string[] = Object.values(HdsCardLevelValues);
export const AVAILABLE_BACKGROUNDS: string[] = Object.values(
HdsCardBackgroundValues
);
export const AVAILABLE_OVERFLOWS: string[] = Object.values(
HdsCardOverflowValues
);

export interface HdsCardContainerSignature {
Args: {
valeriia-ruban marked this conversation as resolved.
Show resolved Hide resolved
level?: HdsCardLevel;
levelActive?: HdsCardLevel;
levelHover?: HdsCardLevel;
background?: HdsCardBackground;
overflow?: HdsCardOverflow;
hasBorder?: boolean;
};
Element: HTMLDivElement;
Blocks: {
default: [];
};
}

export const DEFAULT_LEVEL = 'base';
export const DEFAULT_BACKGROUND = 'neutral-primary';
export const DEFAULT_OVERFLOW = 'visible';
export const LEVELS = ['base', 'mid', 'high'];
export const BACKGROUNDS = ['neutral-primary', 'neutral-secondary'];
export const OVERFLOWS = ['hidden', 'visible'];

export default class HdsCardContainerComponent extends Component {
export default class HdsCardContainerComponent extends Component<HdsCardContainerSignature> {
/**
* Sets the "elevation" level for the component
* Accepted values: base, mid, high
*
* @param level
* @type {string}
* @type {HdsCardLevel}
* @default 'base'
*/
get level() {
let { level = DEFAULT_LEVEL } = this.args;
get level(): HdsCardLevel {
const { level = DEFAULT_LEVEL } = this.args;

assert(
`@level for "Hds::Card::Container" must be one of the following: ${LEVELS.join(
`@level for "Hds::Card::Container" must be one of the following: ${AVAILABLE_LEVELS.join(
', '
)}; received: ${level}`,
LEVELS.includes(level)
AVAILABLE_LEVELS.includes(level)
);

return level;
Expand All @@ -40,17 +69,17 @@ export default class HdsCardContainerComponent extends Component {
* Accepted values: base, mid, high
*
* @param levelHover
* @type {string}
* @type {HdsCardLevel}
*/
get levelHover() {
let { levelHover } = this.args;
get levelHover(): HdsCardLevel | undefined {
const { levelHover } = this.args;

if (levelHover) {
assert(
`@levelHover for "Hds::Card::Container" must be one of the following: ${LEVELS.join(
`@levelHover for "Hds::Card::Container" must be one of the following: ${AVAILABLE_LEVELS.join(
', '
)}; received: ${levelHover}`,
LEVELS.includes(levelHover)
AVAILABLE_LEVELS.includes(levelHover)
);
}

Expand All @@ -62,17 +91,17 @@ export default class HdsCardContainerComponent extends Component {
* Accepted values: base, mid, high
*
* @param levelActive
* @type {string}
* @type {HdsCardLevel}
*/
get levelActive() {
let { levelActive } = this.args;
get levelActive(): HdsCardLevel | undefined {
const { levelActive } = this.args;

if (levelActive) {
assert(
`@levelActive for "Hds::Card::Container" must be one of the following: ${LEVELS.join(
`@levelActive for "Hds::Card::Container" must be one of the following: ${AVAILABLE_LEVELS.join(
', '
)}; received: ${levelActive}`,
LEVELS.includes(levelActive)
AVAILABLE_LEVELS.includes(levelActive)
);
}

Expand All @@ -84,17 +113,17 @@ export default class HdsCardContainerComponent extends Component {
* Accepted values: neutral-primary, neutral-secondary
*
* @param background
* @type {string}
* @type {HdsCardBackground}
* @default 'base'
*/
get background() {
let { background = DEFAULT_BACKGROUND } = this.args;
get background(): HdsCardBackground {
const { background = DEFAULT_BACKGROUND } = this.args;

assert(
`@background for "Hds::Card::Container" must be one of the following: ${BACKGROUNDS.join(
`@background for "Hds::Card::Container" must be one of the following: ${AVAILABLE_BACKGROUNDS.join(
', '
)}; received: ${background}`,
BACKGROUNDS.includes(background)
AVAILABLE_BACKGROUNDS.includes(background)
);

return background;
Expand All @@ -105,17 +134,17 @@ export default class HdsCardContainerComponent extends Component {
* Accepted values: visible, hidden
*
* @param overflow
* @type {string}
* @type {HdsCardOverflow}
* @default 'visible'
*/
get overflow() {
let { overflow = DEFAULT_OVERFLOW } = this.args;
get overflow(): HdsCardOverflow {
const { overflow = DEFAULT_OVERFLOW } = this.args;

assert(
`@overflow for "Hds::Card::Container" must be one of the following: ${OVERFLOWS.join(
`@overflow for "Hds::Card::Container" must be one of the following: ${AVAILABLE_OVERFLOWS.join(
', '
)}; received: ${overflow}`,
OVERFLOWS.includes(overflow)
AVAILABLE_OVERFLOWS.includes(overflow)
);

return overflow;
Expand All @@ -126,8 +155,8 @@ export default class HdsCardContainerComponent extends Component {
* @method Card#classNames
* @return {string} The "class" attribute to apply to the component.
*/
get classNames() {
let classes = ['hds-card__container'];
get classNames(): string {
const classes = ['hds-card__container'];

// add "elevation" classes based on the @level and @hasBorder arguments
classes.push(
Expand Down
28 changes: 28 additions & 0 deletions packages/components/src/components/hds/card/types.ts
@@ -0,0 +1,28 @@
export enum HdsCardBackgroundValues {
NeutralPrimary = 'neutral-primary',
NeutralSecondary = 'neutral-secondary',
}

export type HdsCardBackground =
| HdsCardBackgroundValues.NeutralSecondary
| HdsCardBackgroundValues.NeutralPrimary;

export enum HdsCardLevelValues {
Base = 'base',
Mid = 'mid',
High = 'high',
}

export type HdsCardLevel =
| HdsCardLevelValues.Base
| HdsCardLevelValues.Mid
| HdsCardLevelValues.High;

export enum HdsCardOverflowValues {
Hidden = 'hidden',
Visible = 'visible',
}

export type HdsCardOverflow =
| HdsCardOverflowValues.Hidden
| HdsCardOverflowValues.Visible;
6 changes: 6 additions & 0 deletions packages/components/src/template-registry.ts
Expand Up @@ -14,6 +14,7 @@ import type HdsTextCodeComponent from './components/hds/text/code';
import type HdsYieldComponent from './components/hds/yield';
import type HdsLinkToModelsHelper from './helpers/hds-link-to-models';
import type HdsLinkToQueryHelper from './helpers/hds-link-to-query';
import type HdsCardContainerComponent from './components/hds/card/container.ts';

export default interface HdsComponentsRegistry {
HdsInteractiveComponent: typeof HdsInteractiveIndexComponent;
Expand All @@ -22,6 +23,11 @@ export default interface HdsComponentsRegistry {
'hds/button': typeof HdsButtonIndexComponent;
HdsButton: typeof HdsButtonIndexComponent;

// Card
'Hds::Card': typeof HdsCardContainerComponent;
'hds/card': typeof HdsCardContainerComponent;
HdsCard: typeof HdsCardContainerComponent;

// Dismiss button
'Hds::DismissButton': typeof HdsDismissButtonIndexComponent;
'hds/dismiss-button': typeof HdsDismissButtonIndexComponent;
Expand Down
4 changes: 2 additions & 2 deletions showcase/app/routes/components/card.js
Expand Up @@ -7,8 +7,8 @@ import Route from '@ember/routing/route';

import {
DEFAULT_LEVEL as CONTAINER_DEFAULT_LEVEL,
LEVELS as CONTAINER_LEVELS,
BACKGROUNDS as CONTAINER_BACKGROUNDS,
AVAILABLE_LEVELS as CONTAINER_LEVELS,
AVAILABLE_BACKGROUNDS as CONTAINER_BACKGROUNDS,
} from '@hashicorp/design-system-components/components/hds/card/container';
export default class ComponentsCardRoute extends Route {
model() {
Expand Down