@servicetitan/dte-pdf-editor 1.92.4 → 1.93.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 (209) hide show
  1. package/README.md +0 -2
  2. package/dist/components/field-config-panel/dropdown-field-items.d.ts +9 -0
  3. package/dist/components/field-config-panel/dropdown-field-items.d.ts.map +1 -0
  4. package/dist/components/field-config-panel/dropdown-field-items.js +60 -0
  5. package/dist/components/field-config-panel/dropdown-field-items.js.map +1 -0
  6. package/dist/components/field-config-panel/field-config-panel-overlay.d.ts +1 -1
  7. package/dist/components/field-config-panel/field-config-panel-overlay.d.ts.map +1 -1
  8. package/dist/components/field-config-panel/field-config-panel.d.ts +1 -1
  9. package/dist/components/field-config-panel/field-config-panel.d.ts.map +1 -1
  10. package/dist/components/field-config-panel/field-config-panel.js +5 -1
  11. package/dist/components/field-config-panel/field-config-panel.js.map +1 -1
  12. package/dist/components/field-config-panel/fillable-default-config.d.ts +19 -0
  13. package/dist/components/field-config-panel/fillable-default-config.d.ts.map +1 -0
  14. package/dist/components/field-config-panel/fillable-default-config.js +77 -0
  15. package/dist/components/field-config-panel/fillable-default-config.js.map +1 -0
  16. package/dist/components/field-sidebar/calculated-field-type-list.d.ts.map +1 -1
  17. package/dist/components/field-sidebar/calculated-field-type-list.js +1 -1
  18. package/dist/components/field-sidebar/calculated-field-type-list.js.map +1 -1
  19. package/dist/components/field-sidebar/e-sign-field-type-list.d.ts.map +1 -1
  20. package/dist/components/field-sidebar/e-sign-field-type-list.js +1 -1
  21. package/dist/components/field-sidebar/e-sign-field-type-list.js.map +1 -1
  22. package/dist/components/field-sidebar/field-type.d.ts +2 -0
  23. package/dist/components/field-sidebar/field-type.d.ts.map +1 -1
  24. package/dist/components/field-sidebar/field-type.js +2 -2
  25. package/dist/components/field-sidebar/field-type.js.map +1 -1
  26. package/dist/components/field-sidebar/fillable-field-type-list.d.ts.map +1 -1
  27. package/dist/components/field-sidebar/fillable-field-type-list.js +1 -1
  28. package/dist/components/field-sidebar/fillable-field-type-list.js.map +1 -1
  29. package/dist/components/field-sidebar/generic-field-type-list.d.ts.map +1 -1
  30. package/dist/components/field-sidebar/generic-field-type-list.js +1 -1
  31. package/dist/components/field-sidebar/generic-field-type-list.js.map +1 -1
  32. package/dist/components/pdf-canvas/canvas-controls.d.ts +9 -15
  33. package/dist/components/pdf-canvas/canvas-controls.d.ts.map +1 -1
  34. package/dist/components/pdf-canvas/canvas-controls.js +4 -14
  35. package/dist/components/pdf-canvas/canvas-controls.js.map +1 -1
  36. package/dist/components/pdf-canvas/pdf-canvas.d.ts +6 -2
  37. package/dist/components/pdf-canvas/pdf-canvas.d.ts.map +1 -1
  38. package/dist/components/pdf-canvas/pdf-canvas.js +11 -5
  39. package/dist/components/pdf-canvas/pdf-canvas.js.map +1 -1
  40. package/dist/components/pdf-editor/pdf-editor.d.ts +2 -0
  41. package/dist/components/pdf-editor/pdf-editor.d.ts.map +1 -1
  42. package/dist/components/pdf-editor/pdf-editor.js +2 -2
  43. package/dist/components/pdf-editor/pdf-editor.js.map +1 -1
  44. package/dist/components/pdf-fields-overlay/pdf-fields-overlay.js +4 -1
  45. package/dist/components/pdf-fields-overlay/pdf-fields-overlay.js.map +1 -1
  46. package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.d.ts.map +1 -1
  47. package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.js +3 -2
  48. package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.js.map +1 -1
  49. package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.d.ts +9 -0
  50. package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.d.ts.map +1 -1
  51. package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.js +39 -12
  52. package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.js.map +1 -1
  53. package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts.map +1 -1
  54. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js +6 -4
  55. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js.map +1 -1
  56. package/dist/components/pdf-view/pdf-view-e-sign.d.ts.map +1 -1
  57. package/dist/components/pdf-view/pdf-view-e-sign.js +3 -2
  58. package/dist/components/pdf-view/pdf-view-e-sign.js.map +1 -1
  59. package/dist/components/pdf-view/pdf-view-field-container.d.ts.map +1 -1
  60. package/dist/components/pdf-view/pdf-view-field-container.js +9 -15
  61. package/dist/components/pdf-view/pdf-view-field-container.js.map +1 -1
  62. package/dist/components/pdf-view/pdf-view-fillable.d.ts.map +1 -1
  63. package/dist/components/pdf-view/pdf-view-fillable.js +7 -3
  64. package/dist/components/pdf-view/pdf-view-fillable.js.map +1 -1
  65. package/dist/components/pdf-view/pdf-view.d.ts +5 -0
  66. package/dist/components/pdf-view/pdf-view.d.ts.map +1 -1
  67. package/dist/components/pdf-view/pdf-view.js +58 -24
  68. package/dist/components/pdf-view/pdf-view.js.map +1 -1
  69. package/dist/constants/field.constants.d.ts +1 -0
  70. package/dist/constants/field.constants.d.ts.map +1 -1
  71. package/dist/constants/field.constants.js +36 -6
  72. package/dist/constants/field.constants.js.map +1 -1
  73. package/dist/hooks/index.d.ts +1 -0
  74. package/dist/hooks/index.d.ts.map +1 -1
  75. package/dist/hooks/index.js +1 -0
  76. package/dist/hooks/index.js.map +1 -1
  77. package/dist/hooks/usePdfFieldDnD.d.ts.map +1 -1
  78. package/dist/hooks/usePdfFieldDnD.js +6 -0
  79. package/dist/hooks/usePdfFieldDnD.js.map +1 -1
  80. package/dist/hooks/usePdfFieldSelection.d.ts +1 -1
  81. package/dist/hooks/usePdfFieldSelection.d.ts.map +1 -1
  82. package/dist/hooks/usePdfFieldSelection.js +3 -1
  83. package/dist/hooks/usePdfFieldSelection.js.map +1 -1
  84. package/dist/hooks/usePinchZoom.d.ts +14 -0
  85. package/dist/hooks/usePinchZoom.d.ts.map +1 -0
  86. package/dist/hooks/usePinchZoom.js +58 -0
  87. package/dist/hooks/usePinchZoom.js.map +1 -0
  88. package/dist/hooks/useZoom.d.ts +2 -0
  89. package/dist/hooks/useZoom.d.ts.map +1 -1
  90. package/dist/hooks/useZoom.js +18 -6
  91. package/dist/hooks/useZoom.js.map +1 -1
  92. package/dist/index.d.ts +1 -0
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +1 -0
  95. package/dist/index.js.map +1 -1
  96. package/dist/interface/types.d.ts +48 -1
  97. package/dist/interface/types.d.ts.map +1 -1
  98. package/dist/interface/types.js.map +1 -1
  99. package/dist/styles/index.css +1 -0
  100. package/dist/styles/inline-editable.css +2 -0
  101. package/dist/styles/pdf-canvas.css +92 -15
  102. package/dist/styles/pdf-editor.css +1 -0
  103. package/dist/styles/pdf-field-overlay.css +40 -118
  104. package/dist/styles/pdf-field.css +111 -0
  105. package/dist/styles/variables.css +4 -0
  106. package/dist/utils/data-model/index.d.ts +1 -0
  107. package/dist/utils/data-model/index.d.ts.map +1 -1
  108. package/dist/utils/data-model/index.js +1 -0
  109. package/dist/utils/data-model/index.js.map +1 -1
  110. package/dist/utils/data-model/resolve-fields-default-values.d.ts +3 -0
  111. package/dist/utils/data-model/resolve-fields-default-values.d.ts.map +1 -0
  112. package/dist/utils/data-model/resolve-fields-default-values.js +19 -0
  113. package/dist/utils/data-model/resolve-fields-default-values.js.map +1 -0
  114. package/dist/utils/exposes-utils.d.ts +2 -0
  115. package/dist/utils/exposes-utils.d.ts.map +1 -0
  116. package/dist/utils/exposes-utils.js +2 -0
  117. package/dist/utils/exposes-utils.js.map +1 -0
  118. package/dist/utils/field/field-background-color.utils.d.ts +1 -1
  119. package/dist/utils/field/field-background-color.utils.d.ts.map +1 -1
  120. package/dist/utils/field/field-background-color.utils.js +1 -1
  121. package/dist/utils/field/field-background-color.utils.js.map +1 -1
  122. package/dist/utils/field/get-dropdown-field-items.utils.d.ts +3 -0
  123. package/dist/utils/field/get-dropdown-field-items.utils.d.ts.map +1 -0
  124. package/dist/utils/field/get-dropdown-field-items.utils.js +7 -0
  125. package/dist/utils/field/get-dropdown-field-items.utils.js.map +1 -0
  126. package/dist/utils/field/get-field-bounds-style.utils.d.ts +1 -2
  127. package/dist/utils/field/get-field-bounds-style.utils.d.ts.map +1 -1
  128. package/dist/utils/field/get-field-bounds-style.utils.js +9 -4
  129. package/dist/utils/field/get-field-bounds-style.utils.js.map +1 -1
  130. package/dist/utils/field/get-field-type-option.utils.d.ts +3 -0
  131. package/dist/utils/field/get-field-type-option.utils.d.ts.map +1 -0
  132. package/dist/utils/field/get-field-type-option.utils.js +10 -0
  133. package/dist/utils/field/get-field-type-option.utils.js.map +1 -0
  134. package/dist/utils/field/get-fillable-default-value.utils.d.ts +29 -0
  135. package/dist/utils/field/get-fillable-default-value.utils.d.ts.map +1 -0
  136. package/dist/utils/field/get-fillable-default-value.utils.js +59 -0
  137. package/dist/utils/field/get-fillable-default-value.utils.js.map +1 -0
  138. package/dist/utils/field/get-navigable-fields.utils.js +1 -1
  139. package/dist/utils/field/get-navigable-fields.utils.js.map +1 -1
  140. package/dist/utils/field/index.d.ts +3 -0
  141. package/dist/utils/field/index.d.ts.map +1 -1
  142. package/dist/utils/field/index.js +3 -0
  143. package/dist/utils/field/index.js.map +1 -1
  144. package/dist/utils/pdf/index.d.ts +1 -0
  145. package/dist/utils/pdf/index.d.ts.map +1 -1
  146. package/dist/utils/pdf/index.js +1 -0
  147. package/dist/utils/pdf/index.js.map +1 -1
  148. package/dist/utils/pdf/pinch-zoom.utils.d.ts +6 -0
  149. package/dist/utils/pdf/pinch-zoom.utils.d.ts.map +1 -0
  150. package/dist/utils/pdf/pinch-zoom.utils.js +18 -0
  151. package/dist/utils/pdf/pinch-zoom.utils.js.map +1 -0
  152. package/dist/utils/recipients/map-colors.js +23 -23
  153. package/dist/utils/recipients/map-colors.js.map +1 -1
  154. package/package.json +1 -1
  155. package/src/__tests__/field-types/e-sign-fields.test.ts +3 -3
  156. package/src/__tests__/field-types/fillable-fields.test.ts +142 -6
  157. package/src/components/field-config-panel/dropdown-field-items.tsx +138 -0
  158. package/src/components/field-config-panel/field-config-panel-overlay.tsx +1 -1
  159. package/src/components/field-config-panel/field-config-panel.tsx +16 -1
  160. package/src/components/field-config-panel/fillable-default-config.tsx +155 -0
  161. package/src/components/field-sidebar/calculated-field-type-list.tsx +1 -0
  162. package/src/components/field-sidebar/e-sign-field-type-list.tsx +1 -0
  163. package/src/components/field-sidebar/field-type.tsx +13 -3
  164. package/src/components/field-sidebar/fillable-field-type-list.tsx +1 -0
  165. package/src/components/field-sidebar/generic-field-type-list.tsx +1 -0
  166. package/src/components/pdf-canvas/canvas-controls.tsx +30 -128
  167. package/src/components/pdf-canvas/pdf-canvas.tsx +18 -8
  168. package/src/components/pdf-editor/pdf-editor.tsx +5 -2
  169. package/src/components/pdf-fields-overlay/pdf-fields-overlay.tsx +2 -2
  170. package/src/components/pdf-fields-overlay/pdf-overlay-field-e-sign.tsx +8 -6
  171. package/src/components/pdf-fields-overlay/pdf-overlay-field-fillable.tsx +66 -3
  172. package/src/components/pdf-fields-overlay/pdf-overlay-field.tsx +22 -3
  173. package/src/components/pdf-view/pdf-view-e-sign.tsx +8 -6
  174. package/src/components/pdf-view/pdf-view-field-container.tsx +31 -31
  175. package/src/components/pdf-view/pdf-view-fillable.tsx +26 -3
  176. package/src/components/pdf-view/pdf-view.tsx +164 -95
  177. package/src/constants/field.constants.ts +38 -6
  178. package/src/hooks/index.ts +1 -0
  179. package/src/hooks/usePdfFieldDnD.ts +6 -0
  180. package/src/hooks/usePdfFieldSelection.ts +8 -2
  181. package/src/hooks/usePinchZoom.ts +86 -0
  182. package/src/hooks/useZoom.ts +20 -8
  183. package/src/index.ts +1 -0
  184. package/src/interface/types.ts +39 -1
  185. package/src/styles/index.css +1 -0
  186. package/src/styles/inline-editable.css +2 -0
  187. package/src/styles/pdf-canvas.css +92 -15
  188. package/src/styles/pdf-editor.css +1 -0
  189. package/src/styles/pdf-field-overlay.css +40 -118
  190. package/src/styles/pdf-field.css +111 -0
  191. package/src/styles/variables.css +4 -0
  192. package/src/utils/data-model/index.ts +1 -0
  193. package/src/utils/data-model/resolve-fields-default-values.ts +19 -0
  194. package/src/utils/exposes-utils.ts +1 -0
  195. package/src/utils/field/__tests__/field-background-color.utils.test.ts +3 -3
  196. package/src/utils/field/__tests__/get-field-bounds-style.utils.test.ts +0 -1
  197. package/src/utils/field/__tests__/get-field-type-option.utils.test.ts +53 -0
  198. package/src/utils/field/__tests__/get-fillable-default-value.utils.test.ts +137 -0
  199. package/src/utils/field/field-background-color.utils.ts +1 -1
  200. package/src/utils/field/get-dropdown-field-items.utils.ts +14 -0
  201. package/src/utils/field/get-field-bounds-style.utils.ts +11 -11
  202. package/src/utils/field/get-field-type-option.utils.ts +16 -0
  203. package/src/utils/field/get-fillable-default-value.utils.ts +70 -0
  204. package/src/utils/field/get-navigable-fields.utils.ts +1 -1
  205. package/src/utils/field/index.ts +3 -0
  206. package/src/utils/pdf/__tests__/pinch-zoom.utils.test.ts +58 -0
  207. package/src/utils/pdf/index.ts +1 -0
  208. package/src/utils/pdf/pinch-zoom.utils.ts +30 -0
  209. package/src/utils/recipients/map-colors.ts +23 -23
