@qoretechnologies/reqore 0.36.4 → 0.36.6

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.
Files changed (64) hide show
  1. package/__tests__/breadcrumbs.test.tsx +1 -2
  2. package/__tests__/control_group.test.tsx +0 -1
  3. package/dist/components/Breadcrumbs/index.d.ts +3 -0
  4. package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
  5. package/dist/components/Breadcrumbs/index.js +11 -22
  6. package/dist/components/Breadcrumbs/index.js.map +1 -1
  7. package/dist/components/Breadcrumbs/item.d.ts.map +1 -1
  8. package/dist/components/Breadcrumbs/item.js +6 -1
  9. package/dist/components/Breadcrumbs/item.js.map +1 -1
  10. package/dist/components/Button/index.d.ts +2 -1
  11. package/dist/components/Button/index.d.ts.map +1 -1
  12. package/dist/components/Button/index.js +4 -1
  13. package/dist/components/Button/index.js.map +1 -1
  14. package/dist/components/ControlGroup/index.d.ts +2 -1
  15. package/dist/components/ControlGroup/index.d.ts.map +1 -1
  16. package/dist/components/ControlGroup/index.js +29 -14
  17. package/dist/components/ControlGroup/index.js.map +1 -1
  18. package/dist/components/Input/index.d.ts +2 -3
  19. package/dist/components/Input/index.d.ts.map +1 -1
  20. package/dist/components/Input/index.js.map +1 -1
  21. package/dist/components/Panel/index.d.ts +2 -0
  22. package/dist/components/Panel/index.d.ts.map +1 -1
  23. package/dist/components/Panel/index.js +5 -3
  24. package/dist/components/Panel/index.js.map +1 -1
  25. package/dist/components/Table/header.d.ts +1 -1
  26. package/dist/components/Table/header.d.ts.map +1 -1
  27. package/dist/components/Table/header.js +2 -2
  28. package/dist/components/Table/header.js.map +1 -1
  29. package/dist/components/Table/headerCell.d.ts +3 -3
  30. package/dist/components/Table/headerCell.d.ts.map +1 -1
  31. package/dist/components/Table/headerCell.js +5 -6
  32. package/dist/components/Table/headerCell.js.map +1 -1
  33. package/dist/components/Table/index.d.ts +3 -2
  34. package/dist/components/Table/index.d.ts.map +1 -1
  35. package/dist/components/Table/index.js.map +1 -1
  36. package/dist/helpers/utils.d.ts +2 -0
  37. package/dist/helpers/utils.d.ts.map +1 -1
  38. package/dist/helpers/utils.js +25 -1
  39. package/dist/helpers/utils.js.map +1 -1
  40. package/dist/hooks/usePopover.d.ts +1 -0
  41. package/dist/hooks/usePopover.d.ts.map +1 -1
  42. package/dist/hooks/usePopover.js +1 -1
  43. package/dist/hooks/usePopover.js.map +1 -1
  44. package/dist/hooks/useTooltip.d.ts.map +1 -1
  45. package/dist/hooks/useTooltip.js +3 -2
  46. package/dist/hooks/useTooltip.js.map +1 -1
  47. package/package.json +2 -1
  48. package/src/components/Breadcrumbs/index.tsx +21 -40
  49. package/src/components/Breadcrumbs/item.tsx +6 -0
  50. package/src/components/Button/index.tsx +3 -1
  51. package/src/components/ControlGroup/index.tsx +54 -24
  52. package/src/components/Input/index.tsx +4 -2
  53. package/src/components/Panel/index.tsx +16 -3
  54. package/src/components/Table/header.tsx +9 -12
  55. package/src/components/Table/headerCell.tsx +151 -144
  56. package/src/components/Table/index.tsx +4 -2
  57. package/src/helpers/utils.ts +22 -0
  58. package/src/hooks/usePopover.tsx +2 -1
  59. package/src/hooks/useTooltip.ts +7 -3
  60. package/src/stories/ControlGroup/ControlGroup.stories.tsx +1 -1
  61. package/src/stories/Panel/Panel.stories.tsx +55 -0
  62. package/src/stories/Table/Table.stories.tsx +23 -1
  63. package/tests.json +1 -1
  64. package/src/stories/Table/Tests.stories.tsx +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"useTooltip.d.ts","sourceRoot":"","sources":["../../src/hooks/useTooltip.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrE,eAAO,MAAM,UAAU,kBACN,WAAW,GAAG,SAAS,YAC5B,kBAAkB,KAC3B,IAkBF,CAAC"}
