fix(microsite): Add New ribbon in top right corner of PluginCard

Signed-off-by: Carlos Esteban Lopez <lcarlosesteb@vmware.com>
This commit is contained in:
Carlos Esteban Lopez
2023-05-24 17:47:57 -05:00
parent 0eea1e0304
commit 2b9b8fb022
6 changed files with 74 additions and 5 deletions
+7 -1
View File
@@ -1,5 +1,6 @@
import Link from '@docusaurus/Link';
import { SimpleCard } from '@site/src/components/simpleCard/simpleCard';
import clsx from 'clsx';
import React from 'react';
export interface IPluginData {
@@ -10,6 +11,8 @@ export interface IPluginData {
documentation: string;
iconUrl: string;
title: string;
addedDate: string;
isNew: boolean;
order?: number;
}
@@ -22,14 +25,17 @@ export const PluginCard = ({
description,
documentation,
iconUrl,
isNew = false,
title,
}: IPluginData) => (
<SimpleCard
header={
<>
{isNew && <div className="newRibbon">NEW</div>}
<img src={iconUrl || defaultIconUrl} alt={title} />
<h3>{title}</h3>
<h3 className={clsx({ newRibbonPadding: isNew })}>{title}</h3>
<p className="PluginCardAuthor">
by <a href={authorUrl}>{author}</a>
+8 -4
View File
@@ -1,12 +1,14 @@
import Link from '@docusaurus/Link';
import PluginsFilter from '@site/src/components/pluginsFilter/pluginsFilter';
import { calcIsNewPlugin } from '@site/src/util/calcIsNewPlugin';
import { truncateDescription } from '@site/src/util/truncateDescription';
import { ChipCategory } from '@site/src/util/types';
import Layout from '@theme/Layout';
import clsx from 'clsx';
import React, { useState } from 'react';
import { IPluginData, PluginCard } from './_pluginCard';
import pluginsStyles from './plugins.module.scss';
import { ChipCategory } from '@site/src/util/types';
import { truncateDescription } from '@site/src/util/truncateDescription';
import PluginsFilter from '@site/src/components/pluginsFilter/pluginsFilter';
const pluginsContext = require.context(
'../../../data/plugins',
@@ -16,7 +18,9 @@ const pluginsContext = require.context(
const plugins = pluginsContext.keys().reduce(
(acum, id) => {
const pluginData: IPluginData = pluginsContext(id).default;
let pluginData: IPluginData = pluginsContext(id).default;
pluginData = calcIsNewPlugin(pluginData);
acum[
pluginData.category === 'Core Feature' ? 'corePlugins' : 'otherPlugins'
@@ -11,6 +11,7 @@
:global(.card .card__header) {
display: grid;
row-gap: 0.25rem;
position: relative;
column-gap: 1rem;
align-items: center;
grid-template-columns: auto 1fr;
@@ -19,6 +20,28 @@
margin: 0;
}
:global(.newRibbon) {
--paddingX: 1.2lh;
--rotation: 45deg;
--translateX: 30%;
--translateY: -100%;
top: 0;
right: 0;
padding: 0 var(--paddingX);
position: absolute;
text-align: center;
transform: translateY(var(--translateY)) translateX(var(--translateX))
rotate(var(--rotation));
transform-origin: bottom left;
background-color: var(--ifm-color-primary);
}
:global(.newRibbonPadding) {
padding-right: 1.2lh;
}
:global(img) {
width: 80px;
grid-row: 1/4;
+18
View File
@@ -0,0 +1,18 @@
import { DateTime } from 'luxon';
export const newDaysLimit = 100;
export const calcIsNewPlugin = <
T extends { addedDate: string; isNew: boolean },
>(
itemData: T,
) => {
const addedDate = DateTime.fromISO(itemData.addedDate);
const daysOld = Math.abs(addedDate.diffNow('days').days);
const isNew = !isNaN(daysOld) && daysOld < newDaysLimit;
return {
...itemData,
isNew,
};
};