diff --git a/web/app-list/app-list-header.css b/web/app-list/app-list-header.css
--- a/web/app-list/app-list-header.css
+++ b/web/app-list/app-list-header.css
@@ -2,11 +2,7 @@
display: flex;
justify-content: space-between;
align-items: center;
- background-color: var(--card-background-primary-default);
padding: 16px;
- box-shadow: 0px 1px 3px 0px var(--card-headerShadow-primary-default);
- z-index: 0;
- border-radius: 8px 8px 0 0;
}
.headerLabel {
diff --git a/web/app-list/app-list.css b/web/app-list/app-list.css
--- a/web/app-list/app-list.css
+++ b/web/app-list/app-list.css
@@ -1,6 +1,4 @@
.container {
- display: flex;
- flex-direction: column;
min-width: 160px;
}
@@ -8,8 +6,5 @@
display: flex;
flex-direction: column;
row-gap: 16px;
- background-color: var(--card-background-primary-default);
padding: 16px;
- flex: 1;
- border-radius: 0 0 8px 8px;
}
diff --git a/web/app-list/app-list.react.js b/web/app-list/app-list.react.js
--- a/web/app-list/app-list.react.js
+++ b/web/app-list/app-list.react.js
@@ -8,6 +8,7 @@
import AppListHeader from './app-list-header.react.js';
import AppListItem from './app-list-item.react.js';
import css from './app-list.css';
+import Panel, { type PanelData } from '../components/panel.react.js';
import { updateNavInfoActionType } from '../redux/action-types.js';
import { useSelector } from '../redux/redux-utils.js';
@@ -80,16 +81,22 @@
[calendarAppListItem, onClickInbox],
);
- const appList = React.useMemo(
- () => (
-
- ),
+ const panelData: $ReadOnlyArray = React.useMemo(
+ () => [
+ {
+ header: ,
+ body: appListBody,
+ classNameOveride: css.container,
+ },
+ ],
[appListBody],
);
+ const appList = React.useMemo(
+ () => ,
+ [panelData],
+ );
+
return appList;
}
diff --git a/web/components/panel.css b/web/components/panel.css
new file mode 100644
--- /dev/null
+++ b/web/components/panel.css
@@ -0,0 +1,32 @@
+.container {
+ display: flex;
+ height: 100%;
+}
+
+.itemContainer {
+ display: flex;
+ flex-direction: column;
+ background-color: var(--card-background-primary-default);
+}
+
+.secondaryItemContainer {
+ background-color: var(--card-background-secondary-default);
+}
+
+.singleItemContainer {
+ border-radius: 8px;
+}
+
+.firstMultiItemContainer {
+ border-radius: 8px 0 0 8px;
+}
+
+.lastMultiItemContainer {
+ border-radius: 0 8px 8px 0;
+}
+
+.headerContainer {
+ height: 56px;
+ box-shadow: 0px 1px 3px 0px var(--card-headerShadow-primary-default);
+ clip-path: inset(0 0 -3px 0);
+}
diff --git a/web/components/panel.react.js b/web/components/panel.react.js
new file mode 100644
--- /dev/null
+++ b/web/components/panel.react.js
@@ -0,0 +1,69 @@
+// @flow
+
+import classnames from 'classnames';
+import * as React from 'react';
+
+import css from './panel.css';
+
+export type PanelData = {
+ +header: React.Node,
+ +body: React.Node,
+ +classNameOveride?: string,
+};
+
+type PanelItemProps = {
+ ...PanelData,
+ +index: number,
+ +numOfItems: number,
+};
+
+function PanelItem(props: PanelItemProps): React.Node {
+ const { header, body, index, numOfItems, classNameOveride } = props;
+
+ const className = classnames(
+ {
+ [css.itemContainer]: true,
+ [css.secondaryItemContainer]: index % 2 === 1,
+ [css.singleItemContainer]: numOfItems === 1,
+ [css.firstMultiItemContainer]: numOfItems > 1 && index === 0,
+ [css.lastMultiItemContainer]: numOfItems > 1 && index === numOfItems - 1,
+ },
+ classNameOveride,
+ );
+
+ return (
+
+ );
+}
+
+type PanelProps = {
+ +panelItems: $ReadOnlyArray,
+};
+
+function Panel(props: PanelProps): React.Node {
+ const { panelItems } = props;
+
+ const items = React.useMemo(
+ () =>
+ panelItems.map((item, index) => {
+ return (
+
+ );
+ }),
+ [panelItems],
+ );
+
+ return {items}
;
+}
+
+export default Panel;
diff --git a/web/theme.css b/web/theme.css
--- a/web/theme.css
+++ b/web/theme.css
@@ -267,6 +267,7 @@
/* Card */
--card-background-primary-default: var(--shades-black-85);
+ --card-background-secondary-default: var(--shades-black-90);
--card-headerShadow-primary-default: var(--shadow-dark-35);
/* Button */
@@ -353,6 +354,7 @@
/* Card */
/* @GINSU: TODO double check these values after redesign is finished */
--card-background-primary-default: var(--shades-white-80);
+ --card-background-secondary-default: var(--shades-white-90);
--card-headerShadow-primary-default: var(--shadow-light-35);
/* Button */