@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @fibery/ui-kit
2
2
 
3
+ ## 1.38.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ab88ef9: add ToggleButtonGroupXComponent
8
+
9
+ ### Patch Changes
10
+
11
+ - ece31af: Move expression-utils to typescript
12
+ - d5b2a71: add RoundTogleButton
13
+ - 0d0530a: add ToggleButton component
14
+ - Updated dependencies [586c255]
15
+ - @fibery/emoji-data@2.7.0
16
+
17
+ ## 1.37.0
18
+
19
+ ### Minor Changes
20
+
21
+ - aba5c58: update colors palette
22
+
3
23
  ## 1.36.2
4
24
 
5
25
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fibery/ui-kit",
3
- "version": "1.36.2",
3
+ "version": "1.38.0",
4
4
  "private": false,
5
5
  "license": "UNLICENSED",
6
6
  "dependencies": {
@@ -12,6 +12,8 @@
12
12
  "@radix-ui/react-dropdown-menu": "2.1.1",
13
13
  "@radix-ui/react-navigation-menu": "1.2.1",
14
14
  "@radix-ui/react-toast": "1.2.2",
15
+ "@radix-ui/react-toggle": "1.1.10",
16
+ "@radix-ui/react-toggle-group": "1.1.11",
15
17
  "@radix-ui/react-tooltip": "1.1.3",
16
18
  "@types/d3-shape": "^3.1.6",
17
19
  "@types/react-select-country-list": "^2.2.3",
@@ -36,6 +38,7 @@
36
38
  "react-color": "2.19.3",
37
39
  "react-day-picker": "8.1.4",
38
40
  "react-intersection-observer": "9.3.5",
41
+ "react-medium-image-zoom": "5.2.10",
39
42
  "react-popper": "2.3.0",
40
43
  "react-select": "5.3.2",
41
44
  "react-select-country-list": "2.2.1",
@@ -43,7 +46,7 @@
43
46
  "screenfull": "6.0.1",
44
47
  "tabbable": "5.2.1",
45
48
  "ua-parser-js": "1.0.39",
46
- "@fibery/emoji-data": "2.6.1",
49
+ "@fibery/emoji-data": "2.7.0",
47
50
  "@fibery/helpers": "1.3.3",
48
51
  "@fibery/react": "1.4.4"
49
52
  },
@@ -54,7 +57,6 @@
54
57
  "devDependencies": {
55
58
  "@babel/core": "7.23.9",
56
59
  "@babel/runtime": "7.23.9",
57
- "@wyw-in-js/babel-preset": "0.5.5",
58
60
  "@testing-library/dom": "8.19.1",
59
61
  "@testing-library/jest-dom": "5.16.5",
60
62
  "@testing-library/react": "13.4.0",
@@ -68,6 +70,7 @@
68
70
  "@types/prop-types": "15.7.5",
69
71
  "@types/react": "18.0.26",
70
72
  "@types/react-dom": "18.0.10",
73
+ "@wyw-in-js/babel-preset": "0.5.5",
71
74
  "csstype": "3.0.8",
72
75
  "fs-extra": "10.0.0",
73
76
  "glob": "7.1.7",
@@ -79,8 +82,8 @@
79
82
  "svgo": "2.8.0",
80
83
  "typescript": "5.8.3",
81
84
  "unist-util-reduce": "0.2.2",
82
- "@fibery/babel-preset": "7.4.0",
83
- "@fibery/eslint-config": "8.6.1"
85
+ "@fibery/eslint-config": "8.6.1",
86
+ "@fibery/babel-preset": "7.4.0"
84
87
  },
