@frontify/guideline-blocks-settings 0.26.8 → 0.28.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 (214) hide show
  1. package/.eslintrc.js +1 -1
  2. package/CHANGELOG.md +26 -0
  3. package/README.md +24 -5
  4. package/package.json +46 -10
  5. package/postcss.config.js +8 -0
  6. package/setupTests.ts +13 -0
  7. package/src/components/Attachments/AttachmentItem.tsx +257 -0
  8. package/src/components/Attachments/Attachments.spec.ct.tsx +151 -0
  9. package/src/components/Attachments/Attachments.tsx +221 -0
  10. package/src/components/Attachments/index.ts +4 -0
  11. package/src/components/Attachments/types.ts +30 -0
  12. package/src/components/BlockInjectButton/BlockInjectButton.spec.ct.tsx +48 -0
  13. package/src/components/BlockInjectButton/BlockInjectButton.tsx +212 -0
  14. package/src/components/BlockInjectButton/index.ts +4 -0
  15. package/src/components/BlockInjectButton/types.ts +18 -0
  16. package/src/components/BlockItemWrapper/BlockItemWrapper.spec.ct.tsx +146 -0
  17. package/src/components/BlockItemWrapper/BlockItemWrapper.tsx +76 -0
  18. package/src/components/BlockItemWrapper/Toolbar.tsx +128 -0
  19. package/src/components/BlockItemWrapper/constants.ts +4 -0
  20. package/src/components/BlockItemWrapper/index.ts +5 -0
  21. package/src/components/BlockItemWrapper/types.ts +46 -0
  22. package/src/components/DownloadButton/DownloadButton.spec.ct.tsx +20 -0
  23. package/src/components/DownloadButton/DownloadButton.tsx +36 -0
  24. package/src/components/DownloadButton/index.ts +3 -0
  25. package/src/components/DownloadButton/types.ts +5 -0
  26. package/src/components/RichTextEditor/RichTextEditor.spec.ct.tsx +204 -0
  27. package/src/components/RichTextEditor/RichTextEditor.tsx +62 -0
  28. package/src/components/RichTextEditor/SerializedText.tsx +25 -0
  29. package/src/components/RichTextEditor/constants.ts +3 -0
  30. package/src/components/RichTextEditor/index.ts +6 -0
  31. package/src/components/RichTextEditor/pluginPresets/defaultPluginsWithLinkChooser.tsx +53 -0
  32. package/src/components/RichTextEditor/pluginPresets/index.ts +3 -0
  33. package/src/components/RichTextEditor/plugins/ButtonPlugin/ButtonMarkupElement/ButtonMarkupElementNode.tsx +74 -0
  34. package/src/components/RichTextEditor/plugins/ButtonPlugin/ButtonMarkupElement/index.ts +11 -0
  35. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/ButtonButton.tsx +20 -0
  36. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/ButtonToolbarButton.tsx +56 -0
  37. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/CustomFloatingButton.tsx +19 -0
  38. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/EditButtonModal/EditModal.tsx +42 -0
  39. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/FloatingButton.tsx +37 -0
  40. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/FloatingButtonEditButton.tsx +22 -0
  41. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/FloatingButtonUrlInput.tsx +30 -0
  42. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/InsertButtonModal/InsertButtonModal.tsx +81 -0
  43. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/InsertButtonModal/types.ts +13 -0
  44. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/InsertButtonModal/useInsertModal.ts +143 -0
  45. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/UnlinkButton.tsx +31 -0
  46. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/floatingButtonStore.ts +46 -0
  47. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/index.ts +12 -0
  48. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/useFloatingButtonEdit.ts +113 -0
  49. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/useFloatingButtonEnter.ts +21 -0
  50. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/useFloatingButtonEscape.ts +30 -0
  51. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/useFloatingButtonInsert.ts +71 -0
  52. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/FloatingButton/useVirtualFloatingButton.ts +22 -0
  53. package/src/components/RichTextEditor/plugins/ButtonPlugin/components/index.ts +3 -0
  54. package/src/components/RichTextEditor/plugins/ButtonPlugin/createButtonPlugin.ts +116 -0
  55. package/src/components/RichTextEditor/plugins/ButtonPlugin/index.ts +7 -0
  56. package/src/components/RichTextEditor/plugins/ButtonPlugin/transforms/index.ts +8 -0
  57. package/src/components/RichTextEditor/plugins/ButtonPlugin/transforms/insertButton.ts +17 -0
  58. package/src/components/RichTextEditor/plugins/ButtonPlugin/transforms/submitFloatingButton.ts +40 -0
  59. package/src/components/RichTextEditor/plugins/ButtonPlugin/transforms/unwrapButton.ts +68 -0
  60. package/src/components/RichTextEditor/plugins/ButtonPlugin/transforms/upsertButton.ts +198 -0
  61. package/src/components/RichTextEditor/plugins/ButtonPlugin/transforms/upsertButtonText.ts +40 -0
  62. package/src/components/RichTextEditor/plugins/ButtonPlugin/transforms/wrapButton.ts +30 -0
  63. package/src/components/RichTextEditor/plugins/ButtonPlugin/types.ts +13 -0
  64. package/src/components/RichTextEditor/plugins/ButtonPlugin/utils/createButtonNode.ts +28 -0
  65. package/src/components/RichTextEditor/plugins/ButtonPlugin/utils/getButtonStyle.ts +14 -0
  66. package/src/components/RichTextEditor/plugins/ButtonPlugin/utils/getUrl.ts +18 -0
  67. package/src/components/RichTextEditor/plugins/ButtonPlugin/utils/index.ts +8 -0
  68. package/src/components/RichTextEditor/plugins/ButtonPlugin/utils/styles.ts +77 -0
  69. package/src/components/RichTextEditor/plugins/ButtonPlugin/utils/triggerFloatingButton.ts +23 -0
  70. package/src/components/RichTextEditor/plugins/ButtonPlugin/utils/triggerFloatingButtonEdit.ts +30 -0
  71. package/src/components/RichTextEditor/plugins/ButtonPlugin/utils/triggerFloatingButtonInsert.ts +45 -0
  72. package/src/components/RichTextEditor/plugins/ButtonPlugin/withButton.ts +106 -0
  73. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/CustomFloatingLink.tsx +26 -0
  74. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/EditLinkModal/EditModal.tsx +43 -0
  75. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/EditLinkModal/index.ts +4 -0
  76. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/EditLinkModal/useFloatingLinkEdit.ts +113 -0
  77. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/FloatingLink.tsx +45 -0
  78. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/InsertLinkModal/InsertLinkModal.tsx +5 -0
  79. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/InsertLinkModal/InsertModal.tsx +105 -0
  80. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/InsertLinkModal/index.ts +4 -0
  81. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/InsertLinkModal/types.ts +16 -0
  82. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/InsertLinkModal/useFloatingLinkInsert.ts +73 -0
  83. package/src/components/RichTextEditor/plugins/LinkPlugin/FloatingLink/InsertLinkModal/useInsertModal.ts +136 -0
  84. package/src/components/RichTextEditor/plugins/LinkPlugin/LinkButton.tsx +38 -0
  85. package/src/components/RichTextEditor/plugins/LinkPlugin/LinkMarkupElement/LinkMarkupElementNode.tsx +36 -0
  86. package/src/components/RichTextEditor/plugins/LinkPlugin/LinkMarkupElement/index.ts +11 -0
  87. package/src/components/RichTextEditor/plugins/LinkPlugin/id.ts +3 -0
  88. package/src/components/RichTextEditor/plugins/LinkPlugin/index.ts +48 -0
  89. package/src/components/RichTextEditor/plugins/LinkPlugin/types.ts +12 -0
  90. package/src/components/RichTextEditor/plugins/LinkPlugin/utils/getUrl.ts +30 -0
  91. package/src/components/RichTextEditor/plugins/LinkPlugin/utils/index.ts +4 -0
  92. package/src/components/RichTextEditor/plugins/LinkPlugin/utils/relativeUrlRegex.spec.ts +35 -0
  93. package/src/components/RichTextEditor/plugins/LinkPlugin/utils/relativeUrlRegex.ts +3 -0
  94. package/src/components/RichTextEditor/plugins/LinkPlugin/utils/url.spec.ts +75 -0
  95. package/src/components/RichTextEditor/plugins/LinkPlugin/utils/url.ts +21 -0
  96. package/src/components/RichTextEditor/plugins/TextStylePlugins/custom1Plugin.tsx +61 -0
  97. package/src/components/RichTextEditor/plugins/TextStylePlugins/custom2Plugin.tsx +61 -0
  98. package/src/components/RichTextEditor/plugins/TextStylePlugins/custom3Plugin.tsx +62 -0
  99. package/src/components/RichTextEditor/plugins/TextStylePlugins/heading1Plugin.tsx +61 -0
  100. package/src/components/RichTextEditor/plugins/TextStylePlugins/heading2Plugin.tsx +58 -0
  101. package/src/components/RichTextEditor/plugins/TextStylePlugins/heading3Plugin.tsx +58 -0
  102. package/src/components/RichTextEditor/plugins/TextStylePlugins/heading4Plugin.tsx +59 -0
  103. package/src/components/RichTextEditor/plugins/TextStylePlugins/helpers.tsx +44 -0
  104. package/src/components/RichTextEditor/plugins/TextStylePlugins/imageCaptionPlugin.tsx +61 -0
  105. package/src/components/RichTextEditor/plugins/TextStylePlugins/imageTitlePlugin.tsx +61 -0
  106. package/src/components/RichTextEditor/plugins/TextStylePlugins/index.ts +15 -0
  107. package/src/components/RichTextEditor/plugins/TextStylePlugins/paragraphPlugin.tsx +58 -0
  108. package/src/components/RichTextEditor/plugins/TextStylePlugins/quotePlugin.tsx +62 -0
  109. package/src/components/RichTextEditor/plugins/index.ts +6 -0
  110. package/src/components/RichTextEditor/plugins/shared/LinkSelector/DocumentLink.tsx +80 -0
  111. package/src/components/RichTextEditor/plugins/shared/LinkSelector/DocumentLinks.tsx +97 -0
  112. package/src/components/RichTextEditor/plugins/shared/LinkSelector/LinkSelector.spec.ct.tsx +138 -0
  113. package/src/components/RichTextEditor/plugins/shared/LinkSelector/LinkSelector.tsx +80 -0
  114. package/src/components/RichTextEditor/plugins/shared/LinkSelector/PageLink.tsx +83 -0
  115. package/src/components/RichTextEditor/plugins/shared/LinkSelector/PageLinks.tsx +68 -0
  116. package/src/components/RichTextEditor/plugins/shared/LinkSelector/SectionLink.tsx +37 -0
  117. package/src/components/RichTextEditor/plugins/shared/LinkSelector/index.ts +3 -0
  118. package/src/components/RichTextEditor/plugins/styles.ts +179 -0
  119. package/src/components/RichTextEditor/serializer/index.ts +3 -0
  120. package/src/components/RichTextEditor/serializer/nodes/button.ts +25 -0
  121. package/src/components/RichTextEditor/serializer/nodes/checkItemNode.ts +29 -0
  122. package/src/components/RichTextEditor/serializer/nodes/default.ts +52 -0
  123. package/src/components/RichTextEditor/serializer/nodes/link.ts +25 -0
  124. package/src/components/RichTextEditor/serializer/nodes/mentionHtmlNode.ts +17 -0
  125. package/src/components/RichTextEditor/serializer/serializeNodesToHtmlRecursive.ts +134 -0
  126. package/src/components/RichTextEditor/serializer/serializeToHtml.ts +49 -0
  127. package/src/components/RichTextEditor/serializer/utlis/reactCssPropsToCss.ts +21 -0
  128. package/src/components/RichTextEditor/serializer/utlis/serializeLeafToHtml.ts +32 -0
  129. package/src/components/RichTextEditor/types.ts +23 -0
  130. package/src/components/index.ts +7 -0
  131. package/src/helpers/addHttps.spec.ts +42 -0
  132. package/src/helpers/addHttps.ts +15 -0
  133. package/src/helpers/convertToRichTextValue.spec.ts +32 -0
  134. package/src/helpers/convertToRichTextValue.ts +6 -0
  135. package/src/helpers/customCoordinatesGetterFactory.spec.ts +69 -0
  136. package/src/helpers/customCoordinatesGetterFactory.ts +39 -0
  137. package/src/helpers/hasRichTextValue.spec.ts +63 -0
  138. package/src/helpers/hasRichTextValue.ts +29 -0
  139. package/src/helpers/index.ts +8 -0
  140. package/src/helpers/isDownloadable.spec.ts +47 -0
  141. package/src/helpers/isDownloadable.ts +7 -0
  142. package/src/helpers/mapColorPalettes.spec.ts +146 -0
  143. package/src/helpers/mapColorPalettes.ts +22 -0
  144. package/src/hooks/index.ts +4 -0
  145. package/src/hooks/useAttachments.spec.ts +79 -0
  146. package/src/hooks/useAttachments.ts +46 -0
  147. package/src/hooks/useDndSensors.spec.ts +40 -0
  148. package/src/hooks/useDndSensors.ts +23 -0
  149. package/src/index.ts +23 -8
  150. package/src/settings/background.spec.ts +173 -0
  151. package/src/settings/background.ts +49 -0
  152. package/src/settings/border.spec.ts +76 -0
  153. package/src/settings/border.ts +90 -0
  154. package/src/settings/borderRadius.spec.ts +30 -0
  155. package/src/settings/borderRadius.ts +73 -0
  156. package/src/settings/borderRadiusExtended.spec.ts +52 -0
  157. package/src/settings/borderRadiusExtended.ts +84 -0
  158. package/src/settings/defaultValues.ts +21 -0
  159. package/src/settings/gutter.spec.ts +60 -0
  160. package/src/settings/gutter.ts +75 -0
  161. package/src/settings/index.ts +14 -0
  162. package/src/settings/margin.spec.ts +42 -0
  163. package/src/settings/margin.ts +72 -0
  164. package/src/settings/marginExtended.spec.ts +45 -0
  165. package/src/settings/marginExtended.ts +91 -0
  166. package/src/settings/padding.spec.ts +42 -0
  167. package/src/settings/padding.ts +73 -0
  168. package/src/settings/paddingExtended.spec.ts +45 -0
  169. package/src/settings/paddingExtended.ts +91 -0
  170. package/src/settings/security.spec.ts +87 -0
  171. package/src/settings/security.ts +61 -0
  172. package/src/settings/securityDownloadable.spec.ts +46 -0
  173. package/src/settings/securityDownloadable.ts +33 -0
  174. package/src/settings/securityGlobalControl.ts +42 -0
  175. package/src/settings/types.ts +128 -0
  176. package/src/utilities/color/getReadableColor.spec.ts +32 -0
  177. package/src/utilities/color/getReadableColor.ts +34 -0
  178. package/src/utilities/color/index.ts +10 -0
  179. package/src/utilities/color/isDark.spec.ts +33 -0
  180. package/src/utilities/color/isDark.ts +29 -0
  181. package/src/utilities/color/setAlpha.spec.ts +28 -0
  182. package/src/utilities/color/setAlpha.ts +14 -0
  183. package/src/utilities/color/toColorObject.spec.ts +19 -0
  184. package/src/utilities/color/toColorObject.ts +16 -0
  185. package/src/utilities/color/toHex8String.spec.ts +17 -0
  186. package/src/utilities/color/toHex8String.ts +14 -0
  187. package/src/utilities/color/toHexString.spec.ts +17 -0
  188. package/src/utilities/color/toHexString.ts +10 -0
  189. package/src/utilities/color/toRgbaString.spec.ts +12 -0
  190. package/src/utilities/color/toRgbaString.ts +14 -0
  191. package/src/utilities/color/toShortRgba.spec.ts +16 -0
  192. package/src/utilities/color/toShortRgba.ts +35 -0
  193. package/src/utilities/index.ts +5 -0
  194. package/src/utilities/moveItemInArray.spec.ts +17 -0
  195. package/src/utilities/moveItemInArray.ts +21 -0
  196. package/src/utilities/react/getBackgroundColorStyles.spec.ts +18 -0
  197. package/src/utilities/react/getBackgroundColorStyles.ts +11 -0
  198. package/src/utilities/react/getBorderStyles.spec.ts +39 -0
  199. package/src/utilities/react/getBorderStyles.ts +21 -0
  200. package/src/utilities/react/getRadiusStyles.spec.ts +25 -0
  201. package/src/utilities/react/getRadiusStyles.ts +8 -0
  202. package/src/utilities/react/index.ts +6 -0
  203. package/src/utilities/react/joinClassNames.spec.ts +18 -0
  204. package/src/utilities/react/joinClassNames.ts +10 -0
  205. package/tailwind.config.js +27 -0
  206. package/tsconfig.json +3 -1
  207. package/vite.config.ts +11 -1
  208. package/dist/index.cjs.js +0 -2
  209. package/dist/index.cjs.js.map +0 -1
  210. package/dist/index.d.ts +0 -146
  211. package/dist/index.es.js +0 -9
  212. package/dist/index.es.js.map +0 -1
  213. package/dist/index.umd.js +0 -2
  214. package/dist/index.umd.js.map +0 -1
