Website for showcasing all features of Tesseract Web.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 

190 rindas
4.2 KiB

  1. import * as React from 'react';
  2. import * as ButtonBase from '@tesseract-design/web-base-button';
  3. type LinkButtonElement = HTMLAnchorElement | HTMLSpanElement;
  4. export type LinkButtonProps = Omit<React.HTMLProps<LinkButtonElement>, 'size' | 'style'> & {
  5. /**
  6. * Size of the component.
  7. */
  8. size?: ButtonBase.ButtonSize,
  9. /**
  10. * Variant of the component.
  11. */
  12. variant?: ButtonBase.ButtonVariant,
  13. /**
  14. * Should the component display a border?
  15. */
  16. border?: boolean,
  17. /**
  18. * Should the component occupy the whole width of its parent?
  19. */
  20. block?: boolean,
  21. /**
  22. * Can the component be activated?
  23. */
  24. disabled?: boolean,
  25. /**
  26. * Style of the component.
  27. */
  28. style?: ButtonBase.ButtonStyle,
  29. /**
  30. * Does the component need to conserve space?
  31. */
  32. compact?: boolean,
  33. /**
  34. * Complementary content of the component.
  35. */
  36. subtext?: React.ReactNode,
  37. /**
  38. * Short complementary content displayed at the edge of the component.
  39. */
  40. badge?: React.ReactNode,
  41. /**
  42. * Is this component part of a menu?
  43. */
  44. menuItem?: boolean,
  45. };
  46. /**
  47. * Component for performing an action upon activation (e.g. when clicked).
  48. *
  49. * This component functions as a hyperlink.
  50. */
  51. export const LinkButton = React.forwardRef<LinkButtonElement, LinkButtonProps>(
  52. (
  53. {
  54. size = ButtonBase.ButtonSize.MEDIUM,
  55. variant = ButtonBase.ButtonVariant.OUTLINE,
  56. border = false,
  57. children,
  58. block = false,
  59. disabled = false,
  60. style = ButtonBase.ButtonStyle.DEFAULT,
  61. onClick,
  62. href,
  63. target,
  64. rel,
  65. compact = false,
  66. subtext,
  67. badge,
  68. menuItem = false,
  69. className: _className,
  70. as: _as,
  71. ...etcProps
  72. }: LinkButtonProps,
  73. ref,
  74. ) => {
  75. const styleProps = React.useMemo<ButtonBase.ButtonBaseArgs>(() => ({
  76. size,
  77. block,
  78. variant,
  79. border,
  80. disabled,
  81. style,
  82. compact,
  83. menuItem,
  84. }), [size, block, variant, border, disabled, style, compact, menuItem]);
  85. const commonChildren = (
  86. <>
  87. <span
  88. className={ButtonBase.Border(styleProps)}
  89. />
  90. <span
  91. className={ButtonBase.Label(styleProps)}
  92. >
  93. <span
  94. className={ButtonBase.MainText()}
  95. >
  96. <span
  97. className={ButtonBase.OverflowText()}
  98. >
  99. {children}
  100. </span>
  101. </span>
  102. {
  103. subtext
  104. && (
  105. <>
  106. {' '}
  107. <span
  108. className={ButtonBase.Subtext()}
  109. >
  110. <span
  111. className={ButtonBase.OverflowText()}
  112. >
  113. {subtext}
  114. </span>
  115. </span>
  116. </>
  117. )
  118. }
  119. </span>
  120. {
  121. badge
  122. && (
  123. <>
  124. {' '}
  125. <span
  126. className={ButtonBase.BadgeContainer(styleProps)}
  127. >
  128. {badge}
  129. </span>
  130. </>
  131. )
  132. }
  133. {
  134. menuItem
  135. && (
  136. <>
  137. {' '}
  138. <span
  139. className={ButtonBase.IndicatorWrapper(styleProps)}
  140. >
  141. <svg
  142. className={ButtonBase.Indicator()}
  143. viewBox="0 0 24 24"
  144. role="presentation"
  145. >
  146. <polyline points="9 18 15 12 9 6"/>
  147. </svg>
  148. </span>
  149. </>
  150. )
  151. }
  152. </>
  153. );
  154. if (disabled) {
  155. return (
  156. // eslint-disable-next-line jsx-a11y/click-events-have-key-events
  157. <span
  158. {...etcProps}
  159. className={ButtonBase.Button(styleProps)}
  160. ref={ref as React.ForwardedRef<HTMLSpanElement>}
  161. onClick={undefined}
  162. >
  163. {commonChildren}
  164. </span>
  165. );
  166. }
  167. return (
  168. <a
  169. {...etcProps}
  170. className={ButtonBase.Button(styleProps)}
  171. ref={ref as React.ForwardedRef<HTMLAnchorElement>}
  172. href={href}
  173. target={target}
  174. rel={rel}
  175. onClick={onClick}
  176. >
  177. {commonChildren}
  178. </a>
  179. );
  180. },
  181. );
  182. LinkButton.displayName = 'LinkButton';