@progress/kendo-themes-html 14.5.1-dev.6 → 14.5.1-dev.8

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 (184) hide show
  1. package/dist/cjs/colorgradient/demos/colorgradient.js +1 -1
  2. package/dist/cjs/colorpicker/colorpicker.spec.js +1 -1
  3. package/dist/cjs/colorpicker/templates/colorpicker-adaptive.js +1 -1
  4. package/dist/cjs/colorpicker/templates/colorpicker-disabled.js +1 -1
  5. package/dist/cjs/colorpicker/templates/colorpicker-normal.js +1 -1
  6. package/dist/cjs/combobox/demos/combobox.js +1 -1
  7. package/dist/cjs/combobox/templates/combobox-grouping-modern-custom-value.js +1 -1
  8. package/dist/cjs/filemanager/filemanager-listview.spec.js +1 -1
  9. package/dist/cjs/floating-toolbar/floating-toolbar.spec.js +1 -1
  10. package/dist/cjs/imageeditor/imageeditor-option-list.js +1 -0
  11. package/dist/cjs/imageeditor/imageeditor-option-preview.js +1 -0
  12. package/dist/cjs/imageeditor/imageeditor-pane.js +1 -0
  13. package/dist/cjs/imageeditor/imageeditor-placeholder.js +1 -0
  14. package/dist/cjs/imageeditor/imageeditor-preview-thumbnail.js +1 -0
  15. package/dist/cjs/imageeditor/imageeditor-resize-handles.js +1 -0
  16. package/dist/cjs/imageeditor/imageeditor-sidebar.js +1 -0
  17. package/dist/cjs/imageeditor/imageeditor-toolbar.js +1 -1
  18. package/dist/cjs/imageeditor/imageeditor.spec.js +1 -1
  19. package/dist/cjs/imageeditor/templates/imageeditor-adjustments.js +1 -0
  20. package/dist/cjs/imageeditor/templates/imageeditor-blur.js +1 -0
  21. package/dist/cjs/imageeditor/templates/imageeditor-crop.js +1 -1
  22. package/dist/cjs/imageeditor/templates/imageeditor-disabled.js +1 -0
  23. package/dist/cjs/imageeditor/templates/imageeditor-filters.js +1 -0
  24. package/dist/cjs/imageeditor/templates/imageeditor-frames.js +1 -0
  25. package/dist/cjs/imageeditor/templates/imageeditor-insert-line.js +1 -0
  26. package/dist/cjs/imageeditor/templates/imageeditor-insert-shape.js +1 -0
  27. package/dist/cjs/imageeditor/templates/imageeditor-insert-text.js +1 -0
  28. package/dist/cjs/imageeditor/templates/imageeditor-normal.js +1 -1
  29. package/dist/cjs/imageeditor/templates/imageeditor-pixelate.js +1 -0
  30. package/dist/cjs/imageeditor/templates/imageeditor-resize.js +1 -1
  31. package/dist/cjs/imageeditor/templates/imageeditor-rotate.js +1 -0
  32. package/dist/cjs/imageeditor/templates/imageeditor-shadow.js +1 -0
  33. package/dist/cjs/index.js +8 -8
  34. package/dist/cjs/listview/demos/listview.js +1 -1
  35. package/dist/cjs/listview/listview.spec.js +1 -1
  36. package/dist/cjs/listview/templates/listview-no-data.js +1 -1
  37. package/dist/cjs/listview/templates/listview-normal.js +1 -1
  38. package/dist/cjs/listview/templates/listview-selectable.js +1 -1
  39. package/dist/cjs/pager/index.js +1 -1
  40. package/dist/cjs/prompt/templates/prompt-inline-input-only.js +1 -1
  41. package/dist/cjs/prompt/templates/prompt-inline.js +1 -1
  42. package/dist/cjs/prompt/templates/prompt-more-actions.js +1 -1
  43. package/dist/cjs/prompt/templates/prompt-normal.js +1 -1
  44. package/dist/cjs/prompt/templates/prompt-output.js +1 -1
  45. package/dist/cjs/prompt/templates/prompt-popup.js +1 -1
  46. package/dist/cjs/prompt/templates/prompt-settings.js +1 -1
  47. package/dist/cjs/prompt/templates/prompt-suggestions.js +1 -1
  48. package/dist/cjs/scheduler/scheduler-toolbar.spec.js +1 -1
  49. package/dist/cjs/signature/index.js +1 -1
  50. package/dist/cjs/signature/signature.spec.js +1 -1
  51. package/dist/cjs/signature/templates/signature-maximized.js +1 -1
  52. package/dist/cjs/signature/templates/signature-normal.js +1 -1
  53. package/dist/cjs/spreadsheet/spreadsheet-action-bar.js +1 -1
  54. package/dist/cjs/toolbar/demos/toolbar.js +1 -1
  55. package/dist/cjs/toolbar/templates/toolbar-scrollable-buttons-hidden.js +1 -1
  56. package/dist/cjs/toolbar/templates/toolbar-scrollable.js +1 -1
  57. package/dist/esm/colorgradient/demos/colorgradient.mjs +1 -1
  58. package/dist/esm/colorpicker/colorpicker.spec.mjs +1 -1
  59. package/dist/esm/colorpicker/templates/colorpicker-adaptive.mjs +1 -1
  60. package/dist/esm/colorpicker/templates/colorpicker-disabled.mjs +1 -1
  61. package/dist/esm/colorpicker/templates/colorpicker-normal.mjs +1 -1
  62. package/dist/esm/combobox/demos/combobox.mjs +1 -1
  63. package/dist/esm/combobox/templates/combobox-grouping-modern-custom-value.mjs +1 -1
  64. package/dist/esm/filemanager/filemanager-listview.spec.mjs +1 -1
  65. package/dist/esm/floating-toolbar/floating-toolbar.spec.mjs +1 -1
  66. package/dist/esm/imageeditor/imageeditor-option-list.mjs +1 -0
  67. package/dist/esm/imageeditor/imageeditor-option-preview.mjs +1 -0
  68. package/dist/esm/imageeditor/imageeditor-pane.mjs +1 -0
  69. package/dist/esm/imageeditor/imageeditor-placeholder.mjs +1 -0
  70. package/dist/esm/imageeditor/imageeditor-preview-thumbnail.mjs +1 -0
  71. package/dist/esm/imageeditor/imageeditor-resize-handles.mjs +1 -0
  72. package/dist/esm/imageeditor/imageeditor-sidebar.mjs +1 -0
  73. package/dist/esm/imageeditor/imageeditor-toolbar.mjs +1 -1
  74. package/dist/esm/imageeditor/imageeditor.spec.mjs +1 -1
  75. package/dist/esm/imageeditor/templates/imageeditor-adjustments.mjs +1 -0
  76. package/dist/esm/imageeditor/templates/imageeditor-blur.mjs +1 -0
  77. package/dist/esm/imageeditor/templates/imageeditor-crop.mjs +1 -1
  78. package/dist/esm/imageeditor/templates/imageeditor-disabled.mjs +1 -0
  79. package/dist/esm/imageeditor/templates/imageeditor-filters.mjs +1 -0
  80. package/dist/esm/imageeditor/templates/imageeditor-frames.mjs +1 -0
  81. package/dist/esm/imageeditor/templates/imageeditor-insert-line.mjs +1 -0
  82. package/dist/esm/imageeditor/templates/imageeditor-insert-shape.mjs +1 -0
  83. package/dist/esm/imageeditor/templates/imageeditor-insert-text.mjs +1 -0
  84. package/dist/esm/imageeditor/templates/imageeditor-normal.mjs +1 -1
  85. package/dist/esm/imageeditor/templates/imageeditor-pixelate.mjs +1 -0
  86. package/dist/esm/imageeditor/templates/imageeditor-resize.mjs +1 -1
  87. package/dist/esm/imageeditor/templates/imageeditor-rotate.mjs +1 -0
  88. package/dist/esm/imageeditor/templates/imageeditor-shadow.mjs +1 -0
  89. package/dist/esm/index.mjs +8 -8
  90. package/dist/esm/listview/demos/listview.mjs +1 -1
  91. package/dist/esm/listview/templates/listview-no-data.mjs +1 -1
  92. package/dist/esm/listview/templates/listview-normal.mjs +1 -1
  93. package/dist/esm/listview/templates/listview-selectable.mjs +1 -1
  94. package/dist/esm/pager/index.mjs +1 -1
  95. package/dist/esm/prompt/templates/prompt-inline-input-only.mjs +1 -1
  96. package/dist/esm/prompt/templates/prompt-inline.mjs +1 -1
  97. package/dist/esm/prompt/templates/prompt-more-actions.mjs +1 -1
  98. package/dist/esm/prompt/templates/prompt-normal.mjs +1 -1
  99. package/dist/esm/prompt/templates/prompt-output.mjs +1 -1
  100. package/dist/esm/prompt/templates/prompt-popup.mjs +1 -1
  101. package/dist/esm/prompt/templates/prompt-settings.mjs +1 -1
  102. package/dist/esm/prompt/templates/prompt-suggestions.mjs +1 -1
  103. package/dist/esm/scheduler/scheduler-toolbar.spec.mjs +1 -1
  104. package/dist/esm/signature/index.mjs +1 -1
  105. package/dist/esm/signature/signature.spec.mjs +1 -1
  106. package/dist/esm/signature/templates/signature-maximized.mjs +1 -1
  107. package/dist/esm/signature/templates/signature-normal.mjs +1 -1
  108. package/dist/esm/spreadsheet/spreadsheet-action-bar.mjs +1 -1
  109. package/dist/esm/toolbar/demos/toolbar.mjs +1 -1
  110. package/dist/esm/toolbar/templates/toolbar-scrollable-buttons-hidden.mjs +1 -1
  111. package/dist/esm/toolbar/templates/toolbar-scrollable.mjs +1 -1
  112. package/dist/types/combobox/combobox.spec.d.ts +1 -1
  113. package/dist/types/imageeditor/imageeditor-option-list.d.ts +18 -0
  114. package/dist/types/imageeditor/imageeditor-option-preview.d.ts +18 -0
  115. package/dist/types/imageeditor/imageeditor-pane.d.ts +21 -0
  116. package/dist/types/imageeditor/imageeditor-placeholder.d.ts +7 -0
  117. package/dist/types/imageeditor/imageeditor-preview-thumbnail.d.ts +12 -0
  118. package/dist/types/imageeditor/imageeditor-resize-handles.d.ts +14 -0
  119. package/dist/types/imageeditor/imageeditor-sidebar.d.ts +11 -0
  120. package/dist/types/imageeditor/imageeditor-toolbar.d.ts +1 -0
  121. package/dist/types/imageeditor/imageeditor.spec.d.ts +40 -4
  122. package/dist/types/imageeditor/index.d.ts +18 -0
  123. package/dist/types/imageeditor/templates/imageeditor-adjustments.d.ts +1 -0
  124. package/dist/types/imageeditor/templates/imageeditor-blur.d.ts +1 -0
  125. package/dist/types/imageeditor/templates/imageeditor-disabled.d.ts +1 -0
  126. package/dist/types/imageeditor/templates/imageeditor-filters.d.ts +6 -0
  127. package/dist/types/imageeditor/templates/imageeditor-frames.d.ts +1 -0
  128. package/dist/types/imageeditor/templates/imageeditor-insert-line.d.ts +2 -0
  129. package/dist/types/imageeditor/templates/imageeditor-insert-shape.d.ts +2 -0
  130. package/dist/types/imageeditor/templates/imageeditor-insert-text.d.ts +2 -0
  131. package/dist/types/imageeditor/templates/imageeditor-pixelate.d.ts +1 -0
  132. package/dist/types/imageeditor/templates/imageeditor-rotate.d.ts +1 -0
  133. package/dist/types/imageeditor/templates/imageeditor-shadow.d.ts +1 -0
  134. package/dist/types/numerictextbox/numerictextbox.spec.d.ts +1 -1
  135. package/package.json +5 -5
  136. package/src/combobox/combobox.spec.tsx +2 -2
  137. package/src/imageeditor/imageeditor-option-list.tsx +53 -0
  138. package/src/imageeditor/imageeditor-option-preview.tsx +56 -0
  139. package/src/imageeditor/imageeditor-pane.tsx +70 -0
  140. package/src/imageeditor/imageeditor-placeholder.tsx +51 -0
  141. package/src/imageeditor/imageeditor-preview-thumbnail.tsx +42 -0
  142. package/src/imageeditor/imageeditor-resize-handles.tsx +37 -0
  143. package/src/imageeditor/imageeditor-sidebar.tsx +66 -0
  144. package/src/imageeditor/imageeditor-toolbar.tsx +14 -13
  145. package/src/imageeditor/imageeditor.spec.tsx +79 -13
  146. package/src/imageeditor/index.ts +19 -0
  147. package/src/imageeditor/templates/imageeditor-adjustments.tsx +88 -0
  148. package/src/imageeditor/templates/imageeditor-blur.tsx +92 -0
  149. package/src/imageeditor/templates/imageeditor-crop.tsx +64 -59
  150. package/src/imageeditor/templates/imageeditor-disabled.tsx +45 -0
  151. package/src/imageeditor/templates/imageeditor-filters.tsx +98 -0
  152. package/src/imageeditor/templates/imageeditor-frames.tsx +180 -0
  153. package/src/imageeditor/templates/imageeditor-insert-line.tsx +141 -0
  154. package/src/imageeditor/templates/imageeditor-insert-shape.tsx +195 -0
  155. package/src/imageeditor/templates/imageeditor-insert-text.tsx +143 -0
  156. package/src/imageeditor/templates/imageeditor-normal.tsx +20 -1
  157. package/src/imageeditor/templates/imageeditor-pixelate.tsx +92 -0
  158. package/src/imageeditor/templates/imageeditor-resize.tsx +68 -50
  159. package/src/imageeditor/templates/imageeditor-rotate.tsx +98 -0
  160. package/src/imageeditor/templates/imageeditor-shadow.tsx +96 -0
  161. package/src/imageeditor/tests/imageeditor-adaptive-small.tsx +373 -0
  162. package/src/imageeditor/tests/imageeditor-adjustments-pane.tsx +14 -0
  163. package/src/imageeditor/tests/imageeditor-blur-pane.tsx +29 -0
  164. package/src/imageeditor/tests/imageeditor-crop-pane.tsx +3 -2
  165. package/src/imageeditor/tests/imageeditor-export-dialog.tsx +85 -0
  166. package/src/imageeditor/tests/imageeditor-filters-pane.tsx +14 -0
  167. package/src/imageeditor/tests/imageeditor-frames-pane.tsx +22 -0
  168. package/src/imageeditor/tests/imageeditor-insert-line-pane.tsx +52 -0
  169. package/src/imageeditor/tests/imageeditor-insert-shape-pane.tsx +57 -0
  170. package/src/imageeditor/tests/imageeditor-insert-text-pane.tsx +51 -0
  171. package/src/imageeditor/tests/imageeditor-interactive-states.tsx +79 -0
  172. package/src/imageeditor/tests/imageeditor-option-list-states.tsx +17 -0
  173. package/src/imageeditor/tests/imageeditor-pixelate-pane.tsx +29 -0
  174. package/src/imageeditor/tests/imageeditor-resize-pane.tsx +15 -1
  175. package/src/imageeditor/tests/imageeditor-responsive.tsx +71 -0
  176. package/src/imageeditor/tests/imageeditor-rotate-pane.tsx +27 -0
  177. package/src/imageeditor/tests/imageeditor-shadow-pane.tsx +14 -0
  178. package/src/imageeditor/tests/imageeditor-sidebar-scrollable.tsx +97 -0
  179. package/src/numerictextbox/numerictextbox.spec.tsx +2 -2
  180. package/src/signature/signature.spec.tsx +4 -17
  181. package/src/signature/tests/signature-flat.tsx +0 -3
  182. package/src/signature/tests/signature-outline.tsx +0 -3
  183. package/src/signature/tests/signature-solid.tsx +0 -3
  184. package/src/signature/tests/signature.tsx +0 -3
