@luscii-healthtech/web-ui 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { IconProps } from "./types/IconProps.type";
3
+ /**
4
+ * When used in components that can support both an icon or an image url, we can use this type.
5
+ * TODO: Use this in the ListComponentItem, to extract the custom logic there rendering images/components
6
+ */
7
+ export declare type DynamicIconProps = {
8
+ icon: React.VoidFunctionComponent<IconProps> | string;
9
+ className?: string;
10
+ };
11
+ export declare const DynamicIcon: React.VoidFunctionComponent<DynamicIconProps>;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import { ListProps, ListItemProps, OnAssetLoadErrorPayload } from "./List.types";
3
3
  export { ListProps, ListItemProps, OnAssetLoadErrorPayload };
4
- export declare const List: ({ title, headerButton, headerTransparent, items, onAssetLoadError, onDragEnd, }: ListProps) => JSX.Element;
4
+ export declare const List: ({ title, headerButton, headerTransparent, items, onAssetLoadError, onDragEnd, emptyStateMessage, }: ListProps) => JSX.Element;
5
5
  export default List;
@@ -29,6 +29,7 @@ export declare type ListProps = {
29
29
  items: ListItemProps[];
30
30
  onAssetLoadError?: (payload: OnAssetLoadErrorPayload) => void;
31
31
  onDragEnd?: (itemId: string | number, newIndex: number) => void;
32
+ emptyStateMessage?: string;
32
33
  };