85
88
  "jest": {
86
89
  "testEnvironment": "jsdom",
@@ -1,19 +1,20 @@
1
1
  import {css, cx} from "@linaria/core";
2
2
  import {forwardRef, ReactNode} from "react";
3
3
  import {BaseButton, BaseButtonProps} from "./button/base-button";
4
- import {space, themeVars, typeSizes} from "./design-system";
4
+ import {fontWeight, space, themeVars, typeSizes} from "./design-system";
5
5
  import {iconSizeVar} from "./icons/Icon";
6
6
 
7
7
  const containerStyle = css`
8
8
  display: inline-flex;
9
9
  vertical-align: text-top;
10
10
  height: 18px;
11
+ margin-top: ${space.s1}px;
11
12
  align-items: center;
12
- padding: ${space.s2}px ${space.s4}px;
13
- border-radius: 20px;
13
+ padding: 2.5px ${space.s4}px;
14
+ border-radius: ${space.s4}px;
14
15
 
15
16
  font-size: ${typeSizes[6]}px;
16
- text-transform: uppercase;
17
+ font-weight: ${fontWeight.medium};
17
18
 
18
19
  &:is(:disabled) {
19
20
  color: ${themeVars.accentTextColor};
@@ -2,19 +2,9 @@ import {css} from "@linaria/core";
2
2
  import {ActionsPanel} from "../actions-panel";
3
3
  import {AntModal} from "../antd/ant-modal";
4
4
  import {Button} from "../button/button";
5
- import {border, space, themeVars} from "../design-system";
5
+ import {space, themeVars} from "../design-system";
6
6
  import {useActionsMenuContext} from "./contexts/actions-menu-context";
7
7
 
8
- const modalClass = css`
9
- & .ant-modal-content {
10
- box-shadow: ${themeVars.shadowModal};
11
- margin-left: ${space.s6}px;
12
- margin-right: ${space.s6}px;
13
- background-color: ${themeVars.modalContentBg};
14
- border-radius: ${border.radius6}px;
15
- }
16
- `;
17
-
18
8
  export type ActionsMenuConfirmationProps = {
19
9
  message: string;
20
10
  onCancel?: () => void;
@@ -32,7 +22,6 @@ export const ActionsMenuConfirmation: React.FC<ActionsMenuConfirmationProps> = (
32
22
  closable={false}
33
23
  footer={null}
34
24
  maskStyle={{backgroundColor: themeVars.modalBg}}
35
- className={modalClass}
36
25
  maskClosable
37
26
  onCancel={() => showConfirmation(null)}
38
27
  >
@@ -2,12 +2,14 @@ import {stopPropagation} from "@fibery/react/src/stop-propagation";
2
2
  import {useCallbackRef} from "@fibery/react/src/use-callback-ref";
3
3
  import {css, cx} from "@linaria/core";
4
4
  import {FunctionComponent, memo, ReactNode, useId} from "react";
5
- import {border, colors, layout, lineHeight, space, textStyles, themeVars} from "../design-system";
5
+ import {border, colors, layout, layoutVars, lineHeight, space, textStyles, themeVars} from "../design-system";
6
6
  import CheckedIcon from "../icons/react/Checked";
7
7
  import {IconBaseProps} from "../icons/types";
8
8
  import {Spinner} from "../loaders";
9
+ import {mobileRootSelector} from "../mobile-styles";
9
10
  import {ShortcutBadge} from "../shortcut-badge";
10
11
  import {useTheme} from "../theme-provider";
12
+ import {useIsPhone} from "../use-is-phone";
11
13
  import {useActionsMenuContext} from "./contexts/actions-menu-context";
12
14
  import {useActiveDangerousRow, useSetActiveDangerousRow} from "./contexts/actions-menu-dangerous-rows";
13
15
 
@@ -31,8 +33,11 @@ const descriptionCss = css`
31
33
  const rowCss = css`
32
34
  display: flex;
33
35
  align-items: center;
34
- min-height: ${layout.menuItemHeight}px;
36
+ min-height: ${layoutVars.menuItemHeight};
35
37
  gap: ${space.s6}px;
38
+ ${mobileRootSelector} & {
39
+ gap: ${space.s8}px;
40
+ }
36
41
  `;
37
42
 
38
43
  const dangerousItemCss = css`
@@ -87,20 +92,25 @@ const firstLetterToLowerCase = (str: string) => {
87
92
 
88
93
  const RightCorner = ({shortcut, loading, checked}: {shortcut?: string; loading?: boolean; checked?: boolean}) => {
89
94
  const theme = useTheme();
95
+ const isPhone = useIsPhone();
90
96
 
91
97
  return loading || shortcut || checked ? (
92
98
  <div className={cornerCss}>
93
- {loading ? <Spinner color={theme.primary} size={16} containerSize={16} /> : null}
99
+ {loading ? <Spinner color={theme.primary} iconSize={16} containerSize={16} /> : null}
94
100
  {shortcut ? <ShortcutBadge shortcut={shortcut} /> : null}
95
- {checked ? <CheckedIcon iconSize={18} color={themeVars.textColor} /> : null}
101
+ {checked ? <CheckedIcon iconSize={isPhone ? 20 : 18} color={themeVars.textColor} /> : null}
96
102
  </div>
97
103
  ) : null;
98
104
  };
99
105
 
100
- const LeftCorner = ({Icon}: {Icon: FunctionComponent<IconBaseProps> | void}) => {
106
+ const LeftCorner = ({Icon, iconColor}: {Icon: FunctionComponent<IconBaseProps> | void; iconColor?: string}) => {
107
+ const isPhone = useIsPhone();
101
108
  return Icon ? (
102
109
  <div className={cornerCss}>
103
- <Icon color={`var(--actions-menu-item-icon-color, ${themeVars.iconColor})`} iconSize={18} />
110
+ <Icon
111
+ color={`var(--actions-menu-item-icon-color, ${iconColor ?? themeVars.iconColor})`}
112
+ iconSize={isPhone ? 20 : 18}
113
+ />
104
114
  </div>
105
115
  ) : null;
106
116
  };
@@ -115,6 +125,7 @@ export type ActionsMenuItemProps = {
115
125
  description?: string;
116
126
  /** Icon's component */
117
127
  Icon?: FunctionComponent<IconBaseProps>;
128
+ iconColor?: string;
118
129
  /** Hint for keyboard shortcut for this action */
119
130
  shortcut?: string;
120
131
  disabled?: boolean;
@@ -135,6 +146,7 @@ const ActionsMenuItemComponent: React.FC<
135
146
  onSelect,
136
147
  description,
137
148
  Icon,
149
+ iconColor,
138
150
  shortcut,
139
151
  disabled,
140
152
  dangerous,
@@ -180,7 +192,7 @@ const ActionsMenuItemComponent: React.FC<
180
192
  )}
181
193
  disabled={disabled}
182
194
  >
183
- <LeftCorner Icon={Icon} />
195
+ <LeftCorner Icon={Icon} iconColor={iconColor} />
184
196
  <div className={rowContentCss}>
185
197
  {dangerous && (
186
198
  <div className={cx(hiddenTextCss, showWarning && visibleTextCss)}>
@@ -22,6 +22,10 @@ export type ActionsMenuProps = {
22
22
  sideOffset?: number;
23
23
  collisionPadding?: number;
24
24
  autoFocusOnClose?: boolean;
25
+ /** Show menu in a modal on mobile */
26
+ supportsMobile?: boolean;
27
+ mobileTitle?: string;
28
+ height?: string;
25
29
  onEscapeKeyDown?: (event: KeyboardEvent) => void;
26
30
  sticky?: DropdownMenuContentProps["sticky"];
27
31
  };
@@ -16,6 +16,7 @@ import {ActionsMenuSubMenu} from "./actions-menu-sub-menu";
16
16
  import {useActionsMenuContext} from "./contexts/actions-menu-context";
17
17
  // eslint-disable-next-line no-restricted-imports
18
18
  import {IconBaseProps} from "@fibery/ui-kit/src/icons/types";
19
+ import {useIsPhone} from "../use-is-phone";
19
20
 
20
21
  const [ActionsMenuSubCommandMenuProvider, useActionsMenuSubCommandMenuCtx] = createContext<{
21
22
  subMenuOpenRef: RefObject<boolean>;
@@ -113,18 +114,20 @@ export const ActionsMenuSubCommandMenuRoot: React.FC<React.ComponentPropsWithout
113
114
 
114
115
  type ActionsMenuSubCommandMenuInputProps = React.ComponentPropsWithoutRef<typeof CommandMenuInput>;
115
116
  export const ActionsMenuSubCommandMenuInput: React.FC<ActionsMenuSubCommandMenuInputProps> = ({
116
- autoFocus = true,
117
+ autoFocus,
117
118
  onKeyDown,
118
119
  ...otherProps
119
120
  }) => {
121
+ const isPhone = useIsPhone();
120
122
  const inputRef = useRef<HTMLInputElement | null>(null);
123
+ const shouldFocus = autoFocus ?? (isPhone ? false : true);
121
124
 
122
125
  useEffect(() => {
123
126
  // html autofocus doesn't work reliably in Context Menu
124
- if (autoFocus) {
127
+ if (shouldFocus) {
125
128
  setTimeout(() => inputRef.current?.focus(), 0);
126
129
  }
127
- }, [autoFocus]);
130
+ }, [shouldFocus]);
128
131
 
129
132
  return (
130
133
  <CommandMenuInput
@@ -136,7 +139,7 @@ export const ActionsMenuSubCommandMenuInput: React.FC<ActionsMenuSubCommandMenuI
136
139
  }
137
140
  onKeyDown?.(e);
138
141
  }}
139
- autoFocus={autoFocus}
142
+ autoFocus={shouldFocus}
140
143
  {...otherProps}
141
144
  />
142
145
  );
@@ -6,6 +6,7 @@ import ArrowRight from "../icons/react/ArrowRight";
6
6
  import {useActionsMenuContext} from "./contexts/actions-menu-context";
7
7
  // eslint-disable-next-line no-restricted-imports
8
8
  import {IconBaseProps} from "@fibery/ui-kit/src/icons/types";
9
+ import {useIsPhone} from "../use-is-phone";
9
10
 
10
11
  const subTriggerClass = css`
11
12
  display: flex;
@@ -24,6 +25,7 @@ type Props = React.PropsWithChildren<{
24
25
  open?: boolean;
25
26
  onOpenChange?: (v: boolean) => void;
26
27
  disabled?: boolean;
28
+ mobileTitle?: string;
27
29
  contentClassName?: string;
28
30
  container?: HTMLElement | null;
29
31
  Icon?: FunctionComponent<IconBaseProps>;
@@ -37,9 +39,11 @@ const cornerCss = css`
37
39
  `;
38
40
 
39
41
  const LeftCorner = ({Icon}: {Icon: FunctionComponent<IconBaseProps> | void}) => {
42
+ const isPhone = useIsPhone();
43
+
40
44
  return Icon ? (
41
45
  <div className={cornerCss}>
42
- <Icon color={`var(--actions-menu-item-icon-color, ${themeVars.iconColor})`} iconSize={18} />
46
+ <Icon color={`var(--actions-menu-item-icon-color, ${themeVars.iconColor})`} iconSize={isPhone ? 20 : 18} />
43
47
  </div>
44
48
  ) : null;
45
49
  };
@@ -55,14 +59,16 @@ export const ActionsMenuSubMenu: React.FC<Props> = ({
55
59
  triggerRef,
56
60
  children,
57
61
  disabled = false,
62
+ mobileTitle = trigger,
58
63
  contentClassName,
59
64
  Icon,
60
65
  onMouseEnter,
61
66
  }) => {
67
+ const isPhone = useIsPhone();
62
68
  const {MenuPrimitive, container} = useActionsMenuContext();
63
69
 
64
70
  return (
65
- <MenuPrimitive.Sub open={open} onOpenChange={onOpenChange}>
71
+ <MenuPrimitive.Sub title={mobileTitle} open={open} onOpenChange={onOpenChange}>
66
72
  <MenuPrimitive.SubTrigger
67
73
  ref={triggerRef}
68
74
  className={subTriggerClass}
@@ -75,7 +81,7 @@ export const ActionsMenuSubMenu: React.FC<Props> = ({
75
81
  <div className={arrowClass}>
76
82
  <ArrowRight
77
83
  color={disabled ? themeVars.disabledTextColor : themeVars.iconColor}
78
- containerSize={10}
84
+ containerSize={isPhone ? 20 : 10}
79
85
  aria-hidden
80
86
  />
81
87
  </div>
@@ -1,11 +1,14 @@
1
1
  import {useControllableState} from "@fibery/react/src/use-controllable-state";
2
2
  import {css, cx} from "@linaria/core";
3
+ import {useIsPhone} from "../use-is-phone";
3
4
  import * as DropdownMenu from "../dropdown-menu";
5
+ import * as ModalMenu from "../modal-menu";
4
6
  import {ActionsMenuContextProvider} from "./contexts/actions-menu-context";
5
7
  import {ActionsMenuDangerousRowsProvider} from "./contexts/actions-menu-dangerous-rows";
6
8
  import {ActionsMenuProps} from "./actions-menu-props";
7
9
  import {preventDefault} from "@fibery/react/src/prevent-default";
8
10
  import {useState} from "react";
11
+ import {useFeatures} from "../features";
9
12
  import {ActionsMenuConfirmation, ActionsMenuConfirmationProps} from "./actions-menu-confirmation";
10
13
  import {useActionsMenuOpenStateTracker} from "./actions-menu-open-state-tracker";
11
14
 
@@ -36,8 +39,12 @@ export const ActionsMenu = ({
36
39
  contentStyles,
37
40
  modal,
38
41
  autoFocusOnClose,
42
+ supportsMobile,
43
+ mobileTitle,
39
44
  sticky,
45
+ height,
40
46
  }: ActionsMenuProps): JSX.Element => {
47
+ const features = useFeatures<{enableMobileMenus: boolean}>();
41
48
  const {onMenuOpenChange} = useActionsMenuOpenStateTracker();
42
49
  const [isOpen = false, setOpen] = useControllableState({
43
50
  value: open,
@@ -48,26 +55,35 @@ export const ActionsMenu = ({
48
55
  onMenuOpenChange(value);
49
56
  },
50
57
  });
58
+ const isPhone = useIsPhone();
51
59
  const [confirmation, setConfirmation] = useState<ActionsMenuConfirmationProps | null>(null);
52
60
 
61
+ const MenuPrimitive = isPhone && features.enableMobileMenus && supportsMobile ? ModalMenu : DropdownMenu;
62
+
53
63
  return (
54
64
  <ActionsMenuContextProvider
55
65
  setOpen={setOpen}
56
66
  showConfirmation={setConfirmation}
57
- MenuPrimitive={DropdownMenu}
67
+ MenuPrimitive={MenuPrimitive}
58
68
  container={container}
59
69
  >
60
- <DropdownMenu.Root open={isOpen} onOpenChange={setOpen} modal={modal || false}>
61
- <DropdownMenu.Trigger
70
+ <MenuPrimitive.Root
71
+ open={isOpen}
72
+ height={height}
73
+ onOpenChange={setOpen}
74
+ modal={modal || false}
75
+ title={mobileTitle}
76
+ >
77
+ <MenuPrimitive.Trigger
62
78
  // backward compatibility for dropdown styles
63
- className={isOpen ? "actions-visible" : "actions-hidden"}
79
+ className={isOpen ? "actions-visible" : "actions-hidden actions-visible-on-mobile"}
64
80
  onClick={preventDefaultAndStopPropagation}
65
81
  disabled={disabled}
66
82
  asChild
67
83
  >
68
84
  {trigger}
69
- </DropdownMenu.Trigger>
70
- <DropdownMenu.Content
85
+ </MenuPrimitive.Trigger>
86
+ <MenuPrimitive.Content
71
87
  align={align}
72
88
  sticky={sticky}
73
89
  alignOffset={alignOffset}
@@ -81,8 +97,8 @@ export const ActionsMenu = ({
81
97
  onCloseAutoFocus={autoFocusOnClose ? undefined : preventDefault}
82
98
  >
83
99
  <ActionsMenuDangerousRowsProvider open={isOpen}>{children}</ActionsMenuDangerousRowsProvider>
84
- </DropdownMenu.Content>
85
- </DropdownMenu.Root>
100
+ </MenuPrimitive.Content>
101
+ </MenuPrimitive.Root>
86
102
 
87
103
  {confirmation ? <ActionsMenuConfirmation {...confirmation} /> : null}
88
104
  </ActionsMenuContextProvider>
@@ -1,6 +1,7 @@
1
1
  import {Children, forwardRef, ReactElement, ReactNode} from "react";
2
2
  import {css} from "@linaria/core";
3
3
  import {space} from "./design-system";
4
+ import {useIsPhone} from "./use-is-phone";
4
5
 
5
6
  const gridStyle = css`
6
7
  align-items: center;
@@ -12,10 +13,19 @@ type Props = {
12
13
  inline?: boolean;
13
14
  gap?: number;
14
15
  };
16
+
17
+ const getGap = (gap: number | undefined, isPhone: boolean) => {
18
+ if (gap !== undefined) {
19
+ return gap;
20
+ }
21
+ return isPhone ? 0 : space.s4;
22
+ };
23
+
15
24
  export const ActionsPanel = forwardRef<HTMLDivElement, Props>(function ActionsPanelComponent(
16
- {children, inline, gap = space.s4},
25
+ {children, inline, gap},
17
26
  ref
18
27
  ) {
28
+ const isPhone = useIsPhone();
19
29
  const childrenArray = Children.toArray(children);
20
30
  if (childrenArray.length === 0) {
21
31
  return null;
@@ -27,7 +37,7 @@ export const ActionsPanel = forwardRef<HTMLDivElement, Props>(function ActionsPa
27
37
  className={gridStyle}
28
38
  style={{
29
39
  display: inline ? "inline-grid" : "grid",
30
- gridGap: gap,
40
+ gridGap: getGap(gap, isPhone),
31
41
  gridAutoFlow: "column",
32
42
  }}
33
43
  >
@@ -1,11 +1,26 @@
1
1
  import Modal from "antd/lib/modal";
2
2
  import {ModalProps} from "antd/lib/modal/Modal";
3
3
  import "antd/lib/modal/style/css";
4
- import {createInlineTheme} from "../design-system";
4
+ import {border, createInlineTheme, space, themeVars} from "../design-system";
5
5
  import {useTheme} from "../theme-provider";
6
+ import {css, cx} from "@linaria/core";
7
+
8
+ const modalCss = css`
9
+ & .ant-modal-content {
10
+ box-shadow: ${themeVars.shadowPopup};
11
+ margin-left: ${space.s6}px;
12
+ margin-right: ${space.s6}px;
13
+ background-color: ${themeVars.modalContentBg};
14
+ border-radius: ${border.radius8}px;
15
+ }
16
+
17
+ & .ant-modal-body {
18
+ padding: ${space.s20}px;
19
+ }
20
+ `;
6
21
 
7
22
  export function AntModal({bodyStyle = {}, className, ...restProps}: ModalProps) {
8
23
  const theme = useTheme();
9
24
  const inlineTheme = createInlineTheme(theme);
10
- return <Modal bodyStyle={{...bodyStyle, ...inlineTheme}} className={className} {...restProps} />;
25
+ return <Modal bodyStyle={{...bodyStyle, ...inlineTheme}} className={cx(className, modalCss)} {...restProps} />;
11
26
  }
@@ -11,6 +11,9 @@ const TextArea = Input.TextArea;
11
11
 
12
12
  export const transparentInputStyle = css`
13
13
  ${{
14
+ display: "flex",
15
+ alignItems: "center",
16
+
14
17
  "& input, & textarea, & .ant-input-affix-wrapper": {
15
18
  padding: 0,
16
19
  border: "none",
@@ -43,14 +46,12 @@ export const transparentInputStyle = css`
43
46
  const InputWrapper = getWrapper(inputStyles);
44
47
 
45
48
  export const StyledInput = wrapWith(InputWrapper, Input);
46
-
47
49
  export const StyledTextArea = wrapWith(InputWrapper, TextArea);
48
50
 
49
51
  export const TransparentInputWrapper = getWrapper(transparentInputStyle);
50
- export const StyledTransparentInput = wrapWith(TransparentInputWrapper, Input);
51
52
 
52
53
  export type TextAreaRef = React.ElementRef<typeof TextArea>;
53
54
  export const AntTransparentTextArea = wrapWith(TransparentInputWrapper, TextArea);
54
55
 
55
56
  export type InputRef = React.ElementRef<typeof Input>;
56
- export const AntTransparentInput = StyledTransparentInput;
57
+ export const AntTransparentInput = wrapWith(TransparentInputWrapper, Input);
@@ -6,6 +6,7 @@ import {AppIconWrapper} from "./app-icon-wrapper";
6
6
  import {getAppIconBackgroundColor, getOpacities, getThemeValue, iconSize, layout} from "./design-system";
7
7
  import {Icon} from "./icons/Icon";
8
8
  import {useTheme} from "./theme-provider";
9
+ import {useIsPhone} from "./use-is-phone";
9
10
 
10
11
  type AppIcon = {
11
12
  name: string;
@@ -122,15 +123,11 @@ interface AppIconProps {
122
123
  containerSize?: number;
123
124
  }
124
125
 
125
- export const AppIcon: FC<AppIconProps> = ({
126
- icon,
127
- iconSize = 18,
128
- color,
129
- isSelected,
130
- containerSize = layout.newMenuIconSize,
131
- }) => {
126
+ export const AppIcon: FC<AppIconProps> = ({icon, color, isSelected, ...rest}) => {
132
127
  const theme = useTheme();
133
-
128
+ const isPhone = useIsPhone();
129
+ const defaultIconSize = isPhone ? layout.mobileSidebarIconSize : layout.newMenuIconSize;
130
+ const {iconSize = defaultIconSize, containerSize = defaultIconSize} = rest;
134
131
  const iconColor = getThemeValue(theme.mode, {
135
132
  dark: a11yColor(getOpacities(color).opacity95, theme.menuBg, 5),
136
133
  light: a11yColor(getOpacities(color).opacity95, theme.whiteColor, 3),
@@ -3,8 +3,7 @@ import cn from "classnames";
3
3
  import {ReactNode} from "react";
4
4
  import {border, getThemeValue, layout} from "./design-system";
5
5
  import {useTheme} from "./theme-provider";
6
-
7
- export const appIconSize = layout.newMenuIconSize;
6
+ import {useIsPhone} from "./use-is-phone";
8
7
 
9
8
  const appIconContainerStyle = css`
10
9
  border-radius: ${border.radius4}px;
@@ -20,7 +19,7 @@ export const AppIconWrapper = ({
20
19
  children,
21
20
  color,
22
21
  borderless,
23
- containerSize = layout.newMenuIconSize,
22
+ ...rest
24
23
  }: {
25
24
  children?: ReactNode;
26
25
  color: string;
@@ -28,7 +27,8 @@ export const AppIconWrapper = ({
28
27
  containerSize?: number;
29
28
  }) => {
30
29
  const theme = useTheme();
31
-
30
+ const isPhone = useIsPhone();
31
+ const {containerSize = isPhone ? layout.mobileSidebarIconSize : layout.newMenuIconSize} = rest;
32
32
  return (
33
33
  <div
34
34
  style={{backgroundColor: borderless ? "transparent" : color, width: containerSize, height: containerSize}}
package/src/appIcons.json CHANGED
@@ -13023,6 +13023,26 @@
13023
13023
  "imageUrl": "https://images-temp.fibery.io/ui/appIcons/airtable.svg",
13024
13024
  "file": "airtable.svg"
13025
13025
  },
13026
+ {
13027
+ "name": "Asana",
13028
+ "short_names": ["asana"],
13029
+ "customCategory": "Integrations",
13030
+ "text": "",
13031
+ "emoticons": [],
13032
+ "keywords": ["logo", "brand", "integration", "asana"],
13033
+ "imageUrl": "https://images-temp.fibery.io/ui/appIcons/asana.svg",
13034
+ "file": "asana.svg"
13035
+ },
13036
+ {
13037
+ "name": "Fibery",
13038
+ "short_names": ["fibery"],
13039
+ "customCategory": "Integrations",
13040
+ "text": "",
13041
+ "emoticons": [],
13042
+ "keywords": ["logo", "brand", "integration", "fibery"],
13043
+ "imageUrl": "https://images-temp.fibery.io/ui/appIcons/fibery-logo.svg",
13044
+ "file": "fibery-logo.svg"
13045
+ },
13026
13046
  {
13027
13047
  "name": "Readwise",
13028
13048
  "short_names": ["readwise"],