@@ -1,25 +1,37 @@
1
1
  import { useCallback, useState } from 'react';
2
- import { ZOOM_DEFAULT, ZOOM_MAX, ZOOM_MIN, ZOOM_STEP } from '../constants';
2
+ import { ZOOM_DEFAULT, ZOOM_STEP } from '../constants';
3
+ import { clampZoom } from '../utils';
3
4
 
4
5
  export interface UseZoomReturn {
5
6
  zoom: number;
6
7
  zoomIn(): void;
7
8
  zoomOut(): void;
8
9
  resetZoom(): void;
10
+ setZoomValue(value: number): void;
11
+ zoomByFactor(factor: number): void;
9
12
  }
10
13
 
11
- const clampZoom = (value: number) =>
12
- Math.min(ZOOM_MAX, Math.max(ZOOM_MIN, Math.round(value * 100) / 100));
13
-
14
14
  /**
15
15
  * Manages a page zoom factor (1 = 100%), clamped to [ZOOM_MIN, ZOOM_MAX] in ZOOM_STEP increments.
16
16
  */
17
17
  export const useZoom = (initialZoom: number = ZOOM_DEFAULT): UseZoomReturn => {
18
18
  const [zoom, setZoom] = useState<number>(initialZoom);
19
19
 
20
- const zoomIn = useCallback(() => setZoom(prev => clampZoom(prev + ZOOM_STEP)), []);
21
- const zoomOut = useCallback(() => setZoom(prev => clampZoom(prev - ZOOM_STEP)), []);
22
- const resetZoom = useCallback(() => setZoom(ZOOM_DEFAULT), []);
20
+ const zoomIn = useCallback(() => {
21
+ setZoom(prev => clampZoom(prev + ZOOM_STEP));
22
+ }, []);
23
+ const zoomOut = useCallback(() => {
24
+ setZoom(prev => clampZoom(prev - ZOOM_STEP));
25
+ }, []);
26
+ const resetZoom = useCallback(() => {
27
+ setZoom(ZOOM_DEFAULT);
28
+ }, []);
29
+ const setZoomValue = useCallback((value: number) => {
30
+ setZoom(clampZoom(value));
31
+ }, []);
32
+ const zoomByFactor = useCallback((factor: number) => {
33
+ setZoom(prev => clampZoom(prev * factor));
34
+ }, []);
23
35
 
24
- return { zoom, zoomIn, zoomOut, resetZoom };
36
+ return { resetZoom, setZoomValue, zoom, zoomByFactor, zoomIn, zoomOut };
25
37
  };
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './interface/types';
2
+ export * from './utils/exposes-utils';
2
3
  export * from './interface/host-events';
