@fibery/ui-kit 1.36.2 → 1.38.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.
Files changed (296) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/package.json +8 -5
  3. package/src/action-badge.tsx +5 -4
  4. package/src/actions-menu/actions-menu-confirmation.tsx +1 -12
  5. package/src/actions-menu/actions-menu-item.tsx +19 -7
  6. package/src/actions-menu/actions-menu-props.tsx +4 -0
  7. package/src/actions-menu/actions-menu-sub-command-menu.tsx +7 -4
  8. package/src/actions-menu/actions-menu-sub-menu.tsx +9 -3
  9. package/src/actions-menu/actions-menu.tsx +24 -8
  10. package/src/actions-panel.tsx +12 -2
  11. package/src/antd/ant-modal.tsx +17 -2
  12. package/src/antd/input.tsx +4 -3
  13. package/src/app-icon-with-fallback.tsx +5 -8
  14. package/src/app-icon-wrapper.tsx +4 -4
  15. package/src/appIcons.json +20 -0
  16. package/src/axis-header.tsx +136 -76
  17. package/src/badge.tsx +14 -7
  18. package/src/beta-badge.tsx +12 -8
  19. package/src/box.tsx +1 -1
  20. package/src/breadcrumb.tsx +78 -0
  21. package/src/button/actions-button-compact.tsx +5 -2
  22. package/src/button/base-button.tsx +7 -4
  23. package/src/button/button-group.tsx +1 -1
  24. package/src/button/button.tsx +120 -2
  25. package/src/button/icon-button.tsx +13 -2
  26. package/src/button/select-button.tsx +27 -8
  27. package/src/card-container.tsx +36 -69
  28. package/src/card-hidden-link.tsx +52 -0
  29. package/src/collapsible-section.tsx +13 -3
  30. package/src/color-picker/index.js +65 -60
  31. package/src/color-picker/swatch.tsx +29 -14
  32. package/src/command-menu/index.tsx +5 -5
  33. package/src/context-menu/index.tsx +10 -1
  34. package/src/count-badge.tsx +57 -0
  35. package/src/date-picker/date-range-input.tsx +1 -1
  36. package/src/date-picker/date-range-picker.tsx +6 -3
  37. package/src/date-picker/fake-date-input.tsx +1 -1
  38. package/src/date-picker/relative-date-picker.tsx +7 -3
  39. package/src/date-picker/single-date-input.tsx +1 -1
  40. package/src/date-picker/single-date-picker.tsx +8 -5
  41. package/src/date-picker/styles.ts +32 -26
  42. package/src/date-picker/types.ts +3 -1
  43. package/src/date-picker/utils.ts +9 -2
  44. package/src/day-select/day-select.tsx +21 -75
  45. package/src/day-select/iso-week-day-select.tsx +1 -1
  46. package/src/day-select/mount-day-select.tsx +2 -2
  47. package/src/day-select/week-day-select.tsx +1 -5
  48. package/src/design-system.ts +91 -51
  49. package/src/dropdown-menu/index.tsx +8 -1
  50. package/src/emoji-picker/app-icon-picker.tsx +6 -4
  51. package/src/emoji-picker/emoji-picker-content-with-color.tsx +3 -9
  52. package/src/emoji-picker/emoji-picker-preview-footer.tsx +1 -1
  53. package/src/emoji-picker/emoji-picker.tsx +3 -0
  54. package/src/emoji-picker/emoji.tsx +2 -1
  55. package/src/emoji-picker/icon-emoji-picker.tsx +83 -68
  56. package/src/emoji-picker/primitives/footer.tsx +0 -1
  57. package/src/emoji-picker/primitives/header.tsx +1 -0
  58. package/src/emoji-picker/primitives/search.tsx +12 -13
  59. package/src/emoji-picker/primitives/skin-tone.tsx +1 -0
  60. package/src/emoji-picker/use-responsive-emoji-size.ts +11 -0
  61. package/src/emoji-picker/utils/emoji-set.ts +2 -1
  62. package/src/empty-state/empty-state.tsx +6 -0
  63. package/src/error-alert/error-alert.tsx +19 -7
  64. package/src/field-app-icon.tsx +29 -0
  65. package/src/field-container.tsx +4 -2
  66. package/src/field-icon.tsx +29 -0
  67. package/src/field-type-icon.tsx +82 -0
  68. package/src/file-item.tsx +164 -47
  69. package/src/guide-link.tsx +4 -3
  70. package/src/hint.tsx +10 -1
  71. package/src/html-styles.ts +23 -13
  72. package/src/icons/ast/ActivityFilled.ts +8 -0
  73. package/src/icons/ast/AiAssistantFilled.ts +8 -0
  74. package/src/icons/ast/AiFiberyBuild.ts +8 -0
  75. package/src/icons/ast/Anthropic.ts +1 -1
  76. package/src/icons/ast/Apple.ts +8 -0
  77. package/src/icons/ast/ArrowBottom.ts +1 -1
  78. package/src/icons/ast/ArrowForward.ts +1 -1
  79. package/src/icons/ast/ArrowLeft.ts +1 -1
  80. package/src/icons/ast/ArrowRight.ts +1 -1
  81. package/src/icons/ast/ArrowTop.ts +1 -1
  82. package/src/icons/ast/CollapseAllHorizontal.ts +8 -0
  83. package/src/icons/ast/Crosshair.ts +8 -0
  84. package/src/icons/ast/DateRange.ts +1 -1
  85. package/src/icons/ast/Document.ts +8 -0
  86. package/src/icons/ast/EntityCreate.ts +8 -0
  87. package/src/icons/ast/EntityCreateFilled.ts +8 -0
  88. package/src/icons/ast/ExpandAll.ts +8 -0
  89. package/src/icons/ast/ExpandAllHorizontal.ts +8 -0
  90. package/src/icons/ast/FiberyDesktopApp.ts +8 -0
  91. package/src/icons/ast/FileDownload.ts +8 -0
  92. package/src/icons/ast/GlobeUnpublish.ts +8 -0
  93. package/src/icons/ast/GraduationCapFilled.ts +8 -0
  94. package/src/icons/ast/Home.ts +1 -1
  95. package/src/icons/ast/HomeFilled.ts +8 -0
  96. package/src/icons/ast/ImportFilled.ts +8 -0
  97. package/src/icons/ast/IntegrationsFilled.ts +8 -0
  98. package/src/icons/ast/KeyboardHideDown.ts +8 -0
  99. package/src/icons/ast/LayoutMultiple.ts +8 -0
  100. package/src/icons/ast/LocationEdit.ts +8 -0
  101. package/src/icons/ast/MessagePlus.ts +8 -0
  102. package/src/icons/ast/OpenAi.ts +1 -1
  103. package/src/icons/ast/RicheditorHistoryRedo.ts +1 -1
  104. package/src/icons/ast/RicheditorHistoryUndo.ts +1 -1
  105. package/src/icons/ast/RicheditorMarkHighlight.ts +8 -0
  106. package/src/icons/ast/RicheditorMarkStrike.ts +1 -1
  107. package/src/icons/ast/RicheditorMarkUnderline.ts +1 -1
  108. package/src/icons/ast/SearchFilled.ts +8 -0
  109. package/src/icons/ast/SettingsFilled.ts +8 -0
  110. package/src/icons/ast/SlideMenuFilled.ts +8 -0
  111. package/src/icons/ast/SpaceApp.ts +8 -0
  112. package/src/icons/ast/SpaceGenerate.ts +8 -0
  113. package/src/icons/ast/SpaceScratch.ts +8 -0
  114. package/src/icons/ast/SpaceTemplate.ts +8 -0
  115. package/src/icons/ast/TableLayout.ts +8 -0
  116. package/src/icons/ast/TemplatesFilled.ts +8 -0
  117. package/src/icons/ast/ThumbsDown.ts +8 -0
  118. package/src/icons/ast/ThumbsUp.ts +8 -0
  119. package/src/icons/ast/TypeDate.ts +1 -1
  120. package/src/icons/ast/ViewDashboard.ts +8 -0
  121. package/src/icons/ast/WarningTriangleFilled.ts +8 -0
  122. package/src/icons/ast/Windows.ts +8 -0
  123. package/src/icons/ast/index.tsx +37 -0
  124. package/src/icons/react/ActivityFilled.tsx +13 -0
  125. package/src/icons/react/AiAssistantFilled.tsx +13 -0
  126. package/src/icons/react/AiFiberyBuild.tsx +13 -0
  127. package/src/icons/react/Apple.tsx +13 -0
  128. package/src/icons/react/CollapseAllHorizontal.tsx +13 -0
  129. package/src/icons/react/Crosshair.tsx +13 -0
  130. package/src/icons/react/Document.tsx +13 -0
  131. package/src/icons/react/EntityCreate.tsx +13 -0
  132. package/src/icons/react/EntityCreateFilled.tsx +13 -0
  133. package/src/icons/react/ExpandAll.tsx +13 -0
  134. package/src/icons/react/ExpandAllHorizontal.tsx +13 -0
  135. package/src/icons/react/FiberyDesktopApp.tsx +13 -0
  136. package/src/icons/react/FileDownload.tsx +13 -0
  137. package/src/icons/react/GlobeUnpublish.tsx +13 -0
  138. package/src/icons/react/GraduationCapFilled.tsx +13 -0
  139. package/src/icons/react/HomeFilled.tsx +13 -0
  140. package/src/icons/react/ImportFilled.tsx +13 -0
  141. package/src/icons/react/IntegrationsFilled.tsx +13 -0
  142. package/src/icons/react/KeyboardHideDown.tsx +13 -0
  143. package/src/icons/react/LayoutMultiple.tsx +13 -0
  144. package/src/icons/react/LocationEdit.tsx +13 -0
  145. package/src/icons/react/MessagePlus.tsx +13 -0
  146. package/src/icons/react/RicheditorMarkHighlight.tsx +13 -0
  147. package/src/icons/react/SearchFilled.tsx +13 -0
  148. package/src/icons/react/SettingsFilled.tsx +13 -0
  149. package/src/icons/react/SlideMenuFilled.tsx +13 -0
  150. package/src/icons/react/SpaceApp.tsx +13 -0
  151. package/src/icons/react/SpaceGenerate.tsx +13 -0
  152. package/src/icons/react/SpaceScratch.tsx +13 -0
  153. package/src/icons/react/SpaceTemplate.tsx +13 -0
  154. package/src/icons/react/TableLayout.tsx +13 -0
  155. package/src/icons/react/TemplatesFilled.tsx +13 -0
  156. package/src/icons/react/ThumbsDown.tsx +13 -0
  157. package/src/icons/react/ThumbsUp.tsx +13 -0
  158. package/src/icons/react/ViewDashboard.tsx +13 -0
  159. package/src/icons/react/WarningTriangleFilled.tsx +13 -0
  160. package/src/icons/react/Windows.tsx +13 -0
  161. package/src/icons/react/index.tsx +37 -0
  162. package/src/icons/svg/activity-filled.svg +4 -0
  163. package/src/icons/svg/ai-assistant-filled.svg +3 -0
  164. package/src/icons/svg/ai-fibery-build.svg +24 -0
  165. package/src/icons/svg/anthropic.svg +2 -14
  166. package/src/icons/svg/apple.svg +4 -0
  167. package/src/icons/svg/arrow-bottom.svg +1 -1
  168. package/src/icons/svg/arrow-forward.svg +1 -1
  169. package/src/icons/svg/arrow-left.svg +1 -1
  170. package/src/icons/svg/arrow-right.svg +1 -1
  171. package/src/icons/svg/arrow-top.svg +1 -1
  172. package/src/icons/svg/collapse-all-horizontal.svg +3 -0
  173. package/src/icons/svg/crosshair.svg +4 -0
  174. package/src/icons/svg/date-range.svg +3 -3
  175. package/src/icons/svg/document.svg +4 -0
  176. package/src/icons/svg/entity-create-filled.svg +4 -0
  177. package/src/icons/svg/entity-create.svg +3 -0
  178. package/src/icons/svg/expand-all-horizontal.svg +3 -0
  179. package/src/icons/svg/expand-all.svg +3 -0
  180. package/src/icons/svg/fibery-desktop-app.svg +101 -0
  181. package/src/icons/svg/file-download.svg +4 -0
  182. package/src/icons/svg/globe-unpublish.svg +4 -0
  183. package/src/icons/svg/go-to.svg +1 -3
  184. package/src/icons/svg/graduation-cap-filled.svg +4 -0
  185. package/src/icons/svg/home-filled.svg +3 -0
  186. package/src/icons/svg/home.svg +4 -2
  187. package/src/icons/svg/import-filled.svg +4 -0
  188. package/src/icons/svg/integrations-filled.svg +4 -0
  189. package/src/icons/svg/keyboard-hide-down.svg +1 -0
  190. package/src/icons/svg/layout-multiple.svg +3 -0
  191. package/src/icons/svg/location-edit.svg +13 -0
  192. package/src/icons/svg/message-plus.svg +4 -0
  193. package/src/icons/svg/open-ai.svg +2 -7
  194. package/src/icons/svg/open-as-page.svg +2 -3
  195. package/src/icons/svg/richeditor/history/redo.svg +3 -2
  196. package/src/icons/svg/richeditor/history/undo.svg +3 -2
  197. package/src/icons/svg/richeditor/mark/code.svg +4 -5
  198. package/src/icons/svg/richeditor/mark/em.svg +3 -2
  199. package/src/icons/svg/richeditor/mark/highlight.svg +3 -0
  200. package/src/icons/svg/richeditor/mark/strike.svg +3 -2
  201. package/src/icons/svg/richeditor/mark/strong.svg +3 -2
  202. package/src/icons/svg/richeditor/mark/underline.svg +4 -2
  203. package/src/icons/svg/search-filled.svg +3 -0
  204. package/src/icons/svg/settings-filled.svg +3 -0
  205. package/src/icons/svg/slide-menu-filled.svg +1 -0
  206. package/src/icons/svg/space-app.svg +3 -0
  207. package/src/icons/svg/space-generate.svg +3 -0
  208. package/src/icons/svg/space-scratch.svg +3 -0
  209. package/src/icons/svg/space-template.svg +3 -0
  210. package/src/icons/svg/table-layout.svg +3 -0
  211. package/src/icons/svg/templates-filled.svg +6 -0
  212. package/src/icons/svg/thumbs-down.svg +3 -0
  213. package/src/icons/svg/thumbs-up.svg +3 -0
  214. package/src/icons/svg/type/date.svg +3 -2
  215. package/src/icons/svg/view-dashboard.svg +5 -0
  216. package/src/icons/svg/warning-triangle-filled.svg +3 -0
  217. package/src/icons/svg/windows.svg +15 -0
  218. package/src/images-gallery/images-gallery.tsx +254 -0
  219. package/src/images-gallery/zoom.tsx +112 -0
  220. package/src/integration-compact-info-button.tsx +3 -1
  221. package/src/is-in-popup.ts +1 -1
  222. package/src/layout-styles.ts +43 -0
  223. package/src/lists/actions-menu-row-surface.tsx +3 -1
  224. package/src/lists/list-row-surface.tsx +9 -2
  225. package/src/loaders.tsx +6 -6
  226. package/src/logo.tsx +16 -9
  227. package/src/mobile-keyboard-aware-popup.tsx +87 -0
  228. package/src/mobile-styles.ts +10 -0
  229. package/src/modal-menu/contexts/modal-menu-context.tsx +22 -0
  230. package/src/modal-menu/contexts/modal-submenu-context.tsx +16 -0
  231. package/src/modal-menu/index.tsx +14 -0
  232. package/src/modal-menu/modal-menu-content.tsx +68 -0
  233. package/src/modal-menu/modal-menu-group.tsx +10 -0
  234. package/src/modal-menu/modal-menu-item.tsx +37 -0
  235. package/src/modal-menu/modal-menu-label.tsx +24 -0
  236. package/src/modal-menu/modal-menu-root.tsx +57 -0
  237. package/src/modal-menu/modal-menu-separator.tsx +14 -0
  238. package/src/modal-menu/modal-menu-trigger.tsx +37 -0
  239. package/src/modal-menu/modal-submenu-content.tsx +49 -0
  240. package/src/modal-menu/modal-submenu-trigger.tsx +34 -0
  241. package/src/modal-menu/modal-submenu.tsx +17 -0
  242. package/src/new-badge.tsx +4 -7
  243. package/src/number-input/text-area-auto-sized.tsx +47 -0
  244. package/src/number-input/text-input-auto-sized.tsx +49 -0
  245. package/src/online-users.tsx +3 -3
  246. package/src/palette.ts +50 -50
  247. package/src/popover/index.tsx +687 -0
  248. package/src/popover/mobile-popup-context.tsx +29 -0
  249. package/src/{popup → popover}/modifiers.tsx +0 -7
  250. package/src/{popup → popover}/popup-modifiers-context.ts +3 -3
  251. package/src/reactions/reaction-button.tsx +30 -45
  252. package/src/reactions/reaction-picker.tsx +39 -45
  253. package/src/rich-text-embed-error.tsx +2 -2
  254. package/src/select/{custom-select-partials → components}/menu.tsx +13 -7
  255. package/src/select/{custom-select-partials → components}/no-option-message.tsx +0 -1
  256. package/src/select/constants.ts +1 -0
  257. package/src/select/index.tsx +143 -148
  258. package/src/select/select-in-popover.tsx +119 -138
  259. package/src/select/styles.ts +60 -24
  260. package/src/shortcut-badge.tsx +1 -0
  261. package/src/tab-nav/tab-nav.tsx +47 -28
  262. package/src/theme-provider.tsx +9 -1
  263. package/src/toast/primitives.tsx +8 -1
  264. package/src/toggle-button/round-toggle-button.tsx +23 -0
  265. package/src/toggle-button/toggle-button-group.tsx +34 -0
  266. package/src/toggle-button/toggle-button.tsx +164 -0
  267. package/src/toggle.tsx +3 -3
  268. package/src/tooltip-if-overflown.tsx +9 -3
  269. package/src/tooltip.tsx +2 -2
  270. package/src/unit/index.tsx +9 -1
  271. package/src/unit/loading-unit-value.tsx +1 -0
  272. package/src/unit/maybe-unit-value.tsx +3 -3
  273. package/src/unit/primitive.tsx +58 -42
  274. package/src/unit/styles.ts +10 -14
  275. package/src/unit/types.ts +4 -2
  276. package/src/unit/unit-button-group.tsx +6 -11
  277. package/src/unit/unit-content.tsx +13 -5
  278. package/src/unit/unit-with-title.tsx +6 -1
  279. package/src/unit/unit-with-tooltip.tsx +24 -9
  280. package/src/use-is-phone.tsx +37 -0
  281. package/src/use-is-support-hover.ts +1 -1
  282. package/src/use-on-screen-keyboard-data.tsx +66 -0
  283. package/src/workflow-progress-icon.tsx +17 -23
  284. package/src/number-input/text-area-with-autosize.tsx +0 -91
  285. package/src/number-input/text-inline-input-with-autosize.tsx +0 -60
  286. package/src/popup/index.tsx +0 -382
  287. package/src/use-is-phone.ts +0 -5
  288. /package/src/{popup → popover}/popup-stack-context.tsx +0 -0
  289. /package/src/{popup → popover}/reference.ts +0 -0
  290. /package/src/{popup → popover}/styles.ts +0 -0
  291. /package/src/{popup → popover}/use-click-outside.ts +0 -0
  292. /package/src/select/{custom-select-partials → components}/clear-indicator.tsx +0 -0
  293. /package/src/select/{custom-select-partials → components}/drop-down-indicator.tsx +0 -0
  294. /package/src/select/{custom-select-partials → components}/group-heading.tsx +0 -0
  295. /package/src/select/{custom-select-partials → components}/menu-list-virtualized.tsx +0 -0
  296. /package/src/select/{custom-select-partials → components}/option.tsx +0 -0