@@ -0,0 +1,23 @@
1
+ /* (c) Copyright Frontify Ltd., all rights reserved. */
2
+
3
+ import { KeyboardSensor, PointerSensor, useSensor, useSensors } from '@dnd-kit/core';
4
+ import { customCoordinatesGetterFactory } from '../helpers/customCoordinatesGetterFactory';
5
+
6
+ const keyboardCodes = {
7
+ start: ['Space', 'Enter'],
8
+ cancel: [],
9
+ end: ['Space', 'Enter', 'Escape'],
10
+ };
11
+
12
+ export const useDndSensors = (columnGap = 0, rowGap = 0) => {
13
+ const customCoordinatesGetter = customCoordinatesGetterFactory(columnGap, rowGap);
14
+ const sensors = useSensors(
15
+ useSensor(PointerSensor),
16
+ useSensor(KeyboardSensor, {
17
+ coordinateGetter: customCoordinatesGetter,
18
+ keyboardCodes,
19
+ })
20
+ );
21
+
22
+ return sensors;
23
+ };
package/src/index.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  /* (c) Copyright Frontify Ltd., all rights reserved. */
2
2
 
3
+ import 'tailwindcss/tailwind.css';
4
+
3
5
  import type { FC } from 'react';
4
6
  import type { AppBridgeBlock } from '@frontify/app-bridge';