3
4
  export * from './components';
@@ -1,3 +1,5 @@
1
+ import { Svg } from '@servicetitan/anvil2';
2
+
1
3
  export enum FieldTypeEnum {
2
4
  dataModel = 'dataModel',
3
5
  forms = 'forms',
@@ -15,7 +17,7 @@ export enum ESignFieldType {
15
17
  fullName = 'fullName',
16
18
  }
17
19
 
18
- export type FillableFieldType = 'text' | 'date' | 'checkbox' | 'radio' | 'number';
20
+ export type FillableFieldType = 'text' | 'date' | 'checkbox' | 'radio' | 'number' | 'dropdown';
19
21
 
20
22
  export type GenericFieldType = 'table' | 'text';
21
23
  export type FormFieldType = 'number' | 'text' | 'date';
@@ -86,6 +88,11 @@ export interface ESignDateSignedOffsetSettings {
86
88
  | [...ESignDateSignedOffsetSettingsRule[], ESignDateSignedOffsetSettingsFinalRule];
87
89
  }
88
90
 
91
+ export interface FillableDropdownItem {
92
+ value: string;
93
+ label: string;
94
+ }
95
+
89
96
  export type FieldDataType =
90
97
  | GenericFieldTableDataType
91
98
  | GenericFieldTextDataType
@@ -123,6 +130,33 @@ export interface PdfFieldStyles {
123
130
  fontWeight?: 'normal' | 'bold';
124
131
  }
125
132
 
133
+ /**
134
+ * Optional author-configured starting value for a fillable field. The `text`/`number`/`checkbox`/
135
+ * `date`/`today`/`radio` variants mirror the backend's `FillableDefault` discriminated union
136
+ * (`ByodField.Default`, DTE-4668) one-for-one: same `type` discriminator and `value` shape, so the
137
+ * JSON round-trips as-is with no FE-side translation.
138
+ *
139
+ * `today` and `radio` intentionally carry no `value` - `today` is a sentinel the client resolves
140
+ * to a calendar date in its own local timezone at render time (never frozen at author time), and
141
+ * `radio` just marks *this* option field as the group's pre-selected default (the "value" is which
142
+ * option, i.e. which sibling field carries the flag - there is nothing else to store).
143
+ *
144
+ * `dropdown` has no backend counterpart at all (the backend doesn't recognize a `dropdown`
145
+ * fillable subtype - see `FillableFieldSubTypes`) and is an FE-only extension of this same union:
146
+ * `value` is one of this field's own `dropdownItems[].value` entries. Unlike `radio`, a dropdown's
147
+ * options all live on this one field (`dropdownItems`), not on sibling fields, so - same as
148
+ * text/number/checkbox/date - there is exactly one field to attach the default to, and the value
149
+ * it points at is meaningful to store here directly.
150
+ */
151
+ export type FillableDefault =
152
+ | { type: 'text'; value: string }
153
+ | { type: 'number'; value: number }
154
+ | { type: 'checkbox'; value: boolean }
155
+ | { type: 'date'; value: string }
156
+ | { type: 'today' }
157
+ | { type: 'radio' }
158
+ | { type: 'dropdown'; value: string };
159
+
126
160
  export interface PdfField {
127
161
  id: string;
128
162
  type: FieldTypeEnum;
@@ -152,6 +186,9 @@ export interface PdfField {
152
186
  */
153
187
  hideLabel?: boolean;
154
188
  styles?: PdfFieldStyles;
189
+ default?: FillableDefault;
190
+ /** Manually-authored options for a fillable `dropdown` field. See `FillableDropdownItem`. */
191
+ dropdownItems?: FillableDropdownItem[];
155
192
  }
156
193
 
157
194
  export type SchemaFieldType = 'number' | 'date';
@@ -164,6 +201,7 @@ export interface FieldTypeOption {
164
201
  fieldType?: SchemaFieldType;
165
202
  formSnapshot?: FormulaFieldFormSnapshot;
166
203
  sampleData?: unknown;
204
+ icon?: Svg;
167
205
  }
168
206
 
169
207
  export interface DataModelFieldGroup {
@@ -11,3 +11,4 @@
11
11
  @import './pdf-document-renderer.css';
12
12
  @import './inline-editable.css';
13
13
  @import './field-config-panel.css';
14
+ @import './pdf-field.css';
@@ -13,6 +13,8 @@
13
13
  width: 100%;
14
14
  height: inherit;
15
15
  cursor: pointer;
16
+ outline: none;
17
+ overflow: hidden;
16
18
  }
17
19
 
18
20
  .inline-editable-html-text {
@@ -5,14 +5,8 @@
5
5
  margin-inline-end: auto;
6
6
  }
7
7
 
8
- .dte-pdf-canvas-controls {
9
- z-index: 1;
10
- position: sticky;
11
- top: 0;
12
- left: 0;
13
- background: var(--bg-color-main, #fafafa);
14
- box-shadow: 0 2px 4px rgb(0 0 0 / 15%);
15
- padding: var(--spacing-half) var(--spacing-1);
8
+ .dte-pdf-canvas-container {
9
+ touch-action: pan-x pan-y;
16
10
  }
17
11
 
18
12
  .dte-pdf-zoom-controls-value {
@@ -22,13 +16,96 @@
22
16
  user-select: none;
23
17
  }
24
18
 
25
- .dte-pdf-zoom-controls,
26
- .dte-pdf-field-navigation-controls {
27
- border-radius: var(--radius-1, 4px);
28
- padding: var(--spacing-half);
29
- background-color: var(--bg-color-secondary, #eeeeee);
19
+ .dte-pdf-zoom-controls {
20
+ background-color: var(--bg-color-light, #ffffff);
21
+ border: 1px solid var(--border-color, #e0e0e0);
22
+ border-radius: var(--radius-2, 8px);
23
+ position: absolute;
24
+ z-index: 2;
25
+
26
+ &.--vertical {
27
+ flex-direction: column;
28
+ }
29
+
30
+ &.--right-center {
31
+ right: 0;
32
+ top: 50%;
33
+ transform: translate(100%, -50%);
34
+ }
35
+
36
+ &.--right-bottom {
37
+ bottom: 12px;
38
+ right: 12px;
39
+ }
40
+ }
41
+
42
+ .dte-pdf-field-next-controls-button {
43
+ background-color: #0365dd;
44
+ cursor: pointer;
45
+ color: var(--color-neutral-0, #ffffff);
46
+ border-radius: var(--border-radius-2, 6px);
47
+ font-size: var(--typescale-1, 12px);
48
+ font-family: 'Nunito Sans';
49
+ font-weight: var(--font-weight-semibold, 600);
50
+ font-stretch: 100%;
51
+
52
+ &.--started {
53
+ &:after {
54
+ content: '';
55
+ position: absolute;
56
+ right: -1em;
57
+ height: 100%;
58
+ width: 1.3em;
59
+ background-color: inherit;
60
+ clip-path: polygon(0% 0%, 100% 50%, 0% 100%);
61
+ }
62
+ }
63
+
64
+ &.--disabled {
65
+ background-color: var(--color-neutral-300, #e0e0e0);
66
+ cursor: not-allowed;
67
+ }
68
+
69
+ > span {
70
+ position: relative;
71
+ padding: 5px var(--spacing-1);
72
+ display: inline-block;
73
+ }
74
+ }
75
+
76
+ .dte-pdf-canvas-controls {
77
+ z-index: 1;
78
+ position: sticky;
79
+ top: 0;
80
+ left: 0;
81
+ background: var(--bg-color-highlited, #0265dc);
82
+ padding: var(--spacing-2, 16px);
83
+
84
+ .dte-pdf-field-next-controls-button:after {
85
+ display: none;
86
+ }
87
+ }
88
+
89
+ .dte-pdf-movable-next-button-wrapper {
90
+ top: 2px;
91
+ transform: translateX(-100%);
92
+ transition: top 0.3s ease;
93
+ position: absolute;
94
+ z-index: 2;
95
+ }
96
+
97
+ @media (max-width: 1000px) {
98
+ .dte-pdf-movable-next-button-wrapper {
99
+ display: none;
100
+ }
101
+
102
+ .dte-pdf-zoom-controls {
103
+ display: none !important;
104
+ }
30
105
  }
31
106
 
32
- .dte-pdf-field-view.--eSign:focus {
33
- outline: 2px solid var(--border-color-active);
107
+ @media (min-width: 1001px) {
108
+ .dte-pdf-editor-theme > .dte-pdf-canvas-controls {
109
+ display: none;
110
+ }
34
111
  }
@@ -14,6 +14,7 @@
14
14
  min-width: 0;
15
15
  overflow: auto;
16
16
  overscroll-behavior: none;
17
+ touch-action: pan-x pan-y;
17
18
  background-color: var(--bg-color-main, #eeeeee);
18
19
  width: 100%;
19
20
 
@@ -5,54 +5,19 @@
5
5
  width: 100%;
6
6
  height: 100%;
7
7
  pointer-events: none;
8
- }
9
-
10
- .dte-pdf-field-overlay.--view-mode {
11
- pointer-events: auto;
12
- }
13
-
14
- /* Editor-only chrome. Layout metrics come from getFieldBoundsStyle. */
15
- .dte-pdf-field-editor {
16
- outline: 1px dashed #999;
17
- outline-offset: 0;
18
- border: none;
19
- pointer-events: auto;
20
- }
21
-
22
- .dte-pdf-field-editor.fillable-radio.--edit-mode {
23
- overflow: unset !important;
24
- }
25
-
26
- .dte-pdf-field-editor.--selected {
27
- outline: 2px solid var(--border-color-active);
28
- cursor: move;
29
- }
30
-
31
- .dte-pdf-field-editor.--unselected {
32
- cursor: pointer;
33
- }
34
8
 
35
- .dte-pdf-field-editor.--dragging {
36
- opacity: 0.5;
37
- }
38
-
39
- .dte-pdf-field-editor.--colored:not(.--selected) {
40
- outline-color: var(--border-color-active) !important;
41
- box-shadow: 0 0 2px 0 var(--border-color-active);
42
- }
43
-
44
- .dte-pdf-field-editor.--error {
45
- outline-color: var(--danger) !important;
46
- box-shadow: 0 0 4px 0 var(--danger);
9
+ &.--view-mode {
10
+ pointer-events: auto;
11
+ }
47
12
  }
48
13
 
49
14
  .dte-pdf-field-error-message {
50
15
  top: 100%;
51
16
  min-width: 100px;
52
17
  position: absolute;
53
- margin-top: var(--spacing-half, 4px);
18
+ margin-top: var(--spacing-1, 8px);
54
19
  color: var(--danger);
55
- font-size: var(--typescale-1, 12px);
20
+ font-size: var(--typescale-small, 10px);
56
21
  }
57
22
 
58
23
  .dte-pdf-field-resize-handle {
@@ -65,32 +30,10 @@
65
30
  cursor: nwse-resize;
66
31
  z-index: 10;
67
32
  box-sizing: border-box;
68
- }
69
-
70
- .dte-pdf-field-resize-handle:hover {
71
- border-color: var(--border-color-active);
72
- }
73
-
74
- .dte-add-field-button {
75
- display: none;
76
- position: absolute;
77
- bottom: -20px;
78
- left: -10px;
79
- margin-left: 50%;
80
- padding: var(--spacing-0, 0);
81
- width: 20px;
82
- height: 20px;
83
- }
84
33
 
85
- .dte-pdf-field-editor:hover .dte-add-field-button {
86
- display: block;
87
- }
88
-
89
- .dte-pdf-field-view {
90
- border: none;
91
- outline: none;
92
- cursor: default;
93
- pointer-events: auto;
34
+ &:hover {
35
+ border-color: var(--border-color-active);
36
+ }
94
37
  }
95
38
 
96
39
  .dte-pdf-field-content {
@@ -101,18 +44,6 @@
101
44
  line-height: 1;
102
45
  }
103
46
 
104
- .dte-pdf-field-content input[type='checkbox']:focus,
105
- .dte-pdf-field-content input[type='checkbox']:active,
106
- .dte-pdf-field-content input[type='radio']:active,
107
- .dte-pdf-field-content input[type='radio']:focus {
108
- box-shadow:
109
- 0 0 0 2px var(--border-color-active, #2270ee) inset,
110
- 0 0 0 3px var(--color-neutral-0, #ffffff) inset;
111
- }
112
-
113
- /*
114
- * Printed PDF text modes (no ellipsis — hard clip like PdfSharp).
115
- */
116
47
  .dte-pdf-field-text--single-line {
117
48
  width: 100%;
118
49
  min-width: 0;
@@ -150,37 +81,28 @@
150
81
  min-width: 0;
151
82
  min-height: 0;
152
83
  box-sizing: border-box;
153
- background: inherit;
84
+ background: transparent;
154
85
  border: none;
155
86
  padding: var(--spacing-0);
156
87
  margin: var(--spacing-0);
157
88
  line-height: 1;
158
89
  font-size: inherit;
159
- }
160
-
161
- .dte-pdf-field-editor .dte-pdf-field-fillable {
162
- pointer-events: none;
163
- }
164
-
165
- .dte-pdf-field-view .dte-pdf-field-fillable {
166
- pointer-events: auto;
167
- }
168
90
 
169
- .dte-pdf-field-fillable.dte-pdf-field-text--single-line {
170
- white-space: nowrap;
171
- overflow: hidden;
172
- }
91
+ &.dte-pdf-field-text--single-line {
92
+ white-space: nowrap;
93
+ overflow: hidden;
94
+ }
173
95
 
174
- .dte-pdf-field-fillable.dte-pdf-field-text--multiline {
175
- white-space: pre-wrap;
176
- overflow-wrap: break-word;
177
- overflow: hidden;
178
- resize: none;
179
- }
96
+ &.dte-pdf-field-text--multiline {
97
+ white-space: pre-wrap;
98
+ overflow-wrap: break-word;
99
+ overflow: hidden;
100
+ resize: none;
101
+ }
180
102
 
181
- .dte-pdf-field-fillable:focus {
182
- outline: 2px solid var(--border-color-active, #2270ee);
183
- outline-offset: 2px;
103
+ &:focus {
104
+ outline: none;
105
+ }
184
106
  }
185
107
 
186
108
  .dte-pdf-field-generic-table {
@@ -189,27 +111,27 @@
189
111
  border-spacing: var(--spacing-0, 0);
190
112
  width: 100%;
191
113
  table-layout: fixed;
192
- }
193
114
 
194
- .dte-pdf-field-generic-table td {
195
- border-top: 1px solid var(--border-color);
196
- border-left: 1px solid var(--border-color);
197
- padding-inline: var(--spacing-1, 8px);
198
- }
115
+ td {
116
+ border-top: 1px solid var(--border-color);
117
+ border-left: 1px solid var(--border-color);
118
+ padding-inline: var(--spacing-1, 8px);
119
+ }
199
120
 
200
- .dte-pdf-field-generic-table .dte-pdf-field-generic-table-header td {
201
- background-color: var(--bg-color);
202
- font-weight: bold;
203
- }
121
+ .dte-pdf-field-generic-table-header td {
122
+ background-color: var(--bg-color);
123
+ font-weight: bold;
124
+ }
204
125
 
205
- .dte-pdf-field-generic-table tr:not(.dte-pdf-field-generic-table-header) td {
206
- background-color: var(--bg-color-light);
207
- }
126
+ tr:not(.dte-pdf-field-generic-table-header) td {
127
+ background-color: var(--bg-color-light);
128
+ }
208
129
 
209
- .dte-pdf-field-generic-table tr:last-child td {
210
- border-bottom: 1px solid var(--border-color);
211
- }
130
+ tr:last-child td {
131
+ border-bottom: 1px solid var(--border-color);
132
+ }
212
133
 
213
- .dte-pdf-field-generic-table tr td:last-child {
214
- border-right: 1px solid var(--border-color);
134
+ tr td:last-child {
135
+ border-right: 1px solid var(--border-color);
136
+ }
215
137
  }
@@ -0,0 +1,111 @@
1
+ .dte-pdf-field-container {
2
+ --pdf-field-color: var(--color-blue-500, #0265dc);
3
+ --pdf-field-color-dark: var(--color-blue-500, #0265dc);
4
+ --pdf-field-opacity-color: #3d95ff1f;
5
+
6
+ pointer-events: auto;
7
+ border-radius: 4px;
8
+
9
+ &.--edit {
10
+ color: var(--pdf-field-color);
11
+ background-color: var(--pdf-field-opacity-color);
12
+ outline: 1px dashed var(--pdf-field-color);
13
+ }
14
+
15
+ &.--view {
16
+ &.--fillable,
17
+ &.--eSign {
18
+ color: var(--pdf-field-color);
19
+ background-color: var(--pdf-field-opacity-color);
20
+ outline: 1px dashed var(--pdf-field-color);
21
+
22
+ &:focus-within {
23
+ box-shadow:
24
+ 0 0 0 3px white,
25
+ 0 0 0 5px var(--pdf-field-color-dark) !important;
26
+ }
27
+
28
+ input[type='checkbox'],
29
+ select {
30
+ outline: none;
31
+ }
32
+
33
+ &:has(input:disabled),
34
+ &:has(select:disabled) {
35
+ --pdf-field-color: #707070 !important;
36
+ --pdf-field-color-dark: #707070 !important;
37
+ --pdf-field-opacity-color: #7070701f !important;
38
+ }
39
+ }
40
+ }
41
+
42
+ .dte-pdf-field-label {
43
+ position: absolute;
44
+ display: flex;
45
+ align-items: center;
46
+ gap: var(--spacing-half, 4px);
47
+ background-color: var(--color-neutral-0, #ffffff);
48
+ border-radius: 4px;
49
+ padding: 1px var(--spacing-half, 4px);
50
+ top: -10px;
51
+ left: 3px;
52
+ font-size: var(--typescale-small, 10px);
53
+ line-height: 1;
54
+ white-space: nowrap;
55
+ color: var(--pdf-field-color-dark);
56
+ border-width: 1px;
57
+ border-style: solid;
58
+ border-color: inherit;
59
+ font-weight: var(--font-weight-bold, 700);
60
+
61
+ span {
62
+ font-weight: var(--font-weight-regular, 400);
63
+ }
64
+ }
65
+
66
+ input::placeholder,
67
+ input[type='date'],
68
+ input[type='date']::-webkit-calendar-picker-indicator {
69
+ color: var(--pdf-field-color);
70
+ }
71
+
72
+ &.--selected {
73
+ box-shadow:
74
+ 0 0 0 3px white,
75
+ 0 0 0 5px var(--pdf-field-color-dark);
76
+ cursor: move;
77
+ }
78
+
79
+ &.--colored:not(.--selected) {
80
+ box-shadow: 0 0 3px 1px #616e7b;
81
+ }
82
+
83
+ &.--unselected {
84
+ cursor: pointer;
85
+ }
86
+
87
+ &.--dragging {
88
+ opacity: 0.5;
89
+ }
90
+
91
+ &.--error {
92
+ --pdf-field-color: var(--danger, #dc3545) !important;
93
+ --pdf-field-color-dark: var(--red, #0265dc) !important;
94
+ --pdf-field-opacity-color: var(--danger-opacity, #dc35451f) !important;
95
+ }
96
+
97
+ .dte-add-field-button {
98
+ display: none;
99
+ position: absolute;
100
+ bottom: -20px;
101
+ left: -10px;
102
+ margin-left: 50%;
103
+ padding: var(--spacing-0, 0);
104
+ width: 20px;
105
+ height: 20px;
106
+ }
107
+
108
+ &:hover .dte-add-field-button {
109
+ display: block;
110
+ }
111
+ }
@@ -6,6 +6,7 @@
6
6
  --menu-hover-color: var(--color-neutral-100, #606162);
7
7
 
8
8
  /* Typography */
9
+ --typescale-small: 10px;
9
10
  --typescale-0: var(--typescale-1, 12px);
10
11
  --typescale-1: var(--typescale-1, 14px);
11
12
 
@@ -20,6 +21,7 @@
20
21
  --radius-0: 0;
21
22
  --radius-1: 4px;
22
23
  --radius-2: 8px;
24
+ --radius-3: 16px;
23
25
 
24
26
  /* Colors - Neutral */
25
27
  --color-neutral-0: var(--color-neutral-0, #ffffff);
@@ -31,6 +33,7 @@
31
33
  --color-blue-100: var(--color-blue-100, #fafcff);
32
34
 
33
35
  /* Background colors */
36
+ --bg-color-highlited: var(--color-blue-400);
34
37
  --bg-color-light: var(--color-neutral-0, #ffffff);
35
38
  --bg-color-main: var(--color-neutral-20, #fafafa);
36
39
  --bg-color-secondary: var(--color-neutral-50, #eeeeee);
@@ -41,6 +44,7 @@
41
44
  /* Colors - Semantic */
42
45
  --success: #28a745;
43
46
  --danger: #dc3545;
47
+ --danger-opacity: #dc35451f;
44
48
  --green: #28a745;
45
49
  --red: #dc3545;
46
50
  --white: var(--color-neutral-0, #ffffff);
@@ -1,2 +1,3 @@
1
1
  export * from './extract-fields.utils';
2
2
  export * from './resolve-values.utils';
3
+ export * from './resolve-fields-default-values';
@@ -0,0 +1,19 @@
1
+ import { DataModelValues, PdfField } from '../../interface/types';
2
+ import { getTodayDateInputValue } from '../field';
3
+
4
+ export const resolveFieldsDefaultValues = (fields: PdfField[]): DataModelValues => {
5
+ const defaultValues: Record<string, any> = {};
6
+ for (const field of fields) {
7
+ if (field.default !== undefined) {
8
+ if (field.default.type === 'radio') {
9
+ defaultValues[field.path!] = field.id;
10
+ } else if (field.default.type === 'today') {
11
+ defaultValues[field.path!] = getTodayDateInputValue();
12
+ } else {
13
+ defaultValues[field.path!] = field.default.value;
14
+ }
15
+ }
16
+ }
17
+
18
+ return defaultValues;
19
+ };
@@ -0,0 +1 @@
1
+ export * from './data-model/resolve-fields-default-values';
@@ -1,8 +1,8 @@
1
- import { getFieldBackgroundColor } from '../field-background-color.utils';
1
+ import { getFieldColor } from '../field-background-color.utils';
2
2
 
3
- describe('getFieldBackgroundColor', () => {
3
+ describe('getFieldColor', () => {
4
4
  const subject = (recipient: string | undefined, recipientsColors: Record<string, string>) =>
5
- getFieldBackgroundColor(recipient, recipientsColors);
5
+ getFieldColor(recipient, recipientsColors);
6
6
 
7
7
  test('returns color for recipient when present in map', () => {
8
8
  expect(subject('signer1', { signer1: '#ff0000', signer2: '#00ff00' })).toBe('#ff0000');
@@ -34,7 +34,6 @@ describe('getFieldBoundsStyle', () => {
34
34
  padding: 4,
35
35
  alignItems: 'flex-start',
36
36
  justifyContent: 'flex-start',
37
- overflow: 'hidden',
38
37
  lineHeight: 1,
39
38
  });
40
39
  });