@@ -4,6 +4,7 @@ import {border, space} from "../design-system";
4
4
  import {iconSizeVar} from "../icons/Icon";
5
5
  import Spinner from "../icons/react/Spinner";
6
6
  import {BaseButton, BaseButtonProps, ButtonSize} from "./base-button";
7
+ import {useIsPhone} from "../use-is-phone";
7
8
 
8
9
  export type IconButtonProps = {
9
10
  size?: ButtonSize;
@@ -51,16 +52,26 @@ export const iconButtonSizes = {
51
52
 
52
53
  ${iconSizeVar}: 18px;
53
54
  `,
55
+ xLarge: css`
56
+ padding: ${space.s6}px;
57
+
58
+ min-width: 44px;
59
+ min-height: 44px;
60
+ border-radius: ${border.radius6}px;
61
+
62
+ ${iconSizeVar}: 24px;
63
+ `,
54
64
  };
55
65
 
56
66
  export const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(
57
- {size = "medium", className, variant = "ghost", color = "neutral", pending, children, ...rest},
67
+ {size = "medium", supportMobile, className, variant = "ghost", color = "neutral", pending, children, ...rest},
58
68
  ref
59
69
  ) {
70
+ const isPhone = useIsPhone();
60
71
  return (
61
72
  <BaseButton
62
73
  ref={ref}
63
- className={cx(className, iconButton, iconButtonSizes[size])}
74
+ className={cx(className, iconButton, iconButtonSizes[supportMobile && isPhone ? "large" : size])}
64
75
  variant={variant}
65
76
  color={color}
66
77
  {...rest}
@@ -4,10 +4,28 @@ import {space} from "../design-system";
4
4
  import ArrowBottom from "../icons/react/ArrowBottom";
5
5
  import {Button, ButtonProps} from "./button";
6
6
 
7
- const selectIndicator = css`
8
- margin-left: -${space.s4}px;
9
- margin-right: -${space.s4}px;
10
- `;
7
+ const iconSize = {
8
+ tiny: css`
9
+ margin-left: -${space.s2}px;
10
+ margin-right: -${space.s2}px;
11
+ `,
12
+ small: css`
13
+ margin-left: -${space.s3}px;
14
+ margin-right: -${space.s3}px;
15
+ `,
16
+ medium: css`
17
+ margin-left: -${space.s4}px;
18
+ margin-right: -${space.s4}px;
19
+ `,
20
+ large: css`
21
+ margin-left: -${space.s4}px;
22
+ margin-right: -${space.s4}px;
23
+ `,
24
+ xLarge: css`
25
+ margin-left: -${space.s4}px;
26
+ margin-right: -${space.s4}px;
27
+ `,
28
+ };
11
29
 
12
30
  export type SelectButtonProps = {
13
31
  /**
@@ -19,16 +37,17 @@ export type SelectButtonProps = {
19
37
  } & Omit<ButtonProps, "iconEnd">;
20
38
 
21
39
  export const SelectButton = forwardRef<HTMLButtonElement, SelectButtonProps>(function SelectButton(
22
- {className, open, ...rest},
40
+ {size = "medium", className, open, variant = "ghost", color = "neutral", ...rest},
23
41
  forwardedRef
24
42
  ) {
25
43
  return (
26
44
  <Button
27
45
  ref={forwardedRef}
28
46
  aria-expanded={open}
29
- iconEnd={<ArrowBottom className={selectIndicator} />}
30
- variant="ghost"
31
- color="neutral"
47
+ size={size}
48
+ iconEnd={<ArrowBottom className={iconSize[size]} />}
49
+ variant={variant}
50
+ color={color}
32
51
  className={className}
33
52
  {...rest}
34
53
  />
@@ -1,12 +1,13 @@
1
- import {preventDefault} from "@fibery/react/src/prevent-default";
2
1
  import {stopPropagation} from "@fibery/react/src/stop-propagation";
3
2
  import {css} from "@linaria/core";
4
3
  import {styled} from "@linaria/react";
5
4
  import cx from "classnames";
6
5
  import {CSSProperties, ReactNode} from "react";
7
6
  import {getBg} from "./box";
7
+ import {CardHiddenLink} from "./card-hidden-link";
8
8
  import {border, space, themeVars} from "./design-system";
9
9
  import {visuallyHidden} from "./styles-utils";
10
+ import {mobileRootSelector} from "./mobile-styles";
10
11
 
11
12
  export type CardSize =
12
13
  | ":card-size/pinned"
@@ -109,10 +110,7 @@ const cardClassName = css`
109
110
  flex-direction: column;
110
111
  flex-grow: 1;
111
112
  height: 100%;
112
- padding-left: ${space.s8}px;
113
- padding-right: ${space.s6}px;
114
- padding-top: ${space.s6}px;
115
- padding-bottom: ${space.s8}px;
113
+ padding: ${space.s8}px;
116
114
  gap: ${space.s6}px;
117
115
 
118
116
  & > div:empty:not(.${colorCodingClassName}) {
@@ -159,6 +157,11 @@ const listClassName = css`
159
157
  & > div.title-wrapper:has(a:empty) {
160
158
  display: none;
161
159
  }
160
+
161
+ ${mobileRootSelector} & {
162
+ gap: ${space.s8}px;
163
+ min-height: 36px;
164
+ }
162
165
  `;
163
166
 
164
167
  const timelineClassName = css`
@@ -273,59 +276,6 @@ const ColorCoding = styled.div<{backgroundColors: string[]}>`
273
276
  background: ${({backgroundColors}) => getBg(backgroundColors)};
274
277
  `;
275
278
 
276
- type LinkWrapperProps = {
277
- href?: string;
278
- coverArea: boolean;
279
- children: ReactNode;
280
- };
281
-
282
- const LinkWrapper = ({href, coverArea, children}: LinkWrapperProps) => {
283
- if (href) {
284
- return (
285
- <a
286
- href={href}
287
- draggable="false"
288
- onClick={preventDefault}
289
- // To avoid tab on hidden link. but with this we can't open card via keyboard navigation.
290
- tabIndex={-1}
291
- data-is-card-hidden-link={true}
292
- className={
293
- coverArea
294
- ? cx(
295
- css`
296
- &::after {
297
- content: "";
298
- position: absolute;
299
- left: 0;
300
- top: 0;
301
- right: 0;
302
- bottom: 0;
303
- }
304
- `
305
- )
306
- : cx(
307
- css`
308
- color: inherit;
309
-
310
- &:hover {
311
- color: inherit;
312
- }
313
-
314
- &:visited {
315
- color: inherit;
316
- }
317
- `
318
- )
319
- }
320
- >
321
- {children}
322
- </a>
323
- );
324
- } else {
325
- return <>{children}</>;
326
- }
327
- };
328
-
329
279
  type Props = {
330
280
  before: ReactNode;
331
281
  title: ReactNode;
@@ -338,8 +288,13 @@ type Props = {
338
288
  input?: boolean;
339
289
  linkHref?: string;
340
290
  titleClassName?: string;
291
+ titleString?: string;
341
292
  };
342
293
 
294
+ const cardContent = css`
295
+ position: relative;
296
+ `;
297
+
343
298
  export const CardContainer = ({
344
299
  cover,
345
300
  before,
@@ -352,6 +307,7 @@ export const CardContainer = ({
352
307
  input,
353
308
  linkHref,
354
309
  titleClassName,
310
+ titleString,
355
311
  }: Props) => {
356
312
  const showCover = Boolean(cover && coverHeightBySize[size]);
357
313
  const hasContent = Boolean(before || title || after);
@@ -381,14 +337,12 @@ export const CardContainer = ({
381
337
  {cover}
382
338
  </div>
383
339
  )}
384
- <div
385
- className={css`
386
- position: relative;
387
- `}
388
- >
389
- <LinkWrapper href={linkHref} coverArea={true}>
390
- <div className={visuallyHidden}>{title}</div>
391
- </LinkWrapper>
340
+ <div className={cardContent}>
341
+ {linkHref ? (
342
+ <CardHiddenLink href={linkHref} coverArea={true}>
343
+ <div className={visuallyHidden}>{title}</div>
344
+ </CardHiddenLink>
345
+ ) : null}
392
346
 
393
347
  {backgroundColors && <ColorCoding className={colorCodingClassName} backgroundColors={backgroundColors} />}
394
348
 
@@ -406,12 +360,25 @@ export const CardContainer = ({
406
360
  titleClassName
407
361
  )}
408
362
  >
409
- <LinkWrapper href={linkHref} coverArea={false}>
410
- {title}
411
- </LinkWrapper>
363
+ {title}
412
364
  </div>
413
365
  )}
414
366
  {after && <div className={afterStyles[size]}>{after}</div>}
367
+ <div
368
+ data-entity-title={titleString || ""}
369
+ className={cx(
370
+ `extension-entity-card-spot`,
371
+ css`
372
+ display: none;
373
+ .${cardContent}:hover &:not(:empty) {
374
+ display: block;
375
+ position: absolute;
376
+ top: ${space.s6}px;
377
+ right: ${space.s6}px;
378
+ }
379
+ `
380
+ )}
381
+ />
415
382
  </div>
416
383
  )}
417
384
  </div>
@@ -0,0 +1,52 @@
1
+ import {preventDefault} from "@fibery/react/src/prevent-default";
2
+ import {css, cx} from "@linaria/core";
3
+ import {ReactNode} from "react";
4
+
5
+ type CardHiddenLinkProps = {
6
+ href: string;
7
+ coverArea: boolean;
8
+ children: ReactNode;
9
+ };
10
+
11
+ export const CardHiddenLink = ({href, coverArea, children}: CardHiddenLinkProps) => {
12
+ return (
13
+ <a
14
+ href={href}
15
+ draggable="false"
16
+ onClick={preventDefault}
17
+ // To avoid tab on hidden link. but with this we can't open card via keyboard navigation.
18
+ tabIndex={-1}
19
+ data-is-card-hidden-link={true}
20
+ className={
21
+ coverArea
22
+ ? cx(
23
+ css`
24
+ &::after {
25
+ content: "";
26
+ position: absolute;
27
+ left: 0;
28
+ top: 0;
29
+ right: 0;
30
+ bottom: 0;
31
+ }
32
+ `
33
+ )
34
+ : cx(
35
+ css`
36
+ color: inherit;
37
+
38
+ &:hover {
39
+ color: inherit;
40
+ }
41
+
42
+ &:visited {
43
+ color: inherit;
44
+ }
45
+ `
46
+ )
47
+ }
48
+ >
49
+ {children}
50
+ </a>
51
+ );
52
+ };
@@ -3,11 +3,17 @@ import ArrowBottom from "./icons/react/ArrowBottom";
3
3
  import ArrowTop from "./icons/react/ArrowTop";
4
4
  import {ReactNode, useCallback} from "react";
5
5
  import {useControllableState} from "@fibery/react/src/use-controllable-state";
6
+ import {space} from "./design-system";
6
7
 
7
8
  const headerCss = css`
8
9
  display: flex;
9
10
  align-items: center;
10
- justify-content: space-between;
11
+ gap: ${space.s8}px;
12
+ `;
13
+
14
+ const arrowCss = css`
15
+ margin-left: auto;
16
+ margin-right: 0;
11
17
  `;
12
18
 
13
19
  type Props = {
@@ -17,6 +23,8 @@ type Props = {
17
23
  collapsedDefault?: boolean;
18
24
  onCollapsedChange?: (collapsed: boolean) => void;
19
25
  children: ReactNode;
26
+ badge?: ReactNode;
27
+ keepChildren?: boolean;
20
28
  };
21
29
 
22
30
  export const CollapsibleSection = ({
@@ -26,6 +34,7 @@ export const CollapsibleSection = ({
26
34
  collapsedDefault = false,
27
35
  onCollapsedChange,
28
36
  children,
37
+ badge,
29
38
  }: Props) => {
30
39
  const [isCollapsed, setIsCollapsed] = useControllableState({
31
40
  value: collapsed,
@@ -33,7 +42,7 @@ export const CollapsibleSection = ({
33
42
  onChange: onCollapsedChange,
34
43
  });
35
44
 
36
- const arrow = isCollapsed ? <ArrowBottom /> : <ArrowTop />;
45
+ const arrow = isCollapsed ? <ArrowBottom className={arrowCss} /> : <ArrowTop className={arrowCss} />;
37
46
 
38
47
  const onToggle = useCallback(() => setIsCollapsed(!isCollapsed), [isCollapsed, setIsCollapsed]);
39
48
 
@@ -54,6 +63,7 @@ export const CollapsibleSection = ({
54
63
  }}
55
64
  >
56
65
  {label}
66
+ {badge}
57
67
  {arrow}
58
68
  </div>
59
69
  );
@@ -63,7 +73,7 @@ export const CollapsibleSection = ({
63
73
  return (
64
74
  <div>
65
75
  {collapsible ? collapsibleHeader : regularHeader}
66
- {collapsible && isCollapsed ? null : children}
76
+ <div style={{display: collapsible && isCollapsed ? "none" : "block"}}>{children}</div>
67
77
  </div>
68
78
  );
69
79
  };
@@ -29,76 +29,80 @@ const hexInpuWrapperCss = css`
29
29
  margin-top: ${space.s12}px;
30
30
  `;
31
31
 
32
- const SliderPicker = ColorWrap(({containerClassName, colors, getSwatchHoverColor, ...rest}) => {
33
- const hasSelectedColor = Boolean(rest.color);
32
+ const SliderPicker = ColorWrap(
33
+ ({containerClassName, colors, getSwatchHoverColor, getColorOverrideFn = undefined, ...rest}) => {
34
+ const hasSelectedColor = Boolean(rest.color);
34
35
 
35
- const idxSelectedColor = colors?.findIndex((color) => color.toLowerCase() === rest.hex.toLowerCase());
36
+ const idxSelectedColor = colors?.findIndex((color) => color.toLowerCase() === rest.hex.toLowerCase());
36
37
 
37
- const [isExpanded, setIsExpanded] = useState(false);
38
+ const [isExpanded, setIsExpanded] = useState(false);
38
39
 
39
- const isCustomSwatchSelected = (idxSelectedColor === -1 && hasSelectedColor) || isExpanded;
40
+ const isCustomSwatchSelected = (idxSelectedColor === -1 && hasSelectedColor) || isExpanded;
41
+ const getColorOverride = getColorOverrideFn || ((color) => color);
40
42
 
41
- return (
42
- <CollapsibleRoot open={isCustomSwatchSelected} onOpenChange={setIsExpanded} className={pickerWrapperCss}>
43
- {colors && (
44
- <div className={containerClassName}>
45
- {colors.map((color, idx) => (
46
- <Swatch
47
- key={color}
48
- getHoverColor={getSwatchHoverColor}
49
- onClick={() => {
50
- setIsExpanded(false);
51
- rest.onChange(color);
43
+ return (
44
+ <CollapsibleRoot open={isCustomSwatchSelected} onOpenChange={setIsExpanded} className={pickerWrapperCss}>
45
+ {colors && (
46
+ <div className={containerClassName}>
47
+ {colors.map((color, idx) => (
48
+ <Swatch
49
+ key={color}
50
+ getHoverColor={getSwatchHoverColor}
51
+ onClick={() => {
52
+ setIsExpanded(false);
53
+ rest.onChange(color);
54
+ }}
55
+ color={getColorOverride(color)}
56
+ selected={!isCustomSwatchSelected && idxSelectedColor === idx}
57
+ />
58
+ ))}
59
+ <CollapsibleTrigger asChild>
60
+ <Swatch
61
+ custom
62
+ getHoverColor={getSwatchHoverColor}
63
+ onClick={() => setIsExpanded(!isExpanded)}
64
+ selected={isCustomSwatchSelected}
65
+ color={isCustomSwatchSelected ? rest.hex : undefined}
66
+ />
67
+ </CollapsibleTrigger>
68
+ </div>
69
+ )}
70
+
71
+ <CollapsibleContent>
72
+ <div className={saturationWrapperCss}>
73
+ <Saturation {...rest} pointer={SliderPointer} />
74
+ </div>
75
+ <div className={hueWrapperCss}>
76
+ <Hue {...rest} pointer={SliderPointer} />
77
+ </div>
78
+ <div className={hexInpuWrapperCss}>
79
+ <EditableInput
80
+ style={{
81
+ input: {
82
+ padding: `${space.s6}px ${space.s12}px`,
83
+ width: "100%",
84
+ border: "none",
85
+ borderRadius: border.radius6,
86
+ backgroundColor: themeVars.actionMenuBg,
87
+ boxShadow: themeVars.inputBorderColor,
88
+ outline: "none",
89
+ ...textStyles.regular,
90
+ },
52
91
  }}
53
- color={color}
54
- selected={!isCustomSwatchSelected && idxSelectedColor === idx}
55
- />
56
- ))}
57
- <CollapsibleTrigger asChild>
58
- <Swatch
59
- custom
60
- getHoverColor={getSwatchHoverColor}
61
- onClick={() => setIsExpanded(!isExpanded)}
62
- selected={isCustomSwatchSelected}
63
- color={isCustomSwatchSelected ? rest.hex : undefined}
92
+ value={rest.hex}
93
+ onChange={rest.onChange}
64
94
  />
65
- </CollapsibleTrigger>
66
- </div>
67
- )}
68
-
69
- <CollapsibleContent>
70
- <div className={saturationWrapperCss}>
71
- <Saturation {...rest} pointer={SliderPointer} />
72
- </div>
73
- <div className={hueWrapperCss}>
74
- <Hue {...rest} pointer={SliderPointer} />
75
- </div>
76
- <div className={hexInpuWrapperCss}>
77
- <EditableInput
78
- style={{
79
- input: {
80
- padding: `${space.s6}px ${space.s12}px`,
81
- width: "100%",
82
- border: "none",
83
- borderRadius: border.radius6,
84
- backgroundColor: themeVars.actionMenuBg,
85
- boxShadow: themeVars.inputBorderColor,
86
- outline: "none",
87
- ...textStyles.regular,
88
- },
89
- }}
90
- value={rest.hex}
91
- onChange={rest.onChange}
92
- />
93
- </div>
94
- </CollapsibleContent>
95
- </CollapsibleRoot>
96
- );
97
- });
95
+ </div>
96
+ </CollapsibleContent>
97
+ </CollapsibleRoot>
98
+ );
99
+ }
100
+ );
98
101
 
99
102
  export const ColorPicker = ({
100
103
  color,
101
104
  getSwatchHoverColor,
105
+ getColorOverrideFn = undefined,
102
106
  colors,
103
107
  onChangeComplete,
104
108
  containerClassName = colorSwatchContainerCss,
@@ -110,6 +114,7 @@ export const ColorPicker = ({
110
114
  containerClassName={containerClassName}
111
115
  color={optimisticColor}
112
116
  getSwatchHoverColor={getSwatchHoverColor}
117
+ getColorOverrideFn={getColorOverrideFn}
113
118
  colors={colors}
114
119
  onChange={setOptimisticColor}
115
120
  onChangeComplete={onChangeComplete}
@@ -1,22 +1,26 @@
1
- import {CSSProperties, css, cx} from "@linaria/core";
1
+ import {css, CSSProperties, cx} from "@linaria/core";
2
2
  import {forwardRef} from "react";
3
3
  import {IconButton, IconButtonProps} from "../button/icon-button";
4
4
  import {themeVars} from "../design-system";
5
5
 
6
+ const swatchColorVar = "--fibery-swatch-color";
7
+ const swatchHoverColorVar = "--fibery-swatch-hover-color";
8
+ const swatchIconSizeVar = "--fibery-swatch-icon-size";
9
+
6
10
  const swatchContainerCss = css`
7
11
  &:hover:not(:disabled),
8
12
  &:focus-visible {
9
- background-color: var(--fibery-swatch-hover-color, ${themeVars.badgeBgColor});
13
+ background-color: var(${swatchHoverColorVar}, ${themeVars.badgeBgColor});
10
14
  }
11
15
  `;
12
16
 
13
17
  const swatchCss = css`
14
18
  position: relative;
15
19
  border-radius: 100%;
16
- width: 20px;
17
- height: 20px;
20
+ width: var(${swatchIconSizeVar});
21
+ height: var(${swatchIconSizeVar});
18
22
  border: 1px solid ${themeVars.colorPickerSwatchBorder};
19
- background-color: var(--swatch-color);
23
+ background-color: var(${swatchColorVar});
20
24
  `;
21
25
 
22
26
  const selectedCss = css`
@@ -24,8 +28,8 @@ const selectedCss = css`
24
28
  content: "";
25
29
  position: absolute;
26
30
  display: block;
27
- width: 16px;
28
- height: 16px;
31
+ width: calc(var(${swatchIconSizeVar}) - 4px);
32
+ height: calc(var(${swatchIconSizeVar}) - 4px);
29
33
  border-radius: 100%;
30
34
  top: 1px;
31
35
  left: 1px;
@@ -51,28 +55,39 @@ const customCss = css`
51
55
 
52
56
  &.${selectedCss} {
53
57
  &::after {
54
- background-color: var(--swatch-color);
58
+ background-color: var(${swatchColorVar});
55
59
  }
56
60
  }
57
61
  `;
58
62
 
63
+ const iconSizes = {
64
+ tiny: 16,
65
+ small: 16,
66
+ medium: 18,
67
+ large: 20,
68
+ huge: 22,
69
+ xLarge: 22,
70
+ };
71
+
59
72
  type SwatchProps = {
60
73
  color: string;
61
74
  getHoverColor?: (color: string) => string | undefined;
62
- selected: boolean;
75
+ selected?: boolean;
63
76
  custom?: boolean;
64
- } & Omit<IconButtonProps, "size">;
77
+ } & Omit<IconButtonProps, "color">;
78
+
65
79
  export const Swatch = forwardRef<HTMLButtonElement, SwatchProps>(
66
- ({color, getHoverColor, selected, custom, className, ...rest}, ref) => {
80
+ ({size = "large", color, getHoverColor, selected, custom, className, ...rest}, ref) => {
67
81
  return (
68
82
  <IconButton
69
83
  ref={ref}
70
- size="large"
84
+ size={size}
71
85
  title={color}
72
86
  style={
73
87
  {
74
- "--swatch-color": color,
75
- "--fibery-swatch-hover-color": color ? getHoverColor?.(color) : undefined,
88
+ [swatchColorVar]: color,
89
+ [swatchHoverColorVar]: color ? getHoverColor?.(color) : undefined,
90
+ [swatchIconSizeVar]: `${iconSizes[size]}px`,
76
91
  } as CSSProperties
77
92
  }
78
93
  className={cx(swatchContainerCss, className)}
@@ -4,7 +4,7 @@ import {css, cx} from "@linaria/core";
4
4
  import {styled} from "@linaria/react";
5
5
  import {CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandRoot, CommandSeparator} from "cmdk";
6
6
  import {forwardRef, useRef, useState} from "react";
7
- import {border, layout, space, textStyles, themeVars} from "../design-system";
7
+ import {border, layout, layoutVars, space, textStyles, themeVars} from "../design-system";
8
8
  import ClearInputFilled from "../icons/react/ClearInputFilled";
9
9
  import Search from "../icons/react/Search";
10
10
 
@@ -20,9 +20,10 @@ export const CommandMenuRoot = styled(CommandRoot)`
20
20
 
21
21
  const inputContainerCss = css`
22
22
  display: flex;
23
- padding: ${space.s8}px ${space.s12}px;
23
+ padding: ${space.s4}px ${space.s12}px ${space.s8}px;
24
24
  align-items: center;
25
25
  border-bottom: 1px solid ${themeVars.separatorColor};
26
+ margin-bottom: ${space.s4}px;
26
27
 
27
28
  & input {
28
29
  min-width: 120px;
@@ -84,7 +85,6 @@ export const CommandMenuList = styled(CommandList)`
84
85
  height: var(--cmdk-list-height);
85
86
  max-height: 450px;
86
87
  transition: height 100ms ease;
87
- margin-top: ${space.s4}px;
88
88
  `;
89
89
 
90
90
  export const CommandMenuEmpty = styled(CommandEmpty)`
@@ -92,7 +92,7 @@ export const CommandMenuEmpty = styled(CommandEmpty)`
92
92
  display: flex;
93
93
  align-items: center;
94
94
  padding: 0 ${space.s12}px;
95
- min-height: ${layout.itemHeight}px;
95
+ min-height: ${layoutVars.menuItemHeight};
96
96
  color: ${themeVars.accentTextColor};
97
97
  `;
98
98
 
@@ -119,7 +119,7 @@ export const commandItemCss = css`
119
119
  gap: ${space.s6}px;
120
120
  padding: 0 ${space.s8}px;
121
121
  cursor: pointer;
122
- min-height: ${layout.menuItemHeight}px;
122
+ min-height: ${layoutVars.menuItemHeight};
123
123
  margin: 0 ${space.s4}px;
124
124
  border-radius: ${border.radius6}px;
125
125
 
@@ -3,6 +3,7 @@ import {styled} from "@linaria/react";
3
3
  import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
4
4
  import {forwardRef} from "react";
5
5
  import {border, layout, space, textStyles, themeVars} from "../design-system";
6
+ import {mobileRootSelector} from "../mobile-styles";
6
7
 
7
8
  export const Root = (contextMenuProps: ContextMenuPrimitive.ContextMenuProps) => (
8
9
  <ContextMenuPrimitive.Root dir="ltr" {...contextMenuProps} />
@@ -22,7 +23,7 @@ export const rowItemStyles = {
22
23
  margin: `0px ${space.s4}px`,
23
24
  cursor: "pointer",
24
25
 
25
- "&:hover,&[data-highlighted]": {
26
+ '&:hover,&[data-highlighted],&[aria-expanded="true"]': {
26
27
  inset: "10px 4px",
27
28
  marginLeft: 4,
28
29
  marginRight: 4,
@@ -34,11 +35,19 @@ export const rowItemStyles = {
34
35
  cursor: "default",
35
36
  color: themeVars.disabledTextColor,
36
37
 
38
+ "--actions-menu-item-icon-color": themeVars.disabledTextColor,
39
+
37
40
  "&:hover": {
38
41
  color: themeVars.disabledTextColor,
39
42
  backgroundColor: themeVars.transparent,
40
43
  },
41
44
  },
45
+
46
+ [`${mobileRootSelector} &`]: {
47
+ ...textStyles.big,
48
+ minHeight: layout.mobileMenuItemHeight,
49
+ padding: `0px ${space.s12}px`,
50
+ },
42
51
  };
43
52
 
44
53
  const dropdownMenuContentStyles = css`