33
34
  export interface Dragula {
34
35
  destroy?: () => void;
@@ -1,14 +1,18 @@
1
1
  /// <reference types="react" />
2
+ import { DynamicIconProps } from "../Icons/DynamicIcon";
2
3
  export declare type NotificationBannerColor = "base" | "blue" | "red" | "green" | "amber";
3
4
  export interface NotificationBannerLinkProps {
4
5
  text: string;
5
6
  enabled: boolean;
6
7
  handleClick?: () => void;
7
8
  }
8
- interface NotificationBannerProps {
9
+ export interface NotificationBannerProps {
9
10
  text: string;
10
11
  color?: NotificationBannerColor;
11
- icon?: JSX.Element;
12
+ /**
13
+ * The icon can either be one of our icon components or an image url
14
+ */
15
+ icon?: DynamicIconProps["icon"];
12
16
  linkProps?: NotificationBannerLinkProps;
13
17
  className?: string;
14
18
  }
@@ -19,4 +23,3 @@ export declare const NotificationBanner: {
19
23
  onButtonClick: undefined;
20
24
  };
21
25
  };
22
- export {};
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import { BreadcrumbProps } from "../Breadcrumbs/Breadcrumbs";
3
3
  import { TabbarProps } from "../Tabbar/Tabbar";
4
4
  export interface PageHeaderProps {
5
- navigation?: TabbarProps;
5
+ navigation?: Omit<TabbarProps, "withoutPadding">;
6
6
  breadcrumbs?: BreadcrumbProps["crumbs"];
7
7
  dataTestId?: string;
8
8
  title: string;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import "./Title.scss";
3
- export declare type TitleStyle = "sm" | "base" | "lg" | "xl" | "2xl";
3
+ export declare type TitleStyle = "xs" | "sm" | "base" | "lg" | "xl" | "2xl";
4
4
  export interface TextProps {
5
5
  text: string;
6
6
  type?: TitleStyle;
package/dist/index.d.ts CHANGED
@@ -41,6 +41,8 @@ export { Spinner } from "./components/Spinner/Spinner";
41
41
  export { Steps } from "./components/Steps/Steps";
42
42
  export { default as Switcher } from "./components/Switcher/Switcher";
43
43
  export { default as Tabbar, TabbarProps, TabItemDetails, } from "./components/Tabbar/Tabbar";
44
+ export { Breadcrumbs, BreadcrumbProps, } from "./components/Breadcrumbs/Breadcrumbs";
45
+ export { PageHeader, PageHeaderProps, } from "./components/PageHeader/PageHeader";
44
46
  export { default as TabLinks } from "./components/TabLinks/TabLinks";
45
47
  export { default as Tag } from "./components/Tag/Tag";
46
48
  export { default as TagGroup } from "./components/Tag/TagGroup";
@@ -609,6 +609,12 @@ video {
609
609
  }
610
610
  }
611
611
 
612
+ .space-x-1 > :not(template) ~ :not(template) {
613
+ --space-x-reverse: 0;
614
+ margin-right: calc(0.25rem * var(--space-x-reverse));
615
+ margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse)));
616
+ }
617
+
612
618
  .space-x-2 > :not(template) ~ :not(template) {
613
619
  --space-x-reverse: 0;
614
620
  margin-right: calc(0.5rem * var(--space-x-reverse));
@@ -715,6 +721,12 @@ video {
715
721
  background-color: rgba(51, 65, 85, var(--bg-opacity));
716
722
  }
717
723
 
724
+ .bg-amber-50 {
725
+ --bg-opacity: 1;
726
+ background-color: #FEF8E3;
727
+ background-color: rgba(254, 248, 227, var(--bg-opacity));
728
+ }
729
+
718
730
  .bg-primary {
719
731
  --bg-opacity: 1;
720
732
  background-color: #0074DD;
@@ -807,12 +819,6 @@ video {
807
819
  border-color: rgba(197, 48, 48, var(--border-opacity));
808
820
  }
809
821
 
810
- .border-yellow-700 {
811
- --border-opacity: 1;
812
- border-color: #b7791f;
813
- border-color: rgba(183, 121, 31, var(--border-opacity));
814
- }
815
-
816
822
  .border-green-700 {
817
823
  --border-opacity: 1;
818
824
  border-color: #2f855a;
@@ -861,10 +867,10 @@ video {
861
867
  border-color: rgba(71, 85, 105, var(--border-opacity));
862
868
  }
863
869
 
864
- .border-slate-700 {
870
+ .border-amber-700 {
865
871
  --border-opacity: 1;
866
- border-color: #334155;
867
- border-color: rgba(51, 65, 85, var(--border-opacity));
872
+ border-color: #b45309;
873
+ border-color: rgba(180, 83, 9, var(--border-opacity));
868
874
  }
869
875
 
870
876
  .border-primary-dark {
@@ -963,6 +969,11 @@ video {
963
969
  border-bottom-right-radius: 0.25rem;
964
970
  }
965
971
 
972
+ .rounded-b {
973
+ border-bottom-right-radius: 0.25rem;
974
+ border-bottom-left-radius: 0.25rem;
975
+ }
976
+
966
977
  .rounded-l {
967
978
  border-top-left-radius: 0.25rem;
968
979
  border-bottom-left-radius: 0.25rem;
@@ -1173,6 +1184,10 @@ video {
1173
1184
  height: 3rem;
1174
1185
  }
1175
1186
 
1187
+ .h-13 {
1188
+ height: 3.25rem;
1189
+ }
1190
+
1176
1191
  .h-56 {
1177
1192
  height: 14rem;
1178
1193
  }
@@ -1201,6 +1216,10 @@ video {
1201
1216
  font-size: 0.875rem;
1202
1217
  }
1203
1218
 
1219
+ .text-base {
1220
+ font-size: 1rem;
1221
+ }
1222
+
1204
1223
  .text-lg {
1205
1224
  font-size: 1.125rem;
1206
1225
  }
@@ -1773,6 +1792,12 @@ video {
1773
1792
  color: rgba(30, 41, 59, var(--text-opacity));
1774
1793
  }
1775
1794
 
1795
+ .text-amber-700 {
1796
+ --text-opacity: 1;
1797
+ color: #b45309;
1798
+ color: rgba(180, 83, 9, var(--text-opacity));
1799
+ }
1800
+
1776
1801
  .text-primary {
1777
1802
  --text-opacity: 1;
1778
1803
  color: #0074DD;
@@ -859,6 +859,7 @@ var Title = function Title(props) {
859
859
  var containerClassName = classNames("title", //this is used to load the correct font from the css
860
860
  "font-bold", {
861
861
  "text-slate-700": !((_props$className = props.className) != null && _props$className.match(/\s(text-)/)),
862
+ "text-base": props.type === "xs",
862
863
  "text-xl": props.type === "sm",
863
864
  "text-2xl": props.type === "base",
864
865
  "text-3xl": props.type === "lg",
@@ -2691,7 +2692,8 @@ var List = function List(_ref) {
2691
2692
  headerTransparent = _ref.headerTransparent,
2692
2693
  items = _ref.items,
2693
2694
  onAssetLoadError = _ref.onAssetLoadError,
2694
- onDragEnd = _ref.onDragEnd;
2695
+ onDragEnd = _ref.onDragEnd,
2696
+ emptyStateMessage = _ref.emptyStateMessage;
2695
2697
  var listRef = React.useRef(null);
2696
2698
  var dragulaRef = React.useRef(null);
2697
2699
  var hasHeader = !!(title || headerButton);
@@ -2740,11 +2742,14 @@ var List = function List(_ref) {
2740
2742
  return dragulaInstance;
2741
2743
  };
2742
2744
 
2745
+ var roundTop = !hasHeader || hasHeader && headerTransparent;
2743
2746
  return /*#__PURE__*/React__default.createElement("div", {
2744
2747
  "data-test-id": "list-component"
2745
2748
  }, (title || headerButton) && /*#__PURE__*/React__default.createElement("div", {
2746
2749
  "data-test-id": "list-header",
2747
- className: classNames("flex rounded-t flex-row items-center py-4 space-x-4", {
2750
+ className: classNames("flex rounded-t flex-row items-center space-x-4", {
2751
+ "py-4": !headerButton,
2752
+ "py-2": headerButton,
2748
2753
  "bg-white border-b border-slate-100 px-4": !headerTransparent,
2749
2754
  "mb-px": headerTransparent,
2750
2755
  "justify-between": title && headerButton,
@@ -2752,20 +2757,25 @@ var List = function List(_ref) {
2752
2757
  "justify-end": !title && headerButton
2753
2758
  })
2754
2759
  }, title && /*#__PURE__*/React__default.createElement(Title, {
2755
- type: "sm",
2760
+ type: "xs",
2756
2761
  text: title
2757
2762
  }), !!headerButton && /*#__PURE__*/React__default.createElement("div", {
2758
2763
  className: "space-x-3"
2759
2764
  }, /*#__PURE__*/React__default.createElement(headerButton.buttonType, headerButton.buttonProps))), /*#__PURE__*/React__default.createElement("ul", {
2760
- className: classNames("list-none"),
2761
2765
  ref: listRef
2762
2766
  }, items.map(function (item) {
2763
2767
  return /*#__PURE__*/React__default.createElement(ListItem, Object.assign({}, item, {
2764
- roundTop: !hasHeader || hasHeader && headerTransparent,
2768
+ roundTop: roundTop,
2765
2769
  key: item.itemId,
2766
2770
  onAssetLoadError: onAssetLoadError,
2767
2771
  isDraggable: !!onDragEnd
2768
2772
  }));
2773
+ })), items.length === 0 && emptyStateMessage && /*#__PURE__*/React__default.createElement("div", {
2774
+ className: classNames("p-4 bg-white rounded-b", {
2775
+ "first:rounded-t": roundTop
2776
+ })
2777
+ }, /*#__PURE__*/React__default.createElement(Text, {
2778
+ text: emptyStateMessage
2769
2779
  })));
2770
2780
  };
2771
2781
 
@@ -3091,13 +3101,29 @@ var TextLink = function TextLink(props) {
3091
3101
  }, props.text);
3092
3102
  };
3093
3103
 
3104
+ var DynamicIcon = function DynamicIcon(props) {
3105
+ var icon = props.icon,
3106
+ className = props.className;
3107
+
3108
+ if (typeof icon === "string") {
3109
+ return /*#__PURE__*/React__default.createElement("img", {
3110
+ src: icon,
3111
+ className: className
3112
+ });
3113
+ }
3114
+
3115
+ return /*#__PURE__*/React__default.createElement(icon, {
3116
+ className: className
3117
+ });
3118
+ };
3119
+
3094
3120
  var NotificationBanner = function NotificationBanner(props) {
3095
- var classes = classNames("w-full px-6 py-2 flex flex-row items-center border border-solid rounded", props.className, {
3096
- "bg-slate-50 border-slate-700": props.color === "base",
3097
- "bg-blue-50 border-blue-700": props.color === "blue",
3098
- "bg-red-50 border-red-700": props.color === "red",
3099
- "bg-green-50 border-green-700": props.color === "green",
3100
- "bg-yellow-50 border-yellow-700": props.color === "amber"
3121
+ var classes = classNames("w-full px-6 py-4 h-13 flex flex-row items-center border border-solid rounded", props.className, {
3122
+ "bg-slate-100 border-slate-300 text-slate-700": props.color === "base",
3123
+ "bg-blue-50 border-blue-700 text-blue-800": props.color === "blue",
3124
+ "bg-red-50 border-red-700 text-red-700": props.color === "red",
3125
+ "bg-green-50 border-green-700 text-green-700": props.color === "green",
3126
+ "bg-amber-50 border-amber-700 text-amber-700": props.color === "amber"
3101
3127
  });
3102
3128
  var textColor = {
3103
3129
  red: "red",
@@ -3107,20 +3133,27 @@ var NotificationBanner = function NotificationBanner(props) {
3107
3133
  // Blue must be 800 here to pass the contrast test
3108
3134
  blue: "blue-800"
3109
3135
  };
3136
+ var color = props.color ? textColor[props.color] : "base";
3110
3137
  return /*#__PURE__*/React__default.createElement("div", {
3111
3138
  className: classes
3112
- }, props.icon, /*#__PURE__*/React__default.createElement(Text, {
3113
- className: "ml-4 first:ml-0",
3139
+ }, props.icon && /*#__PURE__*/React__default.createElement(DynamicIcon, {
3140
+ className: "w-6 h-6",
3141
+ icon: props.icon
3142
+ }), /*#__PURE__*/React__default.createElement("div", {
3143
+ className: "flex flex-row items-center space-x-1"
3144
+ }, /*#__PURE__*/React__default.createElement(Text, {
3145
+ className: classNames({
3146
+ "ml-3": props.icon
3147
+ }),
3114
3148
  text: props.text,
3115
- color: props.color ? textColor[props.color] : "base"
3149
+ color: color
3116
3150
  }), props.linkProps && /*#__PURE__*/React__default.createElement(TextLink, {
3117
- className: "ml-4",
3118
3151
  text: props.linkProps.text,
3119
3152
  enabled: props.linkProps.enabled,
3120
3153
  rel: "noopener",
3121
3154
  target: "_blank",
3122
3155
  onClick: props.linkProps.handleClick
3123
- }));
3156
+ })));
3124
3157
  };
3125
3158
  NotificationBanner.defaultProps = {
3126
3159
  color: "base",
@@ -4060,6 +4093,63 @@ var Tabbar = function Tabbar(_ref) {
4060
4093
  }));
4061
4094
  };
4062
4095
 
4096
+ var Breadcrumbs = function Breadcrumbs(_ref) {
4097
+ var crumbs = _ref.crumbs;
4098
+ var breadcrumbItems = crumbs.map(function (_ref2) {
4099
+ var name = _ref2.name,
4100
+ link = _ref2.link;
4101
+ return /*#__PURE__*/React__default.createElement("li", {
4102
+ key: name,
4103
+ className: "flex flex-row items-center slash-split "
4104
+ }, link ? /*#__PURE__*/React__default.createElement(router.Link, {
4105
+ to: link
4106
+ }, /*#__PURE__*/React__default.createElement(Text, {
4107
+ text: name,
4108
+ color: "blue-800"
4109
+ })) : /*#__PURE__*/React__default.createElement(Text, {
4110
+ text: name
4111
+ }));
4112
+ });
4113
+ return /*#__PURE__*/React__default.createElement("ul", {
4114
+ "data-test-id": "breadcrumbs",
4115
+ className: "flex flex-row items-center space-x-2 "
4116
+ }, breadcrumbItems);
4117
+ };
4118
+
4119
+ var PageHeader = function PageHeader(_ref) {
4120
+ var navigation = _ref.navigation,
4121
+ breadcrumbs = _ref.breadcrumbs,
4122
+ dataTestId = _ref.dataTestId,
4123
+ accessories = _ref.accessories,
4124
+ isPolling = _ref.isPolling,
4125
+ title = _ref.title;
4126
+ return /*#__PURE__*/React__default.createElement("div", {
4127
+ "data-test-id": "page-header",
4128
+ className: "p-4 space-y-4 bg-white"
4129
+ }, !!(breadcrumbs != null && breadcrumbs.length) && /*#__PURE__*/React__default.createElement("div", {
4130
+ className: "mb-4 space-y-4"
4131
+ }, /*#__PURE__*/React__default.createElement(Breadcrumbs, {
4132
+ crumbs: breadcrumbs
4133
+ }), /*#__PURE__*/React__default.createElement("div", {
4134
+ className: "mb-4 border-b border-slate-100"
4135
+ })), /*#__PURE__*/React__default.createElement("div", {
4136
+ className: "flex flex-row items-center justify-between"
4137
+ }, /*#__PURE__*/React__default.createElement("div", {
4138
+ className: "flex flex-row items-center space-x-3"
4139
+ }, /*#__PURE__*/React__default.createElement(Title, {
4140
+ "data-test-id": dataTestId + "-title",
4141
+ text: title
4142
+ }), isPolling && /*#__PURE__*/React__default.createElement(LoadingIndicator, {
4143
+ asSpinner: true,
4144
+ className: "page-spinner",
4145
+ spinnerColor: "gray"
4146
+ })), accessories && /*#__PURE__*/React__default.createElement("div", {
4147
+ "data-test-id": "page-header-accessories"
4148
+ }, accessories)), navigation && /*#__PURE__*/React__default.createElement(Tabbar, Object.assign({}, navigation, {
4149
+ withoutPadding: true
4150
+ })));
4151
+ };
4152
+
4063
4153
  var TabLinksSelect = function TabLinksSelect(_ref) {
4064
4154
  var items = _ref.items,
4065
4155
  navigate = _ref.navigate,
@@ -5219,6 +5309,7 @@ exports.AlertsIcon = AlertsIcon;
5219
5309
  exports.Avatar = Avatar;
5220
5310
  exports.Badge = Badge;
5221
5311
  exports.BellIcon = BellIcon;
5312
+ exports.Breadcrumbs = Breadcrumbs;
5222
5313
  exports.CRUDPage = CRUDPage;
5223
5314
  exports.Carousel = Carousel;
5224
5315
  exports.CenteredHero = CenteredHero;
@@ -5262,6 +5353,7 @@ exports.NavMenu = NavMenu;
5262
5353
  exports.NotesIcon = NotesIcon;
5263
5354
  exports.NotificationBanner = NotificationBanner;
5264
5355
  exports.Page = Page;
5356
+ exports.PageHeader = PageHeader;
5265
5357
  exports.PaginationMenu = PaginationMenu;
5266
5358
  exports.PinIcon = PinIcon;
5267
5359
  exports.PreviewPhone = PreviewPhone;