1
+ {"version":3,"file":"useTooltip.d.ts","sourceRoot":"","sources":["../../src/hooks/useTooltip.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrE,eAAO,MAAM,UAAU,kBACN,WAAW,GAAG,SAAS,YAC5B,kBAAkB,KAC3B,IAsBF,CAAC"}
@@ -20,12 +20,13 @@ var usePopover_1 = __importDefault(require("./usePopover"));
20
20
  var useTooltip = function (targetElement, tooltip) {
21
21
  var _a = (0, react_1.useState)(undefined), element = _a[0], setElement = _a[1];
22
22
  var _b = (0, react_1.useState)(undefined), data = _b[0], setData = _b[1];
23
+ var content = (0, react_1.useMemo)(function () { return (typeof tooltip === 'object' ? tooltip === null || tooltip === void 0 ? void 0 : tooltip.content : tooltip); }, [tooltip]);
23
24
  (0, react_1.useEffect)(function () {
24
- if (targetElement && tooltip) {
25
+ if (targetElement && content) {
25
26
  setElement(targetElement);
26
27
  setData(tooltip);
27
28
  }
28
- }, [targetElement === null || targetElement === void 0 ? void 0 : targetElement.toString(), tooltip === null || tooltip === void 0 ? void 0 : tooltip.toString()]);
29
+ }, [targetElement, content]);
29
30
  var popoverData = typeof data === 'string' ? { content: data } : data;
30
31
  (0, usePopover_1["default"])(__assign(__assign({}, popoverData), { targetElement: element, show: !!(popoverData === null || popoverData === void 0 ? void 0 : popoverData.content) }));
31
32
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useTooltip.js","sourceRoot":"","sources":["../../src/hooks/useTooltip.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+BAA4C;AAE5C,4DAAsC;AAE/B,IAAM,UAAU,GAAG,UACxB,aAAsC,EACtC,OAA4B;IAEtB,IAAA,KAAwB,IAAA,gBAAQ,EAA0B,SAAS,CAAC,EAAnE,OAAO,QAAA,EAAE,UAAU,QAAgD,CAAC;IACrE,IAAA,KAAkB,IAAA,gBAAQ,EAAsC,SAAS,CAAC,EAAzE,IAAI,QAAA,EAAE,OAAO,QAA4D,CAAC;IAEjF,IAAA,iBAAS,EAAC;QACR,IAAI,aAAa,IAAI,OAAO,EAAE;YAC5B,UAAU,CAAC,aAAa,CAAC,CAAC;YAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;SAClB;IACH,CAAC,EAAE,CAAC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,QAAQ,EAAE,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAErD,IAAM,WAAW,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,IAAA,uBAAU,wBACL,WAAW,KACd,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,CAAC,CAAC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAA,IAC5B,CAAC;AACL,CAAC,CAAC;AArBW,QAAA,UAAU,cAqBrB"}
1
+ {"version":3,"file":"useTooltip.js","sourceRoot":"","sources":["../../src/hooks/useTooltip.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+BAAqD;AAErD,4DAAsC;AAE/B,IAAM,UAAU,GAAG,UACxB,aAAsC,EACtC,OAA4B;IAEtB,IAAA,KAAwB,IAAA,gBAAQ,EAA0B,SAAS,CAAC,EAAnE,OAAO,QAAA,EAAE,UAAU,QAAgD,CAAC;IACrE,IAAA,KAAkB,IAAA,gBAAQ,EAAsC,SAAS,CAAC,EAAzE,IAAI,QAAA,EAAE,OAAO,QAA4D,CAAC;IACjF,IAAM,OAAO,GAAG,IAAA,eAAO,EACrB,cAAM,OAAA,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAA1D,CAA0D,EAChE,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,IAAA,iBAAS,EAAC;QACR,IAAI,aAAa,IAAI,OAAO,EAAE;YAC5B,UAAU,CAAC,aAAa,CAAC,CAAC;YAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;SAClB;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAE7B,IAAM,WAAW,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,IAAA,uBAAU,wBACL,WAAW,KACd,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,CAAC,CAAC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAA,IAC5B,CAAC;AACL,CAAC,CAAC;AAzBW,QAAA,UAAU,cAyBrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qoretechnologies/reqore",
3
- "version": "0.36.4",
3
+ "version": "0.36.6",
4
4
  "description": "ReQore is a highly theme-able and modular UI library for React",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -96,6 +96,7 @@
96
96
  "@react-spring/web": "^9.6.1",
97
97
  "classnames": "^2.2.6",
98
98
  "epoch-timeago": "^1.1.9",
99
+ "fast-json-stable-stringify": "^2.1.0",
99
100
  "lodash": "^4.17.21",
100
101
  "polished": "^4.2.2",
101
102
  "re-resizable": "^6.9.0",
@@ -2,12 +2,11 @@ import { isArray } from 'lodash';
2
2
  import React, { useMemo } from 'react';
3
3
  import { useMeasure } from 'react-use';
4
4
  import styled, { css } from 'styled-components';
5
- import { ReqorePopover } from '../..';
5
+ import { ReqoreDropdown } from '../..';
6
6
  import {
7
7
  ICON_FROM_SIZE,
8
8
  MARGIN_FROM_SIZE,
9
9
  PADDING_FROM_SIZE,
10
- TABS_SIZE_TO_PX,
11
10
  TEXT_FROM_SIZE,
12
11
  TSizes,
13
12
  } from '../../constants/sizes';
@@ -16,13 +15,12 @@ import { changeLightness, getReadableColor, getReadableColorFrom } from '../../h
16
15
  import { calculateStringSizeInPixels } from '../../helpers/utils';
17
16
  import { useReqoreTheme } from '../../hooks/useTheme';
18
17
  import { IReqoreButtonProps } from '../Button';
18
+ import { IReqoreDropdownItem } from '../Dropdown/list';
19
19
  import ReqoreIcon from '../Icon';
20
- import ReqoreMenu from '../Menu';
21
- import ReqoreMenuItem from '../Menu/item';
22
20
  import { IReqoreTabsListItem } from '../Tabs';
23
21
  import { StyledTabListItem } from '../Tabs/item';
24
22
  import ReqoreTabsList, { StyledReqoreTabsList, getTabsLength } from '../Tabs/list';
25
- import ReqoreBreadcrumbsItem, { IReqoreBreadcrumbItemProps } from './item';
23
+ import ReqoreBreadcrumbsItem from './item';
26
24
 
27
25
  export interface IReqoreBreadcrumbItemTabs {
28
26
  tabs: IReqoreTabsListItem[];
@@ -46,6 +44,11 @@ export interface IReqoreBreadcrumbsProps extends React.HTMLAttributes<HTMLDivEle
46
44
  customTheme?: IReqoreBreadcrumbsTheme;
47
45
  size?: TSizes;
48
46
  flat?: boolean;
47
+
48
+ responsive?: boolean;
49
+
50
+ padded?: boolean;
51
+ margin?: 'top' | 'bottom' | 'both' | 'none';
49
52
  }
50
53
 
51
54
  interface IStyledBreadcrumbs extends Omit<IReqoreBreadcrumbsProps, 'items'> {
@@ -53,12 +56,12 @@ interface IStyledBreadcrumbs extends Omit<IReqoreBreadcrumbsProps, 'items'> {
53
56
  }
54
57
 
55
58
  const StyledReqoreBreadcrumbs = styled.div<IStyledBreadcrumbs>`
56
- ${({ theme, size, flat }: IStyledBreadcrumbs) => css`
57
- width: 100%;
58
- min-height: ${TABS_SIZE_TO_PX[size!]}px;
59
- margin: ${MARGIN_FROM_SIZE[size!]}px 0;
59
+ ${({ theme, size, flat, padded = true, margin = 'both', responsive }: IStyledBreadcrumbs) => css`
60
+ width: ${responsive ? '100%' : undefined};
61
+ margin-top: ${margin === 'both' || margin === 'top' ? MARGIN_FROM_SIZE[size!] : 0}px;
62
+ margin-bottom: $ ${margin === 'both' || margin === 'bottom' ? MARGIN_FROM_SIZE[size!] : 0}px;
60
63
  display: flex;
61
- padding: 0 ${PADDING_FROM_SIZE[size!]}px;
64
+ padding: 0 ${padded ? PADDING_FROM_SIZE[size!] : 0}px;
62
65
  justify-content: space-between;
63
66
  border-bottom: ${flat ? undefined : `1px solid ${changeLightness(theme.main, 0.05)}`};
64
67
  background-color: ${({ theme }: { theme: IReqoreTheme }) =>
@@ -166,13 +169,14 @@ const ReqoreBreadcrumbs: React.FC<IReqoreBreadcrumbsProps> = ({
166
169
  customTheme,
167
170
  flat,
168
171
  size = 'normal',
172
+ responsive = true,
169
173
  ...rest
170
174
  }: IReqoreBreadcrumbsProps) => {
171
175
  const [ref, { width }] = useMeasure();
172
176
  const theme = useReqoreTheme('breadcrumbs', customTheme);
173
177
  const transformedItems = useMemo(
174
- () => getTransformedItems(items, _testWidth || width, size),
175
- [items, width, _testWidth]
178
+ () => (responsive ? getTransformedItems(items, _testWidth || width, size) : items),
179
+ [items, width, _testWidth, size]
176
180
  );
177
181
 
178
182
  const renderItem = (item: IReqoreBreadcrumbItem | IReqoreBreadcrumbItem[], index: number) => {
@@ -180,36 +184,12 @@ const ReqoreBreadcrumbs: React.FC<IReqoreBreadcrumbsProps> = ({
180
184
  return (
181
185
  <React.Fragment key={index}>
182
186
  <ReqoreIcon icon='ArrowRightSLine' size={size} key={'icon' + index} margin='both' />
183
- <ReqorePopover
184
- key={index}
185
- component={ReqoreBreadcrumbsItem}
186
- isReqoreComponent
187
- componentProps={
188
- {
189
- icon: 'MoreFill',
190
- interactive: true,
191
- } as IReqoreBreadcrumbItemProps
192
- }
187
+ <ReqoreDropdown
188
+ key={`dropdown-${index}`}
189
+ icon='MoreFill'
193
190
  handler='hoverStay'
194
191
  delay={500}
195
- content={
196
- <ReqoreMenu>
197
- {item.map(({ icon, label, as, tooltip, props }) => (
198
- <ReqoreMenuItem
199
- {...props}
200
- icon={icon}
201
- as={as}
202
- onClick={(event) => {
203
- props?.onClick?.(event);
204
- }}
205
- tooltip={tooltip}
206
- key={index + (label || icon || '')}
207
- >
208
- {label}
209
- </ReqoreMenuItem>
210
- ))}
211
- </ReqoreMenu>
212
- }
192
+ items={item as IReqoreDropdownItem[]}
213
193
  />
214
194
  </React.Fragment>
215
195
  );
@@ -250,6 +230,7 @@ const ReqoreBreadcrumbs: React.FC<IReqoreBreadcrumbsProps> = ({
250
230
  flat={flat}
251
231
  theme={theme}
252
232
  size={size}
233
+ responsive={responsive}
253
234
  >
254
235
  <div key='reqore-breadcrumbs-left-wrapper'>
255
236
  {transformedItems.map(
@@ -28,6 +28,12 @@ const ReqoreBreadcrumbsItem = forwardRef<HTMLButtonElement, IReqoreBreadcrumbIte
28
28
  flat
29
29
  {...rest}
30
30
  {...props}
31
+ onClick={(e) => {
32
+ e.persist();
33
+ e.stopPropagation();
34
+
35
+ rest.onClick?.(e);
36
+ }}
31
37
  >
32
38
  {label}
33
39
  </ReqoreButton>
@@ -79,7 +79,8 @@ export interface IReqoreButtonProps
79
79
  descriptionEffect?: IReqoreEffect;
80
80
  label?: React.HTMLAttributes<HTMLButtonElement>['children'];
81
81
  as?: string | React.ElementType;
82
- grow?: 1 | 2 | 3 | 4;
82
+ grow?: 0 | 1 | 2 | 3 | 4;
83
+ shrink?: 0 | 1 | 2 | 3 | 4;
83
84
  rounded?: boolean;
84
85
  }
85
86
 
@@ -132,6 +133,7 @@ export const StyledButton = styled(StyledEffect)<IReqoreButtonStyle>`
132
133
  : null}
133
134
 
134
135
  flex: ${({ fluid, fixed }) => (fixed ? '0 0 auto' : fluid ? '1 auto' : '0 0 auto')};
136
+ flex-shrink: ${({ shrink }) => shrink};
135
137
  flex-grow: ${({ grow }) => grow};
136
138
  align-self: ${({ fixed, fluid }) => (fixed ? 'flex-start' : fluid ? 'stretch' : undefined)};
137
139
 
@@ -45,6 +45,7 @@ export interface IReqoreControlGroupProps
45
45
  isLastInFirstGroup?: boolean;
46
46
  isLastInLastGroup?: boolean;
47
47
  isFirstInLastGroup?: boolean;
48
+ isMasterGroupRounded?: boolean;
48
49
  childrenCount?: number;
49
50
  childId?: number;
50
51
  isChild?: boolean;
@@ -131,6 +132,7 @@ const ReqoreControlGroup = memo(
131
132
  stack,
132
133
  isInsideStackGroup,
133
134
  isInsideVerticalGroup,
135
+ isMasterGroupRounded,
134
136
  intent,
135
137
  customTheme,
136
138
  isFirst,
@@ -246,7 +248,14 @@ const ReqoreControlGroup = memo(
246
248
  : isLastGroup && (isLast || isLast !== false) && index === realChildCount - 1;
247
249
  };
248
250
 
249
- const getBorderTopLeftRadius = (index: number): number | undefined => {
251
+ const getBorderTopLeftRadius = (
252
+ index: number,
253
+ isChildRounded?: boolean
254
+ ): number | undefined => {
255
+ if (isMasterGroupRounded === false || isChildRounded === false) {
256
+ return undefined;
257
+ }
258
+
250
259
  const _isFirstGroup =
251
260
  !isInsideStackGroup || childrenCount === 1 ? true : isChild ? isFirstGroup : index === 0;
252
261
 
@@ -258,7 +267,14 @@ const ReqoreControlGroup = memo(
258
267
  return undefined;
259
268
  };
260
269
 
261
- const getBorderTopRightRadius = (index: number): number | undefined => {
270
+ const getBorderTopRightRadius = (
271
+ index: number,
272
+ isChildRounded?: boolean
273
+ ): number | undefined => {
274
+ if (isMasterGroupRounded === false || isChildRounded === false) {
275
+ return undefined;
276
+ }
277
+
262
278
  // If this group is not vertical we need to style the very last item
263
279
  if (!isVertical || !isStack) {
264
280
  const _isLastGroup =
@@ -284,7 +300,14 @@ const ReqoreControlGroup = memo(
284
300
  return undefined;
285
301
  };
286
302
 
287
- const getBorderBottomLeftRadius = (index: number): number | undefined => {
303
+ const getBorderBottomLeftRadius = (
304
+ index: number,
305
+ isChildRounded?: boolean
306
+ ): number | undefined => {
307
+ if (isMasterGroupRounded === false || isChildRounded === false) {
308
+ return undefined;
309
+ }
310
+
288
311
  // If this group is not vertical we need to style the very first item
289
312
  if (!isVertical || !isStack) {
290
313
  const _isFirstGroup =
@@ -306,7 +329,14 @@ const ReqoreControlGroup = memo(
306
329
  return undefined;
307
330
  };
308
331
 
309
- const getBorderBottomRightRadius = (index: number): number | undefined => {
332
+ const getBorderBottomRightRadius = (
333
+ index: number,
334
+ isChildRounded?: boolean
335
+ ): number | undefined => {
336
+ if (isMasterGroupRounded === false || isChildRounded === false) {
337
+ return undefined;
338
+ }
339
+
310
340
  const _isLastGroup =
311
341
  !isInsideStackGroup || childrenCount === 1
312
342
  ? true
@@ -334,7 +364,7 @@ const ReqoreControlGroup = memo(
334
364
 
335
365
  let newProps = {
336
366
  ...child.props,
337
- key: child.props.reactKey || child.props.key || child.key || _index,
367
+ key: child.props.reactKey || _index,
338
368
  minimal:
339
369
  child.props?.minimal || child.props?.minimal === false
340
370
  ? child.props.minimal
@@ -354,18 +384,20 @@ const ReqoreControlGroup = memo(
354
384
  newProps = {
355
385
  ...newProps,
356
386
  style: {
357
- borderTopLeftRadius:
358
- child.props?.rounded === false ? undefined : getBorderTopLeftRadius(index),
359
- borderBottomLeftRadius:
360
- child.props?.rounded === false ? undefined : getBorderBottomLeftRadius(index),
361
- borderTopRightRadius:
362
- child.props?.rounded === false ? undefined : getBorderTopRightRadius(index),
363
- borderBottomRightRadius:
364
- child.props?.rounded === false ? undefined : getBorderBottomRightRadius(index),
387
+ borderTopLeftRadius: getBorderTopLeftRadius(index, child.props?.rounded),
388
+ borderBottomLeftRadius: getBorderBottomLeftRadius(index, child.props?.rounded),
389
+ borderTopRightRadius: getBorderTopRightRadius(index, child.props?.rounded),
390
+ borderBottomRightRadius: getBorderBottomRightRadius(index, child.props?.rounded),
365
391
  ...(child.props?.style || {}),
366
392
  },
367
393
  isChild: true,
368
- rounded: !isStack,
394
+ rounded:
395
+ isMasterGroupRounded === false
396
+ ? false
397
+ : child.props?.rounded || child.props?.rounded === false
398
+ ? child.props.rounded
399
+ : !isStack,
400
+ isMasterGroupRounded: isChild ? isMasterGroupRounded : rounded,
369
401
  isInsideStackGroup: isStack,
370
402
  isInsideVerticalGroup: isVertical,
371
403
  isFirst: isChild ? getIsFirst(index) : undefined,
@@ -410,6 +442,7 @@ const ReqoreControlGroup = memo(
410
442
  minimal,
411
443
  size,
412
444
  intent,
445
+ rounded,
413
446
  ]
414
447
  );
415
448
 
@@ -431,13 +464,14 @@ const ReqoreControlGroup = memo(
431
464
  icon='MenuLine'
432
465
  customTheme={customTheme}
433
466
  tooltip={{
434
- content: `Show ${React.Children.count(overflownChildren)} hidden items`,
467
+ handler: 'click',
468
+ content: (
469
+ <ReqoreControlGroup fluid wrap>
470
+ {overflownChildren}
471
+ </ReqoreControlGroup>
472
+ ),
435
473
  }}
436
474
  active={isOverflownDialogOpen}
437
- onClick={(e: React.MouseEvent<HTMLButtonElement>) => {
438
- e.stopPropagation();
439
- setIsOverflownDialogOpen(!isOverflownDialogOpen);
440
- }}
441
475
  flat
442
476
  fixed
443
477
  />,
@@ -460,11 +494,7 @@ const ReqoreControlGroup = memo(
460
494
  label='Hidden items'
461
495
  minSize='100px'
462
496
  size='auto'
463
- >
464
- <ReqoreControlGroup fluid wrap>
465
- {overflownChildren}
466
- </ReqoreControlGroup>
467
- </ReqoreDrawer>
497
+ ></ReqoreDrawer>
468
498
  ) : null}
469
499
  <StyledReqoreControlGroup
470
500
  as='div'
@@ -22,6 +22,7 @@ import {
22
22
  IReqoreReadOnly,
23
23
  IWithReqoreCustomTheme,
24
24
  IWithReqoreEffect,
25
+ IWithReqoreTooltip,
25
26
  } from '../../types/global';
26
27
  import { IReqoreIconName } from '../../types/icons';
27
28
  import { StyledEffect, TReqoreEffectColor } from '../Effect';
@@ -34,9 +35,10 @@ export interface IReqoreInputProps
34
35
  IReqoreReadOnly,
35
36
  IReqoreIntent,
36
37
  IWithReqoreCustomTheme,
37
- IWithReqoreEffect {
38
+ IWithReqoreEffect,
39
+ IWithReqoreTooltip {
38
40
  autoFocus?: boolean;
39
- tooltip?: string;
41
+
40
42
  width?: number;
41
43
  size?: TSizes;
42
44
  minimal?: boolean;
@@ -37,6 +37,7 @@ import {
37
37
  IWithReqoreTooltip,
38
38
  } from '../../types/global';
39
39
  import { IReqoreIconName } from '../../types/icons';
40
+ import ReqoreBreadcrumbs, { IReqoreBreadcrumbsProps } from '../Breadcrumbs';
40
41
  import ReqoreButton, { ButtonBadge, IReqoreButtonProps, TReqoreBadge } from '../Button';
41
42
  import { StyledCollectionItemContent } from '../Collection/item';
42
43
  import ReqoreControlGroup from '../ControlGroup';
@@ -91,6 +92,8 @@ export interface IReqorePanelProps
91
92
  collapseButtonProps?: IReqoreButtonProps;
92
93
  disabled?: boolean;
93
94
 
95
+ breadcrumbs?: IReqoreBreadcrumbsProps;
96
+
94
97
  onClose?: () => void;
95
98
  closeButtonProps?: IReqoreButtonProps;
96
99
 
@@ -349,6 +352,7 @@ export const ReqorePanel = forwardRef<HTMLDivElement, IReqorePanelProps>(
349
352
  getContentRef,
350
353
  headerProps = {},
351
354
  disabled,
355
+ breadcrumbs,
352
356
  ...rest
353
357
  }: IReqorePanelProps,
354
358
  ref
@@ -376,6 +380,7 @@ export const ReqorePanel = forwardRef<HTMLDivElement, IReqorePanelProps>(
376
380
  const hasTitleBar: boolean = useMemo(
377
381
  () =>
378
382
  !!label ||
383
+ !!breadcrumbs ||
379
384
  collapsible ||
380
385
  !!onClose ||
381
386
  !!size(actions.filter(isActionShown)) ||
@@ -386,8 +391,8 @@ export const ReqorePanel = forwardRef<HTMLDivElement, IReqorePanelProps>(
386
391
 
387
392
  // Return true if the card has a title bar, otherwise return false.
388
393
  const hasTitleHeader: boolean = useMemo(
389
- () => !!label || !!badge || !!icon,
390
- [label, icon, badge]
394
+ () => !!label || !!badge || !!icon || !!breadcrumbs,
395
+ [label, icon, badge, breadcrumbs]
391
396
  );
392
397
 
393
398
  const isSmall = useMemo(
@@ -649,7 +654,15 @@ export const ReqorePanel = forwardRef<HTMLDivElement, IReqorePanelProps>(
649
654
  >
650
655
  {hasTitleHeader && (
651
656
  <StyledPanelTitleHeader>
652
- {icon || iconImage || label ? (
657
+ {breadcrumbs ? (
658
+ <ReqoreBreadcrumbs
659
+ {...breadcrumbs}
660
+ padded={false}
661
+ margin='none'
662
+ flat
663
+ responsive={false}
664
+ />
665
+ ) : icon || iconImage || label ? (
653
666
  <StyledPanelTitleHeaderContent
654
667
  size={panelSize}
655
668
  {...headerProps}
@@ -25,7 +25,7 @@ export interface IReqoreCustomHeaderCellProps
25
25
  'sortData' | 'onSortChange' | 'onColumnsUpdate' | 'onFilterChange'
26
26
  >,
27
27
  Omit<IReqoreTableColumn, 'cell' | 'header'>,
28
- Omit<IReqoreButtonProps, 'maxWidth'> {
28
+ Omit<IReqoreButtonProps, 'maxWidth' | 'content'> {
29
29
  hasColumns?: boolean;
30
30
  }
31
31
  export interface IReqoreCustomHeaderCellComponent extends React.FC<IReqoreCustomHeaderCellProps> {}
@@ -165,20 +165,17 @@ const ReqoreTableHeader = forwardRef<HTMLDivElement, IReqoreTableSectionProps>(
165
165
 
166
166
  const renderColumns = (columns: IReqoreTableColumn[]) =>
167
167
  getOnlyShownColumns(columns).map(
168
- (
169
- {
170
- grow,
171
- align,
172
- dataId,
173
- header: { columns, onClick, component: headerComponent, ...rest },
174
- ...colRest
175
- },
176
- index
177
- ) =>
168
+ ({
169
+ grow,
170
+ align,
171
+ dataId,
172
+ header: { columns, onClick, component: headerComponent, ...rest },
173
+ ...colRest
174
+ }) =>
178
175
  columns ? (
179
176
  <StyledColumnGroup
180
177
  grow={getOnlyShownColumns(columns).reduce((gr, col) => gr + col.grow, 0)}
181
- key={index}
178
+ key={dataId}
182
179
  className='reqore-table-column-group'
183
180
  width={getOnlyShownColumns(columns).reduce(
184
181
  (wid, col) => wid + (col.resizedWidth || col.width || 80),