@vectara/vectara-ui 16.8.0 → 16.9.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.
@@ -26,6 +26,7 @@ export type BaseButtonProps = {
26
26
  isSubmit?: boolean;
27
27
  isLoading?: boolean;
28
28
  truncate?: boolean;
29
+ "aria-label"?: string;
29
30
  };
30
31
  export declare const BaseButton: import("react").ForwardRefExoticComponent<BaseButtonProps & {
31
32
  spinnerColor?: "accent" | "primary" | "success" | "warning" | "danger" | "subdued" | "empty" | "dark" | undefined;
@@ -15,6 +15,7 @@ import classNames from "classnames";
15
15
  import { getTrackingProps } from "../../utils/getTrackingProps";
16
16
  import { useVuiContext } from "../context/Context";
17
17
  import { VuiSpinner } from "../spinner/Spinner";
18
+ import { VuiTooltip } from "../tooltip/Tooltip";
18
19
  const alignToClassMap = {
19
20
  left: "vuiBaseButton--alignLeft",
20
21
  center: "vuiBaseButton--alignCenter",
@@ -27,12 +28,13 @@ const sizeToSpinnerSizeMap = {
27
28
  l: "m"
28
29
  };
29
30
  export const BaseButton = forwardRef((_a, ref) => {
30
- var { children, icon, iconSide = "left", align = "center", className, size = "m", fullWidth, onClick, onMouseOver, onMouseOut, onMouseMove, tabIndex, isInert, isDisabled, href, target, track, htmlFor, isSubmit, isLoading, spinnerColor, truncate } = _a, rest = __rest(_a, ["children", "icon", "iconSide", "align", "className", "size", "fullWidth", "onClick", "onMouseOver", "onMouseOut", "onMouseMove", "tabIndex", "isInert", "isDisabled", "href", "target", "track", "htmlFor", "isSubmit", "isLoading", "spinnerColor", "truncate"]);
31
+ var { children, icon, iconSide = "left", align = "center", className, size = "m", fullWidth, onClick, onMouseOver, onMouseOut, onMouseMove, tabIndex, isInert, isDisabled, href, target, track, htmlFor, isSubmit, isLoading, spinnerColor, truncate, "aria-label": ariaLabel } = _a, rest = __rest(_a, ["children", "icon", "iconSide", "align", "className", "size", "fullWidth", "onClick", "onMouseOver", "onMouseOut", "onMouseMove", "tabIndex", "isInert", "isDisabled", "href", "target", "track", "htmlFor", "isSubmit", "isLoading", "spinnerColor", "truncate", "aria-label"]);
31
32
  const { createLink } = useVuiContext();
32
33
  const classes = classNames("vuiBaseButton", className, `vuiBaseButton--${size}`, alignToClassMap[align], {
33
34
  "vuiBaseButton-isInert": isInert,
34
35
  "vuiBaseButton-isDisabled": isDisabled,
35
36
  "vuiBaseButton--fullWidth": fullWidth,
37
+ "vuiBaseButton--truncate": truncate,
36
38
  [`vuiBaseButton--${isLoading ? "left" : iconSide}`]: (Boolean(icon) || isLoading) && Boolean(children)
37
39
  });
38
40
  let iconContainer;
@@ -42,33 +44,40 @@ export const BaseButton = forwardRef((_a, ref) => {
42
44
  else if (icon) {
43
45
  iconContainer = _jsx("span", Object.assign({ className: "vuiBaseButtonIconContainer" }, { children: icon }));
44
46
  }
45
- // This is useful for controlling other elements, e.g. creating an <input type="file" />
46
- // for uploading files and adding a button to trigger it.
47
+ let button;
47
48
  if (htmlFor) {
48
- return (_jsxs("label", Object.assign({ htmlFor: htmlFor, className: classes, tabIndex: tabIndex }, rest, { children: [iconContainer, children] })));
49
+ // This is useful for controlling other elements, e.g. creating an <input type="file" />
50
+ // for uploading files and adding a button to trigger it.
51
+ button = (_jsxs("label", Object.assign({ "aria-label": ariaLabel, htmlFor: htmlFor, className: classes, tabIndex: tabIndex }, rest, { children: [iconContainer, children] })));
49
52
  }
50
- // Anchor tags can't be disabled, so we'll just render a button instead
51
- // if isDisabled is true.
52
- if (href && !isDisabled) {
53
+ else if (href && !isDisabled) {
54
+ // Anchor tags can't be disabled, so we'll just render a button instead
55
+ // if isDisabled is true.
53
56
  const wrapperClasses = classNames("vuiBaseButtonLinkWrapper", {
54
57
  "vuiBaseButtonLinkWrapper--fullWidth": fullWidth
55
58
  });
56
- return createLink(Object.assign(Object.assign({ className: wrapperClasses, href,
59
+ button = createLink(Object.assign(Object.assign({ className: wrapperClasses, href,
57
60
  onClick,
58
61
  onMouseOver,
59
62
  onMouseOut,
60
63
  onMouseMove, children: (
61
64
  //* Wrap a button otherwise the flex layout breaks */}
62
- _jsxs("button", Object.assign({ className: classes, tabIndex: -1, ref: ref }, { children: [iconContainer, children] }))), target,
65
+ _jsxs("button", Object.assign({ "aria-label": ariaLabel, className: classes, tabIndex: -1, ref: ref }, { children: [iconContainer, children] }))), target,
63
66
  tabIndex }, rest), getTrackingProps(track)));
64
67
  }
65
- const labelClasses = classNames({
66
- "vuiBaseButtonLabel--truncate": truncate
67
- });
68
- const props = Object.assign({ onClick,
69
- onMouseOver,
70
- onMouseOut,
71
- onMouseMove,
72
- tabIndex, type: isSubmit ? "submit" : "button", disabled: isDisabled }, rest);
73
- return (_jsxs("button", Object.assign({ className: classes }, props, { ref: ref }, { children: [iconContainer, _jsx("span", Object.assign({ className: labelClasses }, { children: children }))] })));
68
+ else {
69
+ const labelClasses = classNames({
70
+ "vuiBaseButtonLabel--truncate": truncate
71
+ });
72
+ const props = Object.assign({ onClick,
73
+ onMouseOver,
74
+ onMouseOut,
75
+ onMouseMove,
76
+ tabIndex, type: isSubmit ? "submit" : "button", disabled: isDisabled }, rest);
77
+ button = (_jsxs("button", Object.assign({ "aria-label": ariaLabel, className: classes }, props, { ref: ref }, { children: [iconContainer, _jsx("span", Object.assign({ className: labelClasses }, { children: children }))] })));
78
+ }
79
+ if (ariaLabel) {
80
+ return _jsx(VuiTooltip, Object.assign({ tip: ariaLabel }, { children: button }));
81
+ }
82
+ return button;
74
83
  });
@@ -70,6 +70,11 @@
70
70
  width: 100%;
71
71
  }
72
72
 
73
+ .vuiBaseButton--truncate {
74
+ overflow: hidden;
75
+ text-overflow: ellipsis;
76
+ }
77
+
73
78
  // Size
74
79
  .vuiBaseButton--xs {
75
80
  font-size: $fontSizeSmall;
@@ -749,6 +749,11 @@ fieldset {
749
749
  width: 100%;
750
750
  }
751
751
 
752
+ .vuiBaseButton--truncate {
753
+ overflow: hidden;
754
+ text-overflow: ellipsis;
755
+ }
756
+
752
757
  .vuiBaseButton--xs {
753
758
  font-size: 12px;
754
759
  padding: 4px 8px;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vectara/vectara-ui",
3
- "version": "16.8.0",
3
+ "version": "16.9.0",
4
4
  "homepage": "./",
5
5
  "description": "Vectara's design system, codified as a React and Sass component library",
6
6
  "author": "Vectara",
@@ -18,7 +18,7 @@ export const Icons = () => {
18
18
  </Subsection>
19
19
 
20
20
  <Subsection title="Icon only">
21
- <VuiButtonPrimary icon={icon} color="primary" size="m" />
21
+ <VuiButtonPrimary icon={icon} color="primary" size="m" aria-label="Add to favorites" />
22
22
  </Subsection>
23
23
  </>
24
24
  );
@@ -13,7 +13,7 @@ export const Truncate = () => {
13
13
  </VuiIcon>
14
14
  }
15
15
  >
16
- A very long label that will get truncated
16
+ A very long label that will get truncated eventually if the text is long enough
17
17
  </VuiButtonSecondary>
18
18
  </div>
19
19
  );