5
7
  import type {
@@ -75,7 +77,7 @@ export type BlockSettingsStructureExport = {
75
77
  export type BlockProps = {
76
78
  /**
77
79
  * The Frontify App Bridge provides an interface to the Frontify app internals.
78
- * {@link https://developer.frontify.com/document/1366#/details-concepts/content-blocks/introducing-the-appbridge}
80
+ * {@link https://developer.frontify.com/d/XFPCrGNrXQQM/content-blocks#/details-concepts-1/content-blocks/introducing-the-app-bridge}
79
81
  */
80
82
  appBridge: AppBridgeBlock;
81
83
  };
@@ -83,18 +85,18 @@ export type BlockProps = {
83
85
  export type BlockConfigExport = {
84
86
  /**
85
87
  * Block component to render.
86
- * {@link https://developer.frontify.com/document/1366#/details-concepts/content-blocks}
88
+ * {@link https://developer.frontify.com/d/XFPCrGNrXQQM/content-blocks#/details-concepts-1/content-blocks}
87
89
  */
88
90
  block: FC<BlockProps>;
89
91
  /**
90
92
  * Contains the block settings and its structure.
91
- * {@link https://developer.frontify.com/document/1366#/details-concepts/block-settings}
93
+ * {@link https://developer.frontify.com/d/XFPCrGNrXQQM/content-blocks#/details-concepts-1/block-settings-1}
92
94
  */
93
95
  settings: ReturnType<typeof defineSettings>;
94
96
  /**
95
97
  * Block lifecycle hook ran before the block gets added in the Guideline.
96
98
  * The hook support both synchronous or asynchronous execution.
97
- * {@link https://developer.frontify.com/document/1366#/details-concepts/new-block-lifecycle/on-block-creation}
99
+ * {@link https://developer.frontify.com/d/XFPCrGNrXQQM/content-blocks#/details-concepts-1/block-lifecycle/on-block-creation}
98
100
  */
99
101
  onBlockCreated?:
100
102
  | (({ appBridge }: { appBridge: AppBridgeBlock }) => void)
@@ -102,7 +104,7 @@ export type BlockConfigExport = {
102
104
  /**
103
105
  * Block lifecycle hook ran before the block gets deleted from the Guideline.
104
106
  * The hook support both synchronous or asynchronous execution.
105
- * {@link https://developer.frontify.com/document/1366#/details-concepts/new-block-lifecycle/on-block-deletion}
107
+ * {@link https://developer.frontify.com/d/XFPCrGNrXQQM/content-blocks#/details-concepts-1/block-lifecycle/on-block-deletion}
106
108
  */
107
109
  onBlockDeleted?:
108
110
  | (({ appBridge }: { appBridge: AppBridgeBlock }) => void)
@@ -115,7 +117,20 @@ export type BlockConfigExport = {
115
117
  export const defineBlock = (config: BlockConfigExport): BlockConfigExport => config;
116
118
 
117
119
  /**
118
- * Type helper to make it easier to export block's settings structure, accepts a direct {@link BlockSettingsStructureExport} object.
120
+ * Type helper to make it easier to export block's settings structure, accepts a direct {@link BlockSettingsStructureExport} object
121
+ * or a function return a direct {@link BlockSettingsStructureExport} or a function returning a Promise of {@link BlockSettingsStructureExport}.
119
122
  */
120
- export const defineSettings = (settingsStructure: BlockSettingsStructureExport): BlockSettingsStructureExport =>
121
- settingsStructure;
123
+ export const defineSettings = <
124
+ T extends
125
+ | BlockSettingsStructureExport
126
+ | (() => Promise<BlockSettingsStructureExport>)
127
+ | (() => BlockSettingsStructureExport)
128
+ >(
129
+ settingsStructure: T
130
+ ): T => settingsStructure;
131
+
132
+ export * from './components';
133
+ export * from './helpers';
134
+ export * from './hooks';
135
+ export * from './settings';
136
+ export * from './utilities';
@@ -0,0 +1,173 @@
1
+ /* (c) Copyright Frontify Ltd., all rights reserved. */
2
+
3
+ import { describe, expect, it } from 'vitest';
4
+ import { getBackgroundSettings } from './background';
5
+
6
+ describe('getBackgroundSettings', () => {
7
+ it('should return background settings without arguments', () => {
8
+ expect(getBackgroundSettings()).toEqual({
9
+ id: 'hasBackground',
10
+ label: 'Background',
11
+ type: 'switch',
12
+ defaultValue: false,
13
+ on: [
14
+ {
15
+ id: 'backgroundColor',
16
+ defaultValue: {
17
+ red: 241,
18
+ green: 241,
19
+ blue: 241,
20
+ alpha: 1,
21
+ },
22
+ type: 'colorInput',
23
+ },
24
+ ],
25
+ });
26
+ });
27
+
28
+ it('should return background settings with id', () => {
29
+ expect(getBackgroundSettings({ id: 'Test' })).toEqual({
30
+ id: 'hasBackgroundTest',
31
+ label: 'Background',
32
+ type: 'switch',
33
+ defaultValue: false,
34
+ on: [
35
+ {
36
+ id: 'backgroundColorTest',
37
+ defaultValue: {
38
+ red: 241,
39
+ green: 241,
40
+ blue: 241,
41
+ alpha: 1,
42
+ },
43
+ type: 'colorInput',
44
+ },
45
+ ],
46
+ });
47
+ });
48
+
49
+ it('should return background settings with default value', () => {
50
+ expect(getBackgroundSettings({ defaultValue: true })).toEqual({
51
+ id: 'hasBackground',
52
+ label: 'Background',
53
+ type: 'switch',
54
+ defaultValue: true,
55
+ on: [
56
+ {
57
+ id: 'backgroundColor',
58
+ defaultValue: {
59
+ red: 241,
60
+ green: 241,
61
+ blue: 241,
62
+ alpha: 1,
63
+ },
64
+ type: 'colorInput',
65
+ },
66
+ ],
67
+ });
68
+ });
69
+
70
+ it('should return background settings with default color', () => {
71
+ expect(getBackgroundSettings({ defaultColor: { red: 0, green: 0, blue: 0, alpha: 1 } })).toEqual({
72
+ id: 'hasBackground',
73
+ label: 'Background',
74
+ type: 'switch',
75
+ defaultValue: false,
76
+ on: [
77
+ {
78
+ id: 'backgroundColor',
79
+ defaultValue: {
80
+ red: 0,
81
+ green: 0,
82
+ blue: 0,
83
+ alpha: 1,
84
+ },
85
+ type: 'colorInput',
86
+ },
87
+ ],
88
+ });
89
+ });
90
+
91
+ it('should return background settings with id, default value and default color', () => {
92
+ expect(
93
+ getBackgroundSettings({
94
+ id: 'Test',
95
+ defaultValue: true,
96
+ defaultColor: { red: 0, green: 0, blue: 0, alpha: 1 },
97
+ })
98
+ ).toEqual({
99
+ id: 'hasBackgroundTest',
100
+ label: 'Background',
101
+ type: 'switch',
102
+ defaultValue: true,
103
+ on: [
104
+ {
105
+ id: 'backgroundColorTest',
106
+ defaultValue: {
107
+ red: 0,
108
+ green: 0,
109
+ blue: 0,
110
+ alpha: 1,
111
+ },
112
+ type: 'colorInput',
113
+ },
114
+ ],
115
+ });
116
+ });
117
+
118
+ it('should return background settings with switch label', () => {
119
+ expect(getBackgroundSettings({ switchLabel: 'Test' })).toEqual({
120
+ id: 'hasBackground',
121
+ label: 'Background',
122
+ type: 'switch',
123
+ switchLabel: 'Test',
124
+ defaultValue: false,
125
+ on: [
126
+ {
127
+ id: 'backgroundColor',
128
+ defaultValue: {
129
+ red: 241,
130
+ green: 241,
131
+ blue: 241,
132
+ alpha: 1,
133
+ },
134
+ type: 'colorInput',
135
+ },
136
+ ],
137
+ });
138
+ });
139
+ it('should not return default color if hasDefaultColor is false', () => {
140
+ expect(getBackgroundSettings({ preventDefaultColor: true })).toEqual({
141
+ id: 'hasBackground',
142
+ label: 'Background',
143
+ type: 'switch',
144
+ defaultValue: false,
145
+ on: [
146
+ {
147
+ id: 'backgroundColor',
148
+ type: 'colorInput',
149
+ },
150
+ ],
151
+ });
152
+ });
153
+ it('should return default color if hasDefaultColor is true', () => {
154
+ expect(getBackgroundSettings({ preventDefaultColor: false })).toEqual({
155
+ id: 'hasBackground',
156
+ label: 'Background',
157
+ type: 'switch',
158
+ defaultValue: false,
159
+ on: [
160
+ {
161
+ id: 'backgroundColor',
162
+ defaultValue: {
163
+ red: 241,
164
+ green: 241,
165
+ blue: 241,
166
+ alpha: 1,
167
+ },
168
+ type: 'colorInput',
169
+ },
170
+ ],
171
+ });
172
+ });
173
+ });
@@ -0,0 +1,49 @@
1
+ /* (c) Copyright Frontify Ltd., all rights reserved. */
2
+
3
+ import { Color } from '@frontify/fondue';
4
+ import { BACKGROUND_COLOR_DEFAULT_VALUE } from './defaultValues';
5
+ import { SettingBlock } from '../';
6
+
7
+ /**
8
+ * Returns background settings: background switch, background color
9
+ *
10
+ * @param options Options for the settings
11
+ * @param options.id Custom suffix for the setting ids
12
+ * @param options.defaultValue Default value for the background switch
13
+ * @param options.defaultColor Default value for the background color
14
+ * @param options.preventDefaultColor Whether the background color should be empty by default
15
+ * @param options.switchLabel Label for the background switch
16
+ * @returns {SettingBlock} Returns background settings
17
+ */
18
+
19
+ type BackgroundSettingsType = {
20
+ id?: string;
21
+ defaultValue?: boolean;
22
+ defaultColor?: Color;
23
+ preventDefaultColor?: boolean;
24
+ switchLabel?: string;
25
+ };
26
+
27
+ export const getBackgroundSettings = (options?: BackgroundSettingsType): SettingBlock => {
28
+ const hasId = options?.id ? `hasBackground${options.id}` : 'hasBackground';
29
+ const colorId = options?.id ? `backgroundColor${options.id}` : 'backgroundColor';
30
+ const defaultColor = !!options?.preventDefaultColor
31
+ ? undefined
32
+ : options?.defaultColor || BACKGROUND_COLOR_DEFAULT_VALUE;
33
+ const switchLabel = options?.switchLabel ? options.switchLabel : undefined;
34
+
35
+ return {
36
+ id: hasId,
37
+ label: 'Background',
38
+ type: 'switch',
39
+ switchLabel,
40
+ defaultValue: !!options?.defaultValue,
41
+ on: [
42
+ {
43
+ id: colorId,
44
+ defaultValue: defaultColor,
45
+ type: 'colorInput',
46
+ },
47
+ ],
48
+ };
49
+ };
@@ -0,0 +1,76 @@
1
+ /* (c) Copyright Frontify Ltd., all rights reserved. */
2
+
3
+ import { describe, expect, it } from 'vitest';
4
+ import { getBorderSettings } from './border';
5
+ import { MultiInputBlock, MultiInputLayout } from '@frontify/sidebar-settings';
6
+ import { BorderStyle } from '../settings';
7
+ import { BORDER_COLOR_DEFAULT_VALUE } from '../settings/defaultValues';
8
+ import { SwitchBlock } from '../';
9
+ import { AppBridgeBlock } from '@frontify/app-bridge';
10
+
11
+ describe('getBorderSettings', () => {
12
+ it('should return border settings without arguments', () => {
13
+ const borderSettings = getBorderSettings() as SwitchBlock;
14
+
15
+ expect(borderSettings).toHaveProperty('id', 'hasBorder');
16
+ expect(borderSettings).toHaveProperty('label', 'Border');
17
+ expect(borderSettings).toHaveProperty('type', 'switch');
18
+ expect(borderSettings).toHaveProperty('defaultValue', false);
19
+ expect(borderSettings.on?.[0]).toHaveProperty('id', 'borderSelection');
20
+ expect(borderSettings.on?.[0]).toHaveProperty('type', 'multiInput');
21
+ expect(borderSettings.on?.[0]).toHaveProperty('lastItemFullWidth', true);
22
+ expect(borderSettings.on?.[0]).toHaveProperty('layout', MultiInputLayout.Columns);
23
+ expect((borderSettings.on?.[0] as MultiInputBlock<AppBridgeBlock>).blocks[0]).toEqual({
24
+ id: 'borderStyle',
25
+ type: 'dropdown',
26
+ defaultValue: BorderStyle.Solid,
27
+ choices: [
28
+ {
29
+ value: BorderStyle.Solid,
30
+ label: BorderStyle.Solid,
31
+ },
32
+ {
33
+ value: BorderStyle.Dotted,
34
+ label: BorderStyle.Dotted,
35
+ },
36
+ {
37
+ value: BorderStyle.Dashed,
38
+ label: BorderStyle.Dashed,
39
+ },
40
+ ],
41
+ });
42
+ expect((borderSettings.on?.[0] as MultiInputBlock<AppBridgeBlock>).blocks[1]).toHaveProperty(
43
+ 'id',
44
+ 'borderWidth'
45
+ );
46
+ expect((borderSettings.on?.[0] as MultiInputBlock<AppBridgeBlock>).blocks[1]).toHaveProperty('type', 'input');
47
+ expect((borderSettings.on?.[0] as MultiInputBlock<AppBridgeBlock>).blocks[2]).toEqual({
48
+ id: 'borderColor',
49
+ type: 'colorInput',
50
+ defaultValue: BORDER_COLOR_DEFAULT_VALUE,
51
+ });
52
+ });
53
+
54
+ it('should return border settings with custom id', () => {
55
+ expect(getBorderSettings({ id: 'Test' })).toHaveProperty('id', 'hasBorder_Test');
56
+ });
57
+
58
+ it('should return border settings with custom color', () => {
59
+ const borderSettings = getBorderSettings({ defaultColor: { red: 255, green: 0, blue: 0 } }) as SwitchBlock;
60
+ expect((borderSettings.on?.[0] as MultiInputBlock<AppBridgeBlock>).blocks[2]).toEqual({
61
+ id: 'borderColor',
62
+ type: 'colorInput',
63
+ defaultValue: { red: 255, green: 0, blue: 0 },
64
+ });
65
+ });
66
+
67
+ it('should return border settings with custom default value', () => {
68
+ const borderSettings = getBorderSettings({ defaultValue: true }) as SwitchBlock;
69
+ expect(borderSettings).toHaveProperty('defaultValue', true);
70
+ });
71
+
72
+ it('should return border settings with custom switch label', () => {
73
+ const borderSettings = getBorderSettings({ switchLabel: 'mock' }) as SwitchBlock;
74
+ expect(borderSettings).toHaveProperty('switchLabel', 'mock');
75
+ });
76
+ });
@@ -0,0 +1,90 @@
1
+ /* (c) Copyright Frontify Ltd., all rights reserved. */
2
+
3
+ import {
4
+ Color,
5
+ MultiInputLayout,
6
+ SettingBlock,
7
+ appendUnit,
8
+ maximumNumericalOrPixelOrAutoRule,
9
+ numericalOrPixelRule,
10
+ } from '../';
11
+ import { BORDER_COLOR_DEFAULT_VALUE, BORDER_WIDTH_DEFAULT_VALUE } from './defaultValues';
12
+ import { BorderStyle } from './types';
13
+
14
+ /**
15
+ * Returns border settings: border switch, border style, border width, border color
16
+ *
17
+ * @param options Options for the settings
18
+ * @param options.id Custom suffix for the setting ids
19
+ * @param options.switchLabel Label for the border switch
20
+ * @param options.defaultValue Default value for the border switch
21
+ * @returns {SettingBlock} Returns border settings
22
+ */
23
+
24
+ type BorderSettingsType = {
25
+ id?: string;
26
+ defaultValue?: boolean;
27
+ defaultColor?: Color;
28
+ switchLabel?: string;
29
+ };
30
+
31
+ export const getBorderSettings = (options?: BorderSettingsType): SettingBlock => {
32
+ const hasId = options?.id ? `hasBorder_${options.id}` : 'hasBorder';
33
+ const selectionId = options?.id ? `borderSelection_${options.id}` : 'borderSelection';
34
+ const styleId = options?.id ? `borderStyle_${options.id}` : 'borderStyle';
35
+ const widthId = options?.id ? `borderWidth_${options.id}` : 'borderWidth';
36
+ const colorId = options?.id ? `borderColor_${options.id}` : 'borderColor';
37
+ const defaultColor = options?.defaultColor || BORDER_COLOR_DEFAULT_VALUE;
38
+ const switchLabel = options?.switchLabel ? options.switchLabel : undefined;
39
+
40
+ return {
41
+ id: hasId,
42
+ label: 'Border',
43
+ type: 'switch',
44
+ switchLabel,
45
+ defaultValue: !!options?.defaultValue,
46
+ on: [
47
+ {
48
+ id: selectionId,
49
+ type: 'multiInput',
50
+ onChange: (bundle) => appendUnit(bundle, widthId),
51
+ layout: MultiInputLayout.Columns,
52
+ lastItemFullWidth: true,
53
+ blocks: [
54
+ {
55
+ id: styleId,
56
+ type: 'dropdown',
57
+ defaultValue: BorderStyle.Solid,
58
+ choices: [
59
+ {
60
+ value: BorderStyle.Solid,
61
+ label: BorderStyle.Solid,
62
+ },
63
+ {
64
+ value: BorderStyle.Dotted,
65
+ label: BorderStyle.Dotted,
66
+ },
67
+ {
68
+ value: BorderStyle.Dashed,
69
+ label: BorderStyle.Dashed,
70
+ },
71
+ ],
72
+ },
73
+ {
74
+ id: widthId,
75
+ type: 'input',
76
+ defaultValue: BORDER_WIDTH_DEFAULT_VALUE,
77
+ rules: [numericalOrPixelRule, maximumNumericalOrPixelOrAutoRule(500)],
78
+ placeholder: 'e.g. 3px',
79
+ },
80
+ {
81
+ id: colorId,
82
+ type: 'colorInput',
83
+ defaultValue: defaultColor,
84
+ },
85
+ ],
86
+ },
87
+ ],
88
+ off: [],
89
+ };
90
+ };
@@ -0,0 +1,30 @@
1
+ /* (c) Copyright Frontify Ltd., all rights reserved. */
2
+
3
+ import { describe, expect, it } from 'vitest';
4
+ import { Radius, getBorderRadiusSettings } from '.';
5
+ import { SwitchBlock } from '..';
6
+
7
+ describe('getBorderRadiusSettings', () => {
8
+ it('should return border radius settings without arguments', () => {
9
+ const borderRadiusSettings = getBorderRadiusSettings() as SwitchBlock;
10
+
11
+ expect(borderRadiusSettings).toHaveProperty('id', 'hasRadius');
12
+ expect(borderRadiusSettings).toHaveProperty('label', 'Corner radius');
13
+ expect(borderRadiusSettings).toHaveProperty('type', 'switch');
14
+ expect(borderRadiusSettings).toHaveProperty('defaultValue', false);
15
+ expect(borderRadiusSettings.on?.[0]).toHaveProperty('id', 'radiusValue');
16
+ expect(borderRadiusSettings.on?.[0]).toHaveProperty('type', 'input');
17
+ expect(borderRadiusSettings.off?.[0]).toHaveProperty('id', 'radiusChoice');
18
+ expect(borderRadiusSettings.off?.[0]).toHaveProperty('type', 'segmentedControls');
19
+ expect(borderRadiusSettings.off?.[0]).toHaveProperty('defaultValue', Radius.None);
20
+ });
21
+
22
+ it('should return border radius settings with custom id', () => {
23
+ expect(getBorderRadiusSettings({ id: 'Test' })).toHaveProperty('id', 'hasRadius_Test');
24
+ });
25
+
26
+ it('should return border settings with custom default radius', () => {
27
+ const borderRadiusSettings = getBorderRadiusSettings({ defaultRadius: Radius.Large }) as SwitchBlock;
28
+ expect(borderRadiusSettings.off?.[0]).toHaveProperty('defaultValue', Radius.Large);
29
+ });
30
+ });
@@ -0,0 +1,73 @@
1
+ /* (c) Copyright Frontify Ltd., all rights reserved. */
2
+
3
+ import { SettingBlock, appendUnit, numericalOrPixelRule, presetCustomValue } from '../';
4
+
5
+ import { Radius, radiusStyleMap } from './types';
6
+
7
+ /**
8
+ * Returns border radius settings: border radius switch, radius slider, custom radius input
9
+ *
10
+ * @param options Options for the settings
11
+ * @param options.id Custom suffix for the setting ids
12
+ * @param options.dependentSettingId Id of setting which the border radius is dependent on
13
+ * @returns {SettingBlock} Returns border settings
14
+ */
15
+
16
+ type BorderRadiusSettingsType = {
17
+ id?: string;
18
+ dependentSettingId?: string;
19
+ radiusStyleMap?: Record<Radius, string>;
20
+ defaultRadius?: Radius;
21
+ };
22
+
23
+ export const getBorderRadiusSlider = (id: string, defaultValue: Radius = Radius.None): SettingBlock => ({
24
+ id,
25
+ type: 'segmentedControls',
26
+ defaultValue,
27
+ choices: [
28
+ {
29
+ value: Radius.None,
30
+ label: 'None',
31
+ },
32
+ {
33
+ value: Radius.Small,
34
+ label: 'S',
35
+ },
36
+ {
37
+ value: Radius.Medium,
38
+ label: 'M',
39
+ },
40
+ {
41
+ value: Radius.Large,
42
+ label: 'L',
43
+ },
44
+ ],
45
+ });
46
+
47
+ export const getBorderRadiusSettings = (options?: BorderRadiusSettingsType): SettingBlock => {
48
+ const hasId = options?.id ? `hasRadius_${options.id}` : 'hasRadius';
49
+ const valueId = options?.id ? `radiusValue_${options.id}` : 'radiusValue';
50
+ const choiceId = options?.id ? `radiusChoice_${options.id}` : 'radiusChoice';
51
+ const defaultValue = options?.defaultRadius || Radius.None;
52
+
53
+ return {
54
+ id: hasId,
55
+ label: 'Corner radius',
56
+ type: 'switch',
57
+ switchLabel: 'Custom',
58
+ defaultValue: false,
59
+ info: 'Determining how rounded the corners are.',
60
+ show: (bundle) => (options?.dependentSettingId ? !!bundle.getBlock(options.dependentSettingId)?.value : true),
61
+ onChange: (bundle) => presetCustomValue(bundle, choiceId, valueId, options?.radiusStyleMap || radiusStyleMap),
62
+ on: [
63
+ {
64
+ id: valueId,
65
+ type: 'input',
66
+ placeholder: 'e.g. 10px',
67
+ rules: [numericalOrPixelRule],
68
+ onChange: (bundle) => appendUnit(bundle, valueId),
69
+ },
70
+ ],
71
+ off: [getBorderRadiusSlider(choiceId, defaultValue)],
72
+ };
73
+ };
@@ -0,0 +1,52 @@
1
+ /* (c) Copyright Frontify Ltd., all rights reserved. */
2
+
3
+ import { describe, expect, it } from 'vitest';
4
+ import { MultiInputBlock, MultiInputLayout } from '@frontify/sidebar-settings';
5
+ import { Radius, getExtendedBorderRadiusSettings } from '.';
6
+ import { SwitchBlock } from '..';
7
+ import { AppBridgeBlock } from '@frontify/app-bridge';
8
+
9
+ describe('getBorderRadiusExtendedSettings', () => {
10
+ it('should return extended border radius settings without arguments', () => {
11
+ const extendedBorderRadiusSettings = getExtendedBorderRadiusSettings() as SwitchBlock;
12
+
13
+ expect(extendedBorderRadiusSettings).toHaveProperty('id', 'hasExtendedCustomRadius');
14
+ expect(extendedBorderRadiusSettings).toHaveProperty('label', 'Corner radius');
15
+ expect(extendedBorderRadiusSettings).toHaveProperty('type', 'switch');
16
+ expect(extendedBorderRadiusSettings).toHaveProperty('defaultValue', false);
17
+ expect(extendedBorderRadiusSettings.on?.[0]).toHaveProperty('id', 'extendedRadiusValue');
18
+ expect(extendedBorderRadiusSettings.on?.[0]).toHaveProperty('type', 'multiInput');
19
+ expect(extendedBorderRadiusSettings.on?.[0]).toHaveProperty('layout', MultiInputLayout.Columns);
20
+
21
+ expect((extendedBorderRadiusSettings.on?.[0] as MultiInputBlock<AppBridgeBlock>).blocks[0]).toHaveProperty(
22
+ 'id',
23
+ 'extendedRadiusTopLeft'
24
+ );
25
+ expect((extendedBorderRadiusSettings.on?.[0] as MultiInputBlock<AppBridgeBlock>).blocks[1]).toHaveProperty(
26
+ 'id',
27
+ 'extendedRadiusTopRight'
28
+ );
29
+ expect((extendedBorderRadiusSettings.on?.[0] as MultiInputBlock<AppBridgeBlock>).blocks[2]).toHaveProperty(
30
+ 'id',
31
+ 'extendedRadiusBottomLeft'
32
+ );
33
+ expect((extendedBorderRadiusSettings.on?.[0] as MultiInputBlock<AppBridgeBlock>).blocks[3]).toHaveProperty(
34
+ 'id',
35
+ 'extendedRadiusBottomRight'
36
+ );
37
+ expect(extendedBorderRadiusSettings.off?.[0]).toHaveProperty('id', 'extendedRadiusChoice');
38
+ expect(extendedBorderRadiusSettings.off?.[0]).toHaveProperty('type', 'segmentedControls');
39
+ expect(extendedBorderRadiusSettings.off?.[0]).toHaveProperty('defaultValue', Radius.None);
40
+ });
41
+
42
+ it('should return extended border radius settings with id', () => {
43
+ expect(getExtendedBorderRadiusSettings({ id: 'Test' })).toHaveProperty('id', 'hasExtendedCustomRadius_Test');
44
+ });
45
+
46
+ it('should return extended border settings with custom default value', () => {
47
+ const extendedBorderRadiusSettings = getExtendedBorderRadiusSettings({
48
+ defaultValue: Radius.Large,
49
+ }) as SwitchBlock;
50
+ expect(extendedBorderRadiusSettings.off?.[0]).toHaveProperty('defaultValue', Radius.Large);
51
+ });
52
+ });