@@ -0,0 +1,45 @@
1
+ import { ImageEditor } from "..";
2
+ import { ToolbarItem, ToolbarSeparator } from "../../toolbar";
3
+ import { Button } from "../../button";
4
+ import { Autocomplete } from "../../autocomplete";
5
+
6
+ const disabledToolbarItems = [
7
+ <Button fillMode="flat" key="toolbar-button-1" icon="image-add" aria-label="Image Add"></Button>,
8
+ <ToolbarSeparator key="toolbar-separator-1"></ToolbarSeparator>,
9
+ <Button fillMode="flat" key="toolbar-button-2" disabled icon="undo" aria-label="Undo"></Button>,
10
+ <Button fillMode="flat" key="toolbar-button-3" disabled icon="redo" aria-label="Redo"></Button>,
11
+ <ToolbarSeparator key="toolbar-separator-2"></ToolbarSeparator>,
12
+ <Button fillMode="flat" key="toolbar-button-4" disabled icon="download" aria-label="Download"></Button>,
13
+ <div className="k-spacer" key="toolbar-spacer"></div>,
14
+ <Button fillMode="flat" key="toolbar-button-5" disabled icon="zoom-in" aria-label="Zoom In"></Button>,
15
+ <ToolbarItem key="toolbar-item-1">
16
+ <Autocomplete fillMode="flat" disabled value="Fit" aria-label="Zoom options" />
17
+ </ToolbarItem>,
18
+ <Button fillMode="flat" key="toolbar-button-6" disabled icon="zoom-out" aria-label="Zoom Out"></Button>
19
+ ];
20
+
21
+ const disabledSidebarItems = [
22
+ <Button fillMode="flat" key="sidebar-button-1" disabled icon="image-resize" aria-label="Resize" />,
23
+ <Button fillMode="flat" key="sidebar-button-2" disabled icon="crop" aria-label="Crop" />,
24
+ <Button fillMode="flat" key="sidebar-button-3" disabled icon="rotate" aria-label="Rotate" />,
25
+ <div className="k-separator" key="sidebar-separator-1" />,
26
+ <Button fillMode="flat" key="sidebar-button-4" disabled icon="free-text" aria-label="Text" />,
27
+ <Button fillMode="flat" key="sidebar-button-5" disabled icon="shapes" aria-label="Shapes" />,
28
+ <div className="k-separator" key="sidebar-separator-2" />,
29
+ <Button fillMode="flat" key="sidebar-button-6" disabled icon="drop-half-pixelated" aria-label="Blur" />,
30
+ <Button fillMode="flat" key="sidebar-button-7" disabled icon="sliders-horizontal" aria-label="Adjustments" />,
31
+ <Button fillMode="flat" key="sidebar-button-8" disabled icon="circles-three-intersecting" aria-label="Filters" />,
32
+ <div className="k-separator" key="sidebar-separator-3"></div>,
33
+ <Button fillMode="flat" key="sidebar-button-9" disabled icon="frame-corners" aria-label="Frame" />,
34
+ <Button fillMode="flat" key="sidebar-button-10" disabled icon="circle-half-tilted" aria-label="Shadow" />
35
+ ];
36
+
37
+ // Non-editable state (Empty, Loading, Error): only the upload action is available,
38
+ // sidebar tools and the rest of the toolbar are disabled.
39
+ export const ImageEditorDisabled = (props: any) => (
40
+ <ImageEditor
41
+ toolbarItems={disabledToolbarItems}
42
+ sidebarItems={disabledSidebarItems}
43
+ {...props}
44
+ />
45
+ );
@@ -0,0 +1,98 @@
1
+ import { ImageEditor, ImageEditorPane, ImageEditorOptionPreview, ImageEditorPreviewThumbnail } from "..";
2
+ import { Button } from "../../button";
3
+ import { Form, FormField } from "../../form";
4
+
5
+ const filtersSidebarItems = [
6
+ <Button fillMode="flat" key="sidebar-button-1" icon="image-resize" aria-label="Resize"></Button>,
7
+ <Button fillMode="flat" key="sidebar-button-2" icon="crop" aria-label="Crop"></Button>,
8
+ <Button fillMode="flat" key="sidebar-button-3" icon="rotate" aria-label="Rotate"></Button>,
9
+ <div className="k-separator" key="sidebar-separator-1"></div>,
10
+ <Button fillMode="flat" key="sidebar-button-4" icon="free-text" aria-label="Text"></Button>,
11
+ <Button fillMode="flat" key="sidebar-button-5" icon="shapes" aria-label="Shapes"></Button>,
12
+ <div className="k-separator" key="sidebar-separator-2"></div>,
13
+ <Button fillMode="flat" key="sidebar-button-6" icon="drop-half-pixelated" aria-label="Blur"></Button>,
14
+ <Button fillMode="flat" key="sidebar-button-7" icon="sliders-horizontal" aria-label="Adjustments"></Button>,
15
+ <Button fillMode="flat" key="sidebar-button-8" icon="circles-three-intersecting" selected aria-label="Filters"></Button>,
16
+ <div className="k-separator" key="sidebar-separator-3"></div>,
17
+ <Button fillMode="flat" key="sidebar-button-9" icon="frame-corners" aria-label="Frame"></Button>,
18
+ <Button fillMode="flat" key="sidebar-button-10" icon="circle-half-tilted" aria-label="Shadow"></Button>
19
+ ];
20
+
21
+ export const filterPresets: { [key: string]: { label: string } } = {
22
+ "none": { label: "None" },
23
+ "black-white": { label: "Black and White" },
24
+ "greyscale": { label: "Greyscale" },
25
+ "sepia": { label: "Sepia" },
26
+ "warm": { label: "Warm" },
27
+ "cold": { label: "Cold" },
28
+ "chrome": { label: "Chrome" },
29
+ "invert": { label: "Invert" }
30
+ };
31
+
32
+ const FilterPreview = ({ presetKey, selected }: { presetKey: string; selected: boolean }) => {
33
+ const preset = filterPresets[presetKey];
34
+
35
+ return (
36
+ <ImageEditorOptionPreview key={presetKey} selected={selected} aria-label={preset.label}>
37
+ <ImageEditorPreviewThumbnail label={preset.label} />
38
+ </ImageEditorOptionPreview>
39
+ );
40
+ };
41
+
42
+ export const ImageEditorFilters = ({ preset = "greyscale", ...props }: any) => (
43
+ <ImageEditor
44
+ sidebarItems={filtersSidebarItems}
45
+ actionPane={
46
+ <ImageEditorPane title="Filters" actions={
47
+ <>
48
+ <Button>Reset</Button>
49
+ <Button themeColor="primary">Apply</Button>
50
+ </>
51
+ }>
52
+ <Form tag="div">
53
+ <FormField
54
+ editor={
55
+ <div className="k-imageeditor-option-grid">
56
+ <FilterPreview presetKey="none" selected={preset === "none"} />
57
+ </div>
58
+ }
59
+ />
60
+ <FormField
61
+ label="Monochrome"
62
+ editor={
63
+ <div className="k-imageeditor-option-grid">
64
+ <FilterPreview presetKey="black-white" selected={preset === "black-white"} />
65
+ <FilterPreview presetKey="greyscale" selected={preset === "greyscale"} />
66
+ <FilterPreview presetKey="sepia" selected={preset === "sepia"} />
67
+ </div>
68
+ }
69
+ />
70
+ <FormField
71
+ label="Color Temperature & Mood"
72
+ editor={
73
+ <div className="k-imageeditor-option-grid">
74
+ <FilterPreview presetKey="warm" selected={preset === "warm"} />
75
+ <FilterPreview presetKey="cold" selected={preset === "cold"} />
76
+ <FilterPreview presetKey="chrome" selected={preset === "chrome"} />
77
+ </div>
78
+ }
79
+ />
80
+ <FormField
81
+ label="Color Reversal"
82
+ editor={
83
+ <div className="k-imageeditor-option-grid">
84
+ <FilterPreview presetKey="invert" selected={preset === "invert"} />
85
+ </div>
86
+ }
87
+ />
88
+ </Form>
89
+ </ImageEditorPane>
90
+ }
91
+
92
+ children={
93
+ <>
94
+ <canvas width="494" height="307" role="img" aria-label="Image being edited" style={{ backgroundImage: "url('/packages/html/assets/sofia.jpg')", backgroundSize: "cover" }}></canvas>
95
+ </>
96
+ }
97
+ {...props} />
98
+ );
@@ -0,0 +1,180 @@
1
+ import { ImageEditor, ImageEditorPane, ImageEditorOptionPreview, ImageEditorPreviewThumbnail } from "..";
2
+ import { Button } from "../../button";
3
+ import { NumericTextbox } from "../../numerictextbox";
4
+ import { ColorPicker } from "../../colorpicker";
5
+ import { DropdownList } from "../../dropdownlist";
6
+ import { Form, FormField, Fieldset } from "../../form";
7
+ import { Icon } from "../../icon";
8
+ import { Slider } from "../../slider";
9
+
10
+ const framesSidebarItems = [
11
+ <Button fillMode="flat" key="sidebar-button-1" icon="image-resize" aria-label="Resize"></Button>,
12
+ <Button fillMode="flat" key="sidebar-button-2" icon="crop" aria-label="Crop"></Button>,
13
+ <Button fillMode="flat" key="sidebar-button-3" icon="rotate" aria-label="Rotate"></Button>,
14
+ <div className="k-separator" key="sidebar-separator-1"></div>,
15
+ <Button fillMode="flat" key="sidebar-button-4" icon="free-text" aria-label="Text"></Button>,
16
+ <Button fillMode="flat" key="sidebar-button-5" icon="shapes" aria-label="Shapes"></Button>,
17
+ <div className="k-separator" key="sidebar-separator-2"></div>,
18
+ <Button fillMode="flat" key="sidebar-button-6" icon="drop-half-pixelated" aria-label="Blur"></Button>,
19
+ <Button fillMode="flat" key="sidebar-button-7" icon="sliders-horizontal" aria-label="Adjustments"></Button>,
20
+ <Button fillMode="flat" key="sidebar-button-8" icon="circles-three-intersecting" aria-label="Filters"></Button>,
21
+ <div className="k-separator" key="sidebar-separator-3"></div>,
22
+ <Button fillMode="flat" key="sidebar-button-9" icon="frame-corners" selected aria-label="Frame"></Button>,
23
+ <Button fillMode="flat" key="sidebar-button-10" icon="circle-half-tilted" aria-label="Shadow"></Button>
24
+ ];
25
+
26
+ const FrameSlider = ({ id, label, value }: { id: string; label: string; value: number }) => (
27
+ <FormField
28
+ label={label}
29
+ editorId={id}
30
+ editor={
31
+ <div className="k-imageeditor-field-row">
32
+ <Slider
33
+ style={{ flex: 1, "--kendo-slider-start": 0, "--kendo-slider-end": value } as React.CSSProperties}
34
+ aria-label={label}
35
+ showButtons={false}
36
+ showTicks={false}
37
+ value={value}
38
+ min={0}
39
+ max={100}
40
+ />
41
+ <NumericTextbox
42
+ id={id}
43
+ style={{ width: "80px", flex: "none" }}
44
+ showClearButton={false}
45
+ showSpinButton={false}
46
+ value={String(value)}
47
+ />
48
+ </div>
49
+ }
50
+ />
51
+ );
52
+
53
+ const frameStylePreviews: { [key: string]: React.CSSProperties } = {
54
+ none: {},
55
+ single: { border: "3px dashed #b0e855", borderRadius: "4px" },
56
+ multiple: { border: "3px dashed #b0e855", borderRadius: "4px" }
57
+ };
58
+
59
+ const FrameStylePreview = ({ styleKey, label, selected }: { styleKey: string; label: string; selected: boolean }) => (
60
+ <ImageEditorOptionPreview selected={selected} aria-label={label}>
61
+ <ImageEditorPreviewThumbnail label={label} style={frameStylePreviews[styleKey]}>
62
+ {styleKey === "multiple" && (
63
+ <span style={{
64
+ position: "absolute",
65
+ inset: "6px",
66
+ border: "3px dashed #b0e855",
67
+ borderRadius: "1px",
68
+ boxSizing: "border-box",
69
+ pointerEvents: "none"
70
+ }}></span>
71
+ )}
72
+ </ImageEditorPreviewThumbnail>
73
+ </ImageEditorOptionPreview>
74
+ );
75
+
76
+ export const ImageEditorFrames = ({
77
+ style = "single",
78
+ imageRoundness = 24,
79
+ framesAmount = 3,
80
+ frameThickness = 12,
81
+ frameRoundness = style === "multiple" ? 40 : 16,
82
+ offset = 12,
83
+ strokeColor = "#b0e855",
84
+ ...props
85
+ }: any) => {
86
+ const framePadding = 0;
87
+
88
+ return (
89
+ <ImageEditor
90
+ sidebarItems={framesSidebarItems}
91
+ actionPane={
92
+ <ImageEditorPane title="Frame" actions={
93
+ <>
94
+ <Button>Reset</Button>
95
+ <Button themeColor="primary">Apply</Button>
96
+ </>
97
+ }>
98
+ <Form tag="div">
99
+ <FormField
100
+ label="Frame Style"
101
+ editor={
102
+ <div className="k-imageeditor-option-grid">
103
+ <FrameStylePreview styleKey="none" label="None" selected={style === "none"} />
104
+ <FrameStylePreview styleKey="single" label="Single" selected={style === "single"} />
105
+ <FrameStylePreview styleKey="multiple" label="Multiple" selected={style === "multiple"} />
106
+ </div>
107
+ }
108
+ />
109
+ <FrameSlider id="frame-image-roundness" label="Image Roundness" value={imageRoundness} />
110
+ {style === "multiple" && (
111
+ <FormField
112
+ label="Frames Amount"
113
+ editorId="frame-frames-amount"
114
+ editor={
115
+ <NumericTextbox id="frame-frames-amount" showClearButton={false} value={String(framesAmount)} />
116
+ }
117
+ />
118
+ )}
119
+ {style !== "none" && (
120
+ <>
121
+ <FrameSlider id="frame-thickness" label="Frame Thickness" value={frameThickness} />
122
+ <FrameSlider id="frame-roundness" label="Frame Roundness" value={frameRoundness} />
123
+ <Fieldset layout="grid" cols={2} gutters={{ cols: "16px" }}>
124
+ <FormField
125
+ label="Stroke Type"
126
+ editor={ <DropdownList id="frame-stroke-type" value="Dashed" prefix={<Icon icon="border-style" />} aria-label="Stroke Type" /> }
127
+ />
128
+ <FormField
129
+ label="Offset"
130
+ editorId="frame-offset"
131
+ editor={ <NumericTextbox id="frame-offset" showSpinButton={false} value={String(offset)} prefix={<Icon icon="max-width" />} /> }
132
+ />
133
+ </Fieldset>
134
+ <FormField
135
+ label="Stroke Color"
136
+ editor={ <ColorPicker id="frame-stroke-color" value={strokeColor} aria-label="Stroke Color" /> }
137
+ />
138
+ </>
139
+ )}
140
+ </Form>
141
+ </ImageEditorPane>
142
+ }
143
+
144
+ children={
145
+ style === "none" ? (
146
+ <canvas width="494" height="307" role="img" aria-label="Image being edited" style={{ backgroundImage: "url('/packages/html/assets/sofia.jpg')", backgroundSize: "cover", borderRadius: `${imageRoundness}px` }}></canvas>
147
+ ) : (
148
+ <div style={{ position: "relative", width: `${494 + framePadding * 2}px`, height: `${307 + framePadding * 2}px` }}>
149
+ <canvas width="494" height="307" role="img" aria-label="Image being edited" style={{
150
+ position: "absolute", top: `${framePadding}px`, left: `${framePadding}px`,
151
+ backgroundImage: "url('/packages/html/assets/sofia.jpg')", backgroundSize: "cover",
152
+ borderRadius: `${imageRoundness}px`
153
+ }}></canvas>
154
+ {/* inner ring sits flush on the image edge, overlaying it */}
155
+ <div style={{
156
+ position: "absolute",
157
+ top: `${framePadding}px`, left: `${framePadding}px`,
158
+ width: "494px", height: "307px",
159
+ border: `${frameThickness}px dashed ${strokeColor}`,
160
+ borderRadius: `${frameRoundness}px`,
161
+ boxSizing: "border-box",
162
+ pointerEvents: "none"
163
+ }}></div>
164
+ {style === "multiple" && (
165
+ <div style={{
166
+ position: "absolute",
167
+ top: `${framePadding + frameThickness + offset}px`, left: `${framePadding + frameThickness + offset}px`,
168
+ width: `${494 - (frameThickness + offset) * 2}px`, height: `${307 - (frameThickness + offset) * 2}px`,
169
+ border: `${frameThickness}px dashed ${strokeColor}`,
170
+ borderRadius: `${Math.max(frameRoundness - frameThickness - offset, 0)}px`,
171
+ boxSizing: "border-box",
172
+ pointerEvents: "none"
173
+ }}></div>
174
+ )}
175
+ </div>
176
+ )
177
+ }
178
+ {...props} />
179
+ );
180
+ };
@@ -0,0 +1,141 @@
1
+ import { ImageEditor, ImageEditorPane } from "..";
2
+ import { Button } from "../../button";
3
+ import { ButtonGroup } from "../../button-group";
4
+ import { NumericTextbox } from "../../numerictextbox";
5
+ import { ColorPicker } from "../../colorpicker";
6
+ import { DropdownList } from "../../dropdownlist";
7
+ import { Form, FormField, Fieldset } from "../../form";
8
+ import { Icon } from "../../icon";
9
+ import { SegmentedControl, SegmentedControlButton } from "../../segmented-control";
10
+ import { FloatingToolbar } from "../../floating-toolbar/floating-toolbar.spec";
11
+
12
+ const insertLineSidebarItems = [
13
+ <Button fillMode="flat" key="sidebar-button-1" icon="image-resize" aria-label="Resize"></Button>,
14
+ <Button fillMode="flat" key="sidebar-button-2" icon="crop" aria-label="Crop"></Button>,
15
+ <Button fillMode="flat" key="sidebar-button-3" icon="rotate" aria-label="Rotate"></Button>,
16
+ <div className="k-separator" key="sidebar-separator-1"></div>,
17
+ <Button fillMode="flat" key="sidebar-button-4" icon="free-text" aria-label="Text"></Button>,
18
+ <Button fillMode="flat" key="sidebar-button-5" icon="shapes" selected aria-label="Shapes"></Button>,
19
+ <div className="k-separator" key="sidebar-separator-2"></div>,
20
+ <Button fillMode="flat" key="sidebar-button-6" icon="drop-half-pixelated" aria-label="Blur"></Button>,
21
+ <Button fillMode="flat" key="sidebar-button-7" icon="sliders-horizontal" aria-label="Adjustments"></Button>,
22
+ <Button fillMode="flat" key="sidebar-button-8" icon="circles-three-intersecting" aria-label="Filters"></Button>,
23
+ <div className="k-separator" key="sidebar-separator-3"></div>,
24
+ <Button fillMode="flat" key="sidebar-button-9" icon="frame-corners" aria-label="Frame"></Button>,
25
+ <Button fillMode="flat" key="sidebar-button-10" icon="circle-half-tilted" aria-label="Shadow"></Button>
26
+ ];
27
+
28
+ export const ImageEditorInsertLine = (props: any) => (
29
+ <ImageEditor
30
+ sidebarItems={insertLineSidebarItems}
31
+ actionPane={
32
+ <ImageEditorPane title="Shapes and Lines" actions={
33
+ <>
34
+ <Button>Remove</Button>
35
+ <Button themeColor="primary">Insert</Button>
36
+ </>
37
+ }>
38
+ <SegmentedControl thumbStyles={{ width: "50%", left: "50%" }} stretched aria-label="Shape or Line" style={{ flexShrink: 0 }}>
39
+ <SegmentedControlButton icon="shapes">Shape</SegmentedControlButton>
40
+ <SegmentedControlButton icon="shape-line" selected>Line</SegmentedControlButton>
41
+ </SegmentedControl>
42
+
43
+ <Form tag="div">
44
+ <Fieldset layout="grid" cols={2} gutters={{ cols: "16px" }}>
45
+ <FormField
46
+ label="Stroke Color"
47
+ editor={ <ColorPicker id="line-stroke-color" value="#b0e855" aria-label="Stroke Color" /> }
48
+ />
49
+ <FormField
50
+ label="Stroke Width"
51
+ editorId="line-stroke-width"
52
+ editor={ <NumericTextbox id="line-stroke-width" showSpinButton={false} value="8" prefix={<Icon icon="border-width" />} /> }
53
+ />
54
+ </Fieldset>
55
+ <FormField
56
+ label="Stroke Type"
57
+ editor={ <DropdownList id="line-stroke-type" value="Dotted" prefix={<Icon icon="square-dotted" />} aria-label="Stroke Type" /> }
58
+ />
59
+ <Fieldset layout="grid" cols={2} gutters={{ cols: "16px" }}>
60
+ <FormField
61
+ label="Start Point"
62
+ editor={ <DropdownList id="line-start-point" value="Circle" prefix={<Icon icon="line-point-circle" />} aria-label="Start Point" /> }
63
+ />
64
+ <FormField
65
+ label="End Point"
66
+ editor={ <DropdownList id="line-end-point" value="Diamond" prefix={<Icon icon="line-point-rhombus" />} aria-label="End Point" /> }
67
+ />
68
+ </Fieldset>
69
+ <FormField
70
+ label="Opacity"
71
+ editor={ <NumericTextbox id="line-opacity" showSpinButton={false} value="100%" prefix={<Icon icon="transparency" />} aria-label="Opacity" /> }
72
+ />
73
+ <Fieldset layout="grid" cols={2} gutters={{ cols: "16px" }}>
74
+ <FormField
75
+ label="Align"
76
+ editor={
77
+ <ButtonGroup>
78
+ <Button className="k-group-start" icon="align-items-start" aria-label="Align Left"></Button>
79
+ <Button icon="align-items-center" selected aria-label="Align Center"></Button>
80
+ <Button className="k-group-end" icon="align-items-end" aria-label="Align Right"></Button>
81
+ </ButtonGroup>
82
+ }
83
+ />
84
+ <FormField
85
+ label="Align Vertical"
86
+ editor={
87
+ <ButtonGroup>
88
+ <Button className="k-group-start" icon="align-items-start-alt" aria-label="Align Top"></Button>
89
+ <Button icon="align-items-center-alt" selected aria-label="Align Middle"></Button>
90
+ <Button className="k-group-end" icon="align-items-end-alt" aria-label="Align Bottom"></Button>
91
+ </ButtonGroup>
92
+ }
93
+ />
94
+ </Fieldset>
95
+ </Form>
96
+ </ImageEditorPane>
97
+ }
98
+
99
+ children={
100
+ <>
101
+ <canvas width="494" height="307" role="img" aria-label="Image being edited" style={{ backgroundImage: "url('/packages/html/assets/sofia.jpg')", backgroundSize: "cover" }}></canvas>
102
+ <div style={{ position: "absolute", top: "150px", left: "90px", width: "220px", height: "0" }}>
103
+ <div style={{
104
+ position: "absolute", left: "0", right: "0", top: "-1px", height: "2px",
105
+ background: "#5558e8"
106
+ }}></div>
107
+ <div style={{
108
+ position: "absolute", left: "0", right: "0", top: "-4px", height: "8px",
109
+ backgroundImage: "radial-gradient(circle, #b0e855 45%, transparent 46%)",
110
+ backgroundSize: "16px 8px", backgroundRepeat: "repeat-x", backgroundPosition: "left center"
111
+ }}></div>
112
+ <span style={{
113
+ position: "absolute", left: "-7px", top: "-7px",
114
+ width: "14px", height: "14px", borderRadius: "50%",
115
+ background: "#fff", border: "2px solid #5558e8", boxSizing: "border-box"
116
+ }}></span>
117
+ <span style={{
118
+ position: "absolute", right: "-9px", top: "-9px",
119
+ width: "18px", height: "18px", transform: "rotate(45deg)",
120
+ background: "#b0e855", border: "2px solid #5558e8", boxSizing: "border-box"
121
+ }}>
122
+ <span style={{
123
+ position: "absolute", left: "50%", top: "50%",
124
+ width: "5px", height: "5px", borderRadius: "50%",
125
+ background: "#fff", transform: "translate(-50%, -50%)"
126
+ }}></span>
127
+ </span>
128
+ <FloatingToolbar fillMode="flat" resizable offset={{ top: "36px", left: "-10px" }}>
129
+ <Button fillMode="flat" icon="copy" aria-label="Duplicate"></Button>
130
+ <Button fillMode="flat" icon="pencil" aria-label="Edit"></Button>
131
+ <Button fillMode="flat" icon="flip-horizontal" aria-label="Flip Horizontal"></Button>
132
+ <Button fillMode="flat" icon="flip-vertical" aria-label="Flip Vertical"></Button>
133
+ <Button fillMode="flat" icon="trash" aria-label="Delete"></Button>
134
+ </FloatingToolbar>
135
+ </div>
136
+ </>
137
+ }
138
+ {...props} />
139
+ );
140
+
141
+ export default ImageEditorInsertLine;