@signature.digital/catalog 1.8.0 → 1.9.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.
- package/dist_ts_web/00_commitinfo_data.js +3 -3
- package/dist_ts_web/elements/index.d.ts +1 -0
- package/dist_ts_web/elements/index.js +3 -1
- package/dist_ts_web/elements/sdig-app-shell/index.d.ts +1 -0
- package/dist_ts_web/elements/sdig-app-shell/index.js +2 -0
- package/dist_ts_web/elements/sdig-app-shell/sdig-app-shell.d.ts +38 -0
- package/dist_ts_web/elements/sdig-app-shell/sdig-app-shell.js +309 -0
- package/dist_ts_web/elements/sdig-signbox/sdig-signbox.js +6 -1
- package/dist_ts_web/elements/sdig-signpad/sdig-signpad.d.ts +4 -0
- package/dist_ts_web/elements/sdig-signpad/sdig-signpad.js +12 -2
- package/dist_ts_web/elements/sdig-workspace/sdig-workspace-audit.js +5 -5
- package/dist_ts_web/elements/sdig-workspace/sdig-workspace-compose.js +4 -4
- package/dist_ts_web/elements/sdig-workspace/sdig-workspace-developers.js +13 -15
- package/dist_ts_web/elements/sdig-workspace/sdig-workspace-inbox.js +12 -12
- package/dist_ts_web/elements/sdig-workspace/sdig-workspace.js +28 -28
- package/dist_ts_web/elements/sdig-workspace/sdig-workspace.shared.js +35 -34
- package/package.json +5 -12
- package/readme.md +54 -2
- package/ts_web/00_commitinfo_data.ts +2 -2
- package/ts_web/elements/index.ts +3 -0
- package/ts_web/elements/sdig-app-shell/index.ts +1 -0
- package/ts_web/elements/sdig-app-shell/sdig-app-shell.ts +200 -0
- package/ts_web/elements/sdig-signbox/sdig-signbox.ts +5 -0
- package/ts_web/elements/sdig-signpad/sdig-signpad.ts +12 -1
- package/ts_web/elements/sdig-workspace/sdig-workspace-audit.ts +4 -4
- package/ts_web/elements/sdig-workspace/sdig-workspace-compose.ts +3 -3
- package/ts_web/elements/sdig-workspace/sdig-workspace-developers.ts +12 -14
- package/ts_web/elements/sdig-workspace/sdig-workspace-inbox.ts +11 -11
- package/ts_web/elements/sdig-workspace/sdig-workspace.shared.ts +34 -33
- package/ts_web/elements/sdig-workspace/sdig-workspace.ts +27 -27
- package/.smartconfig.json +0 -95
- package/dist_bundle/bundle.js +0 -6218
- package/dist_bundle/bundle.js.map +0 -7
- package/dist_bundle/index.html +0 -28
- package/dist_watch/bundle.js +0 -135739
- package/dist_watch/bundle.js.map +0 -7
- package/dist_watch/index.html +0 -28
|
@@ -11,7 +11,7 @@ export const demoDocuments = [
|
|
|
11
11
|
export const demoRecipients = [
|
|
12
12
|
{ id: 0, name: 'Sarah Chen', email: 'sarah@acme.com', color: '#60a5fa', order: 1, role: 'signer' },
|
|
13
13
|
{ id: 1, name: 'David Park', email: 'd.park@acme.com', color: '#fbbf24', order: 2, role: 'signer' },
|
|
14
|
-
{ id: 2, name: '
|
|
14
|
+
{ id: 2, name: 'Alex Example', email: 'alex@example.test', color: '#007aff', order: 3, role: 'copy' },
|
|
15
15
|
];
|
|
16
16
|
export const demoFields = [
|
|
17
17
|
{ id: 'f1', type: 'signature', x: 60, y: 580, w: 200, h: 50, page: 1, recipient: 0, label: 'Signature' },
|
|
@@ -27,7 +27,7 @@ export const workspaceBaseStyles = css `
|
|
|
27
27
|
min-height: 0;
|
|
28
28
|
color: var(--text);
|
|
29
29
|
background: var(--bg);
|
|
30
|
-
font-family:
|
|
30
|
+
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", Arial, sans-serif;
|
|
31
31
|
font-feature-settings: 'cv11', 'tnum', 'cv05' 1;
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -50,7 +50,8 @@ export const workspaceBaseStyles = css `
|
|
|
50
50
|
align-items: center;
|
|
51
51
|
justify-content: space-between;
|
|
52
52
|
border-bottom: 1px solid var(--border-subtle);
|
|
53
|
-
background: var(--bg);
|
|
53
|
+
background: color-mix(in srgb, var(--bg) 72%, transparent);
|
|
54
|
+
backdrop-filter: saturate(180%) blur(20px);
|
|
54
55
|
gap: 12px;
|
|
55
56
|
}
|
|
56
57
|
|
|
@@ -73,10 +74,10 @@ export const workspaceBaseStyles = css `
|
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
.top-title > span:first-child {
|
|
76
|
-
font-family:
|
|
77
|
-
font-size:
|
|
78
|
-
font-weight:
|
|
79
|
-
letter-spacing: -0.
|
|
77
|
+
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Helvetica Neue", Arial, sans-serif;
|
|
78
|
+
font-size: 19px;
|
|
79
|
+
font-weight: 640;
|
|
80
|
+
letter-spacing: -0.022em;
|
|
80
81
|
white-space: nowrap;
|
|
81
82
|
overflow: hidden;
|
|
82
83
|
text-overflow: ellipsis;
|
|
@@ -92,7 +93,7 @@ export const workspaceBaseStyles = css `
|
|
|
92
93
|
.btn {
|
|
93
94
|
height: 34px;
|
|
94
95
|
padding: 0 14px;
|
|
95
|
-
border-radius:
|
|
96
|
+
border-radius: 7px;
|
|
96
97
|
font-size: 13px;
|
|
97
98
|
font-weight: 500;
|
|
98
99
|
letter-spacing: -0.01em;
|
|
@@ -167,7 +168,7 @@ export const workspaceBaseStyles = css `
|
|
|
167
168
|
.card {
|
|
168
169
|
background: var(--bg-card);
|
|
169
170
|
border: 1px solid var(--border);
|
|
170
|
-
border-radius:
|
|
171
|
+
border-radius: 12px;
|
|
171
172
|
overflow: hidden;
|
|
172
173
|
}
|
|
173
174
|
|
|
@@ -291,14 +292,14 @@ export const workspaceBaseStyles = css `
|
|
|
291
292
|
}
|
|
292
293
|
`;
|
|
293
294
|
export function icon(name, size = 14) {
|
|
294
|
-
return html `<dees-icon .icon=${iconMap[name] || iconMap.file}
|
|
295
|
+
return html `<dees-icon .icon=${iconMap[name] || iconMap.file} .iconSize=${size}></dees-icon>`;
|
|
295
296
|
}
|
|
296
297
|
const iconMap = {
|
|
297
298
|
inbox: 'lucide:Inbox', plus: 'lucide:Plus', folder: 'lucide:Folder', shield: 'lucide:Shield', code: 'lucide:Code2',
|
|
298
299
|
user: 'lucide:User', settings: 'lucide:Settings', upload: 'lucide:Upload', file: 'lucide:FileText', sign: 'lucide:PenTool',
|
|
299
300
|
clock: 'lucide:Clock', search: 'lucide:Search', more: 'lucide:MoreHorizontal', send: 'lucide:Send', check: 'lucide:Check',
|
|
300
301
|
eye: 'lucide:Eye', calendar: 'lucide:Calendar', type: 'lucide:Type', download: 'lucide:Download', hash: 'lucide:Hash',
|
|
301
|
-
github: 'lucide:
|
|
302
|
+
github: 'lucide:Github', git: 'lucide:GitBranch', server: 'lucide:Server', star: 'lucide:Star', sparkle: 'lucide:Sparkles',
|
|
302
303
|
chevronRight: 'lucide:ChevronRight', chevronDown: 'lucide:ChevronDown', x: 'lucide:X', activity: 'lucide:Activity',
|
|
303
304
|
};
|
|
304
305
|
export function pill(label, tone = 'default', dot = false) {
|
|
@@ -320,9 +321,9 @@ export function topBar(config) {
|
|
|
320
321
|
</div>
|
|
321
322
|
`;
|
|
322
323
|
}
|
|
323
|
-
export function workspaceDemoFrame(content, theme = '
|
|
324
|
+
export function workspaceDemoFrame(content, theme = 'light') {
|
|
324
325
|
const darkVars = `
|
|
325
|
-
--accent: #
|
|
326
|
+
--accent: #007aff;
|
|
326
327
|
--bg: hsl(0 0% 3.9%);
|
|
327
328
|
--bg-el: hsl(0 0% 6%);
|
|
328
329
|
--bg-card: hsl(0 0% 7%);
|
|
@@ -342,37 +343,37 @@ export function workspaceDemoFrame(content, theme = 'dark') {
|
|
|
342
343
|
--error: #ef4444;
|
|
343
344
|
`;
|
|
344
345
|
const lightVars = `
|
|
345
|
-
--accent: #
|
|
346
|
-
--bg: hsl(0 0%
|
|
347
|
-
--bg-el: hsl(
|
|
346
|
+
--accent: #007aff;
|
|
347
|
+
--bg: hsl(0 0% 100%);
|
|
348
|
+
--bg-el: hsl(240 9% 96.5%);
|
|
348
349
|
--bg-card: hsl(0 0% 100%);
|
|
349
|
-
--bg-input: hsl(0 0%
|
|
350
|
-
--border: hsl(
|
|
351
|
-
--border-subtle: hsl(
|
|
352
|
-
--border-strong: hsl(
|
|
353
|
-
--text: hsl(
|
|
354
|
-
--text-sec: hsl(
|
|
355
|
-
--text-muted: hsl(
|
|
356
|
-
--text-dim: hsl(
|
|
357
|
-
--hover: rgba(0,0,0,0.
|
|
358
|
-
--hover-subtle: rgba(0,0,0,0.
|
|
359
|
-
--row-hover: rgba(0,0,0,0.
|
|
360
|
-
--success: #
|
|
361
|
-
--warning: #
|
|
362
|
-
--error: #
|
|
350
|
+
--bg-input: hsl(0 0% 100%);
|
|
351
|
+
--border: hsl(240 6% 89%);
|
|
352
|
+
--border-subtle: hsl(240 6% 92.5%);
|
|
353
|
+
--border-strong: hsl(240 6% 80%);
|
|
354
|
+
--text: hsl(240 6% 11%);
|
|
355
|
+
--text-sec: hsl(240 4% 34%);
|
|
356
|
+
--text-muted: hsl(240 3% 52%);
|
|
357
|
+
--text-dim: hsl(240 3% 66%);
|
|
358
|
+
--hover: rgba(0,0,0,0.05);
|
|
359
|
+
--hover-subtle: rgba(0,0,0,0.028);
|
|
360
|
+
--row-hover: rgba(0,0,0,0.028);
|
|
361
|
+
--success: #34c759;
|
|
362
|
+
--warning: #ff9500;
|
|
363
|
+
--error: #ff3b30;
|
|
363
364
|
`;
|
|
364
|
-
return html `<div style="${theme === 'dark' ? darkVars : lightVars} height: 720px; min-height: 720px; background: var(--bg); color: var(--text); overflow: hidden; font-family:
|
|
365
|
+
return html `<div style="${theme === 'dark' ? darkVars : lightVars} height: 720px; min-height: 720px; background: var(--bg); color: var(--text); overflow: hidden; font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Helvetica Neue', Arial, sans-serif;">${content}</div>`;
|
|
365
366
|
}
|
|
366
367
|
export function fakeDocument() {
|
|
367
368
|
return html `
|
|
368
369
|
<div class="fake-document">
|
|
369
370
|
<div class="fake-title">Master Services Agreement</div>
|
|
370
|
-
<div class="mono" style="font-size: 10px; color: hsl(0 0% 45%); margin-bottom: 24px;">Effective: May 2, 2026 · Acme Corp ↔
|
|
371
|
+
<div class="mono" style="font-size: 10px; color: hsl(0 0% 45%); margin-bottom: 24px;">Effective: May 2, 2026 · Acme Corp ↔ Example Company</div>
|
|
371
372
|
${Array.from({ length: 18 }).map((_, index) => html `<div class="fake-line ${index % 5 === 0 ? 'heavy' : ''} ${index % 4 === 3 ? 'short' : ''}"></div>`)}
|
|
372
373
|
<div style="height: 16px;"></div>
|
|
373
374
|
${Array.from({ length: 8 }).map((_, index) => html `<div class="fake-line ${index % 3 === 2 ? 'short' : ''}"></div>`)}
|
|
374
375
|
<div style="margin-top: 60px; font-size: 10px; font-weight: 600; color: hsl(0 0% 35%);">SIGNED ON BEHALF OF ACME CORP</div>
|
|
375
|
-
<div style="margin-top: 70px; font-size: 10px; font-weight: 600; color: hsl(0 0% 35%);">SIGNED ON BEHALF OF
|
|
376
|
+
<div style="margin-top: 70px; font-size: 10px; font-weight: 600; color: hsl(0 0% 35%);">SIGNED ON BEHALF OF EXAMPLE COMPANY</div>
|
|
376
377
|
</div>
|
|
377
378
|
`;
|
|
378
379
|
}
|
|
@@ -383,4 +384,4 @@ export function requestWorkspaceView(element, view) {
|
|
|
383
384
|
composed: true,
|
|
384
385
|
}));
|
|
385
386
|
}
|
|
386
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
387
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RpZy13b3Jrc3BhY2Uuc2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzL3NkaWctd29ya3NwYWNlL3NkaWctd29ya3NwYWNlLnNoYXJlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RSxPQUFPLG9GQUFvRixDQUFDO0FBZ0Q1RixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQW1CO0lBQzNDLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7SUFDclUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtJQUNwTyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLCtCQUErQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUM3VSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLCtCQUErQixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0lBQ25QLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVB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
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signature.digital/catalog",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Reusable web components for browser-based signature capture and host-controlled e-signature application surfaces.",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist_ts_web/index.js"
|
|
8
8
|
},
|
|
@@ -14,27 +14,20 @@
|
|
|
14
14
|
"@design.estate/dees-domtools": "^2.5.6",
|
|
15
15
|
"@design.estate/dees-element": "^2.2.4",
|
|
16
16
|
"@design.estate/dees-wcctools": "^3.9.0",
|
|
17
|
-
"@git.zone/tsrun": "^2.0.
|
|
17
|
+
"@git.zone/tsrun": "^2.0.5",
|
|
18
18
|
"signature_pad": "^5.1.3"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@git.zone/tsbuild": "^4.4.2",
|
|
22
|
-
"@git.zone/tsbundle": "2.
|
|
22
|
+
"@git.zone/tsbundle": "2.11.2",
|
|
23
23
|
"@git.zone/tstest": "^3.6.6",
|
|
24
24
|
"@git.zone/tswatch": "^3.3.5",
|
|
25
25
|
"@push.rocks/projectinfo": "^5.1.0",
|
|
26
|
-
"@types/node": "^
|
|
26
|
+
"@types/node": "^26.1.1"
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
|
-
"ts/**/*",
|
|
30
29
|
"ts_web/**/*",
|
|
31
|
-
"dist/**/*",
|
|
32
|
-
"dist_*/**/*",
|
|
33
|
-
"dist_ts/**/*",
|
|
34
30
|
"dist_ts_web/**/*",
|
|
35
|
-
"assets/**/*",
|
|
36
|
-
"cli.js",
|
|
37
|
-
".smartconfig.json",
|
|
38
31
|
"license",
|
|
39
32
|
"readme.md"
|
|
40
33
|
],
|
package/readme.md
CHANGED
|
@@ -28,6 +28,14 @@ Render the product workspace:
|
|
|
28
28
|
<sdig-workspace accent="#3b82f6" density="comfortable" theme="dark"></sdig-workspace>
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
Render the host-controlled application shell:
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<sdig-app-shell workspace-name="Example workspace" active-view="inbox">
|
|
35
|
+
<your-application-view></your-application-view>
|
|
36
|
+
</sdig-app-shell>
|
|
37
|
+
```
|
|
38
|
+
|
|
31
39
|
Render a standalone signature box:
|
|
32
40
|
|
|
33
41
|
```html
|
|
@@ -38,6 +46,7 @@ Render a standalone signature box:
|
|
|
38
46
|
|
|
39
47
|
| Component | Tag | Purpose |
|
|
40
48
|
|-----------|-----|---------|
|
|
49
|
+
| `SdigAppShell` | `<sdig-app-shell>` | Host-controlled responsive application chrome with a content slot and navigation intents |
|
|
41
50
|
| `SdigWorkspace` | `<sdig-workspace>` | Product workspace shell with inbox, compose, signing, audit, developer, template, team, and settings views |
|
|
42
51
|
| `SignBox` | `<sdig-signbox>` | Complete signature capture UI with clear, undo, and submit actions |
|
|
43
52
|
| `SignPad` | `<sdig-signpad>` | Canvas-based signature capture primitive backed by `signature_pad` |
|
|
@@ -90,6 +99,45 @@ workspace?.addEventListener('view-change', (event) => {
|
|
|
90
99
|
|
|
91
100
|
Child views can request navigation by dispatching `workspace-view-request` with `{ view }` in `detail`. The event bubbles and crosses the shadow boundary.
|
|
92
101
|
|
|
102
|
+
## Controlled Application Shell
|
|
103
|
+
|
|
104
|
+
`sdig-app-shell` supplies presentation only. The host application owns routes, sessions, authorization, persistence, document state, and the slotted view. Set `navigationItems` as a property and respond to the composed `navigation-request` and `signout-request` events.
|
|
105
|
+
|
|
106
|
+
| Property | Type | Default | Description |
|
|
107
|
+
|----------|------|---------|-------------|
|
|
108
|
+
| `accent` | `string` | `#007aff` | Application accent color |
|
|
109
|
+
| `activeView` | `string` | `inbox` | ID of the active host view |
|
|
110
|
+
| `workspaceName` | `string` | `Workspace` | Visible workspace label |
|
|
111
|
+
| `deploymentLabel` | `string` | `Host configured` | Visible deployment label |
|
|
112
|
+
| `actorName` | `string` | `Current user` | Current actor label |
|
|
113
|
+
| `actorEmail` | `string` | empty | Current actor email label |
|
|
114
|
+
| `documentCount` | `number` | `0` | Factual document total shown in the status bar |
|
|
115
|
+
| `statusLabel` | `string` | `host controlled` | Host-supplied status text |
|
|
116
|
+
| `productLabel` | `string` | empty | Optional host-supplied product text |
|
|
117
|
+
| `stackLabel` | `string` | `Application services` | Host-supplied service-stack heading |
|
|
118
|
+
| `stackDescription` | `string` | `Configured by host application` | Host-supplied service-stack detail |
|
|
119
|
+
| `navigationItems` | `ISdigShellNavigationItem[]` | Inbox, Compose, Audit Trail | Host-owned navigation model |
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
const shell = document.querySelector('sdig-app-shell');
|
|
123
|
+
|
|
124
|
+
if (shell) {
|
|
125
|
+
shell.navigationItems = [
|
|
126
|
+
{ id: 'inbox', label: 'Inbox', icon: 'inbox', count: 4 },
|
|
127
|
+
{ id: 'compose', label: 'Compose', icon: 'plus' },
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
shell?.addEventListener('navigation-request', (event) => {
|
|
132
|
+
const { view } = (event as CustomEvent<{ view: string }>).detail;
|
|
133
|
+
// Route using host application state.
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
shell?.addEventListener('signout-request', () => {
|
|
137
|
+
// End the host-owned session.
|
|
138
|
+
});
|
|
139
|
+
```
|
|
140
|
+
|
|
93
141
|
## Signature Box
|
|
94
142
|
|
|
95
143
|
Use `sdig-signbox` when you want the default capture UI with a heading, a signature pad, and built-in action controls:
|
|
@@ -102,12 +150,16 @@ Use `sdig-signbox` when you want the default capture UI with a heading, a signat
|
|
|
102
150
|
const signbox = document.querySelector('sdig-signbox');
|
|
103
151
|
|
|
104
152
|
signbox?.addEventListener('signature', (event) => {
|
|
105
|
-
const { signature } = (event as CustomEvent<{
|
|
153
|
+
const { signature, canvasWidth, canvasHeight } = (event as CustomEvent<{
|
|
154
|
+
signature: unknown[];
|
|
155
|
+
canvasWidth: number;
|
|
156
|
+
canvasHeight: number;
|
|
157
|
+
}>).detail;
|
|
106
158
|
console.log(signature);
|
|
107
159
|
});
|
|
108
160
|
```
|
|
109
161
|
|
|
110
|
-
The `signature` event detail contains the `signature_pad` stroke data returned by `sdig-signpad.toData()
|
|
162
|
+
The `signature` event detail contains the `signature_pad` stroke data returned by `sdig-signpad.toData()` plus the actual responsive canvas dimensions used to capture it. Existing consumers that only read `signature` remain compatible.
|
|
111
163
|
|
|
112
164
|
## Signature Pad
|
|
113
165
|
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@signature.digital/catalog',
|
|
6
|
-
version: '1.
|
|
7
|
-
description: '
|
|
6
|
+
version: '1.9.0',
|
|
7
|
+
description: 'Reusable web components for browser-based signature capture and host-controlled e-signature application surfaces.'
|
|
8
8
|
}
|
package/ts_web/elements/index.ts
CHANGED
|
@@ -3,5 +3,8 @@ export * from './sdig-contextmenu/index.js';
|
|
|
3
3
|
export * from './sdig-signbox/index.js';
|
|
4
4
|
export * from './sdig-signpad/index.js';
|
|
5
5
|
|
|
6
|
+
// Controlled product application primitives
|
|
7
|
+
export * from './sdig-app-shell/index.js';
|
|
8
|
+
|
|
6
9
|
// Product workspace component
|
|
7
10
|
export * from './sdig-workspace/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './sdig-app-shell.js';
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DeesElement,
|
|
3
|
+
property,
|
|
4
|
+
html,
|
|
5
|
+
customElement,
|
|
6
|
+
type TemplateResult,
|
|
7
|
+
css,
|
|
8
|
+
} from '@design.estate/dees-element';
|
|
9
|
+
|
|
10
|
+
import { icon } from '../sdig-workspace/sdig-workspace.shared.js';
|
|
11
|
+
|
|
12
|
+
export interface ISdigShellNavigationItem {
|
|
13
|
+
id: string;
|
|
14
|
+
label: string;
|
|
15
|
+
icon: string;
|
|
16
|
+
count?: number;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
title?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface ISdigShellNavigationRequestDetail {
|
|
22
|
+
view: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare global {
|
|
26
|
+
interface HTMLElementTagNameMap {
|
|
27
|
+
'sdig-app-shell': SdigAppShell;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@customElement('sdig-app-shell')
|
|
32
|
+
export class SdigAppShell extends DeesElement {
|
|
33
|
+
public static demo = () => html`
|
|
34
|
+
<sdig-app-shell
|
|
35
|
+
workspace-name="Example workspace"
|
|
36
|
+
deployment-label="Self-hosted · single instance"
|
|
37
|
+
actor-name="Workspace owner"
|
|
38
|
+
actor-email="owner@example.test"
|
|
39
|
+
active-view="inbox"
|
|
40
|
+
status-label="self-hosted"
|
|
41
|
+
product-label="Open Source · MIT"
|
|
42
|
+
stack-label="foss.global stack"
|
|
43
|
+
stack-description="Lit · TypedRequest · SmartData · SmartBucket · MongoDB · S3"
|
|
44
|
+
.documentCount=${4}
|
|
45
|
+
style="height: 720px"
|
|
46
|
+
>
|
|
47
|
+
<div style="height:100%;display:grid;place-items:center;color:var(--text-muted)">Controlled application content</div>
|
|
48
|
+
</sdig-app-shell>
|
|
49
|
+
`;
|
|
50
|
+
public static demoGroups = ['Signature Digital Application'];
|
|
51
|
+
|
|
52
|
+
@property({ type: String }) public accessor accent = '#007aff';
|
|
53
|
+
@property({ type: String, attribute: 'active-view' }) public accessor activeView = 'inbox';
|
|
54
|
+
@property({ type: String, attribute: 'workspace-name' }) public accessor workspaceName = 'Workspace';
|
|
55
|
+
@property({ type: String, attribute: 'deployment-label' }) public accessor deploymentLabel = 'Host configured';
|
|
56
|
+
@property({ type: String, attribute: 'actor-name' }) public accessor actorName = 'Current user';
|
|
57
|
+
@property({ type: String, attribute: 'actor-email' }) public accessor actorEmail = '';
|
|
58
|
+
@property({ type: Number, attribute: 'document-count' }) public accessor documentCount = 0;
|
|
59
|
+
@property({ type: String, attribute: 'status-label' }) public accessor statusLabel = 'host controlled';
|
|
60
|
+
@property({ type: String, attribute: 'product-label' }) public accessor productLabel = '';
|
|
61
|
+
@property({ type: String, attribute: 'stack-label' }) public accessor stackLabel = 'Application services';
|
|
62
|
+
@property({ type: String, attribute: 'stack-description' }) public accessor stackDescription = 'Configured by host application';
|
|
63
|
+
@property({ attribute: false }) public accessor navigationItems: ISdigShellNavigationItem[] = [
|
|
64
|
+
{ id: 'inbox', label: 'Inbox', icon: 'inbox' },
|
|
65
|
+
{ id: 'compose', label: 'Compose', icon: 'plus' },
|
|
66
|
+
{ id: 'audit', label: 'Audit Trail', icon: 'shield' },
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
public static styles = css`
|
|
70
|
+
:host {
|
|
71
|
+
--accent: #007aff;
|
|
72
|
+
--bg: hsl(0 0% 100%);
|
|
73
|
+
--bg-el: hsl(240 9% 96.5%);
|
|
74
|
+
--bg-card: hsl(0 0% 100%);
|
|
75
|
+
--sidebar: hsl(240 11% 96%);
|
|
76
|
+
--border: hsl(240 6% 89%);
|
|
77
|
+
--border-subtle: hsl(240 6% 92.5%);
|
|
78
|
+
--text: hsl(240 6% 11%);
|
|
79
|
+
--text-sec: hsl(240 4% 34%);
|
|
80
|
+
--text-muted: hsl(240 3% 52%);
|
|
81
|
+
--text-dim: hsl(240 3% 66%);
|
|
82
|
+
--success: #34c759;
|
|
83
|
+
--hover: rgba(0, 0, 0, 0.05);
|
|
84
|
+
--ui: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", Arial, sans-serif;
|
|
85
|
+
--display: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Helvetica Neue", Arial, sans-serif;
|
|
86
|
+
--mono: ui-monospace, "SF Mono", Menlo, "Cascadia Mono", monospace;
|
|
87
|
+
display: block;
|
|
88
|
+
container-type: inline-size;
|
|
89
|
+
width: 100%;
|
|
90
|
+
min-height: 100vh;
|
|
91
|
+
color: var(--text);
|
|
92
|
+
background: var(--bg);
|
|
93
|
+
font-family: var(--ui);
|
|
94
|
+
-webkit-font-smoothing: antialiased;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
* { box-sizing: border-box; }
|
|
98
|
+
button { font: inherit; cursor: pointer; }
|
|
99
|
+
button:disabled { cursor: not-allowed; opacity: .42; }
|
|
100
|
+
.shell { min-height: inherit; height: 100%; display: grid; grid-template-columns: 224px minmax(0, 1fr); background: var(--bg); }
|
|
101
|
+
.sidebar { height: 100%; min-height: inherit; display: flex; flex-direction: column; border-right: 1px solid var(--border-subtle); background: color-mix(in srgb, var(--sidebar) 94%, transparent); backdrop-filter: saturate(180%) blur(20px); }
|
|
102
|
+
.traffic { display: flex; gap: 8px; padding: 13px 16px 0; }
|
|
103
|
+
.traffic span { width: 12px; height: 12px; border-radius: 50%; box-shadow: inset 0 0 0 .5px rgba(0,0,0,.12); }
|
|
104
|
+
.traffic span:nth-child(1) { background: #ff5f57; }
|
|
105
|
+
.traffic span:nth-child(2) { background: #febc2e; }
|
|
106
|
+
.traffic span:nth-child(3) { background: #28c840; }
|
|
107
|
+
.brand { display: flex; align-items: center; gap: 8px; padding: 12px 16px; }
|
|
108
|
+
.mark { width: 26px; height: 26px; display: grid; place-items: center; position: relative; border: .5px solid rgba(0,0,0,.15); border-radius: 7px; color: white; background: linear-gradient(160deg, var(--accent), color-mix(in srgb, var(--accent) 70%, black)); box-shadow: 0 1px 2px rgba(0,0,0,.18), inset 0 1px 0 rgba(255,255,255,.25); font-family: var(--display); font-size: 13px; font-weight: 700; }
|
|
109
|
+
.mark::after { content: ''; width: 4px; height: 4px; position: absolute; right: 5px; bottom: 5px; border-radius: 50%; background: rgba(255,255,255,.95); }
|
|
110
|
+
.wordmark { font-size: 13px; font-weight: 500; letter-spacing: -.02em; white-space: nowrap; }
|
|
111
|
+
.wordmark .dot { color: var(--text-muted); }
|
|
112
|
+
.wordmark::after { content: ''; width: 4px; height: 4px; display: inline-block; margin-left: 3px; border-radius: 50%; background: var(--accent); transform: translateY(-1px); }
|
|
113
|
+
.workspace { display: flex; align-items: center; gap: 8px; margin: 0 12px 8px; padding: 7px 10px; border: 1px solid var(--border); border-radius: 9px; background: var(--bg-card); box-shadow: 0 1px 1.5px rgba(0,0,0,.05); }
|
|
114
|
+
.workspace-badge { width: 20px; height: 20px; display: grid; place-items: center; flex: none; border-radius: 5px; color: white; background: linear-gradient(135deg, var(--accent), #af52de); font-size: 10px; font-weight: 700; }
|
|
115
|
+
.workspace strong { display: block; overflow: hidden; font-size: 12px; font-weight: 500; line-height: 1.2; text-overflow: ellipsis; white-space: nowrap; }
|
|
116
|
+
.workspace small { display: block; margin-top: 1px; color: var(--text-muted); font-size: 10px; }
|
|
117
|
+
nav { display: grid; gap: 2px; padding: 4px 0; }
|
|
118
|
+
.nav-item { width: calc(100% - 18px); min-height: 30px; display: flex; align-items: center; gap: 9px; margin: 1px 9px; padding: 6px 9px; border: 0; border-radius: 7px; color: var(--text-sec); background: transparent; text-align: left; font-size: 13px; font-weight: 450; letter-spacing: -.01em; transition: color .1s ease, background .1s ease, box-shadow .1s ease; }
|
|
119
|
+
.nav-item:hover:not(:disabled) { color: var(--text); background: var(--hover); }
|
|
120
|
+
.nav-item.active { color: white; background: var(--accent); box-shadow: 0 1px 2px color-mix(in srgb, var(--accent) 42%, transparent); font-weight: 510; }
|
|
121
|
+
.count { min-width: 18px; margin-left: auto; padding: 1px 7px; border-radius: 999px; color: var(--text-muted); background: var(--bg-el); font: 10px var(--mono); text-align: center; }
|
|
122
|
+
.nav-item.active .count { color: white; background: rgba(255,255,255,.22); }
|
|
123
|
+
.stack { margin: auto 12px 8px; padding: 11px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg-card); box-shadow: 0 1px 2px rgba(0,0,0,.04); }
|
|
124
|
+
.stack strong { display: block; color: var(--text-sec); font: 11px var(--mono); }
|
|
125
|
+
.stack p { margin: 7px 0 0; color: var(--text-muted); font-size: 10px; line-height: 1.45; }
|
|
126
|
+
.actor { display: flex; align-items: center; gap: 9px; padding: 8px 12px; border-top: 1px solid var(--border-subtle); }
|
|
127
|
+
.avatar { width: 26px; height: 26px; display: grid; place-items: center; flex: none; border-radius: 50%; color: white; background: var(--accent); font-size: 10px; font-weight: 700; }
|
|
128
|
+
.actor-name, .actor-email { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
129
|
+
.actor-name { font-size: 12px; font-weight: 500; }
|
|
130
|
+
.actor-email { color: var(--text-muted); font: 10px var(--mono); }
|
|
131
|
+
.signout { width: 28px; height: 28px; display: grid; place-items: center; border: 0; border-radius: 6px; color: var(--text-muted); background: transparent; }
|
|
132
|
+
.signout:hover { color: #d70015; background: var(--hover); }
|
|
133
|
+
.mobile-signout { display: none; margin-left: auto; }
|
|
134
|
+
.main { min-width: 0; min-height: 0; display: flex; flex-direction: column; }
|
|
135
|
+
.content { flex: 1; min-height: 0; overflow: auto; }
|
|
136
|
+
::slotted(*) { min-height: 100%; }
|
|
137
|
+
.status { height: 24px; display: flex; align-items: center; gap: 16px; flex: none; padding: 0 16px; border-top: 1px solid var(--border-subtle); color: var(--text-dim); background: var(--bg); font: 10px var(--mono); }
|
|
138
|
+
.status-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--success); }
|
|
139
|
+
:focus-visible { outline: 3px solid color-mix(in srgb, var(--accent) 25%, transparent); outline-offset: 2px; }
|
|
140
|
+
|
|
141
|
+
@container (max-width: 760px) {
|
|
142
|
+
.shell { grid-template-columns: 1fr; }
|
|
143
|
+
.sidebar { height: auto; min-height: 0; border-right: 0; border-bottom: 1px solid var(--border-subtle); }
|
|
144
|
+
.traffic, .workspace, .stack, .actor { display: none; }
|
|
145
|
+
.brand { padding: 10px 14px 4px; }
|
|
146
|
+
.mobile-signout { display: grid; }
|
|
147
|
+
nav { display: flex; overflow-x: auto; padding: 4px 8px 8px; }
|
|
148
|
+
.nav-item { width: auto; flex: none; margin: 0 2px; }
|
|
149
|
+
.status { display: none; }
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@media (prefers-reduced-motion: reduce) {
|
|
153
|
+
*, *::before, *::after { transition-duration: .001ms !important; animation-duration: .001ms !important; animation-iteration-count: 1 !important; }
|
|
154
|
+
}
|
|
155
|
+
`;
|
|
156
|
+
|
|
157
|
+
private initials(valueArg: string, fallbackArg = ''): string {
|
|
158
|
+
const source = valueArg.trim() || fallbackArg.trim();
|
|
159
|
+
if (!source) return '?';
|
|
160
|
+
return source.split(/\s+|@/).filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() || '').join('');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private requestNavigation(itemArg: ISdigShellNavigationItem) {
|
|
164
|
+
if (itemArg.disabled) return;
|
|
165
|
+
this.dispatchEvent(new CustomEvent<ISdigShellNavigationRequestDetail>('navigation-request', {
|
|
166
|
+
detail: { view: itemArg.id },
|
|
167
|
+
bubbles: true,
|
|
168
|
+
composed: true,
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private requestSignout() {
|
|
173
|
+
this.dispatchEvent(new CustomEvent('signout-request', { bubbles: true, composed: true }));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public render(): TemplateResult {
|
|
177
|
+
return html`
|
|
178
|
+
<div class="shell" style=${`--accent:${this.accent}`}>
|
|
179
|
+
<aside class="sidebar">
|
|
180
|
+
<div class="traffic" aria-hidden="true"><span></span><span></span><span></span></div>
|
|
181
|
+
<div class="brand"><span class="mark">s</span><span class="wordmark">signature<span class="dot">.</span>digital</span><button class="signout mobile-signout" title="Sign out" aria-label="Sign out" @click=${this.requestSignout}>↪</button></div>
|
|
182
|
+
<div class="workspace"><span class="workspace-badge">${this.initials(this.workspaceName)}</span><div style="min-width:0;flex:1"><strong>${this.workspaceName}</strong><small>${this.deploymentLabel}</small></div></div>
|
|
183
|
+
<nav aria-label="Workspace navigation">
|
|
184
|
+
${this.navigationItems.map((item) => html`
|
|
185
|
+
<button class="nav-item ${this.activeView === item.id ? 'active' : ''}" ?disabled=${item.disabled} title=${item.title || ''} @click=${() => this.requestNavigation(item)}>
|
|
186
|
+
${icon(item.icon, 16)}<span>${item.label}</span>${item.count === undefined ? '' : html`<span class="count">${item.count}</span>`}
|
|
187
|
+
</button>
|
|
188
|
+
`)}
|
|
189
|
+
</nav>
|
|
190
|
+
<div class="stack"><strong>${this.stackLabel}</strong><p>${this.stackDescription}</p></div>
|
|
191
|
+
<div class="actor"><span class="avatar">${this.initials(this.actorName, this.actorEmail)}</span><div style="min-width:0;flex:1"><div class="actor-name">${this.actorName}</div><div class="actor-email">${this.actorEmail}</div></div><button class="signout" title="Sign out" aria-label="Sign out" @click=${this.requestSignout}>↪</button></div>
|
|
192
|
+
</aside>
|
|
193
|
+
<main class="main">
|
|
194
|
+
<div class="content"><slot></slot></div>
|
|
195
|
+
<div class="status"><span class="status-dot"></span><span>${this.statusLabel}</span><span>${this.documentCount} documents</span><div style="flex:1"></div>${this.productLabel ? html`<span style="color:var(--accent)">${this.productLabel}</span>` : ''}</div>
|
|
196
|
+
</main>
|
|
197
|
+
</div>
|
|
198
|
+
`;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -23,6 +23,7 @@ export class SignBox extends DeesElement {
|
|
|
23
23
|
css`
|
|
24
24
|
.mainbox {
|
|
25
25
|
position: relative;
|
|
26
|
+
width: 100%;
|
|
26
27
|
background: ${cssManager.bdTheme('#eeeeeb', '#111111')};
|
|
27
28
|
border-radius: 16px;
|
|
28
29
|
max-width: 600px;
|
|
@@ -55,6 +56,7 @@ export class SignBox extends DeesElement {
|
|
|
55
56
|
box-shadow: ${cssManager.bdTheme('0px 0px 8px 0px #00000040', 'none')};
|
|
56
57
|
z-index: 2;
|
|
57
58
|
display: flex;
|
|
59
|
+
flex-wrap: wrap;
|
|
58
60
|
justify-content: flex-end;
|
|
59
61
|
}
|
|
60
62
|
|
|
@@ -103,11 +105,14 @@ export class SignBox extends DeesElement {
|
|
|
103
105
|
if (await signaturePad.isEmpty()) return;
|
|
104
106
|
const signature = await signaturePad.toData();
|
|
105
107
|
const svg = await signaturePad.toSVG();
|
|
108
|
+
const canvasSize = signaturePad.getCanvasSize();
|
|
106
109
|
this.dispatchEvent(new CustomEvent('signature', {
|
|
107
110
|
detail: {
|
|
108
111
|
signature,
|
|
109
112
|
svg,
|
|
110
113
|
createdAt: Date.now(),
|
|
114
|
+
canvasWidth: canvasSize.width,
|
|
115
|
+
canvasHeight: canvasSize.height,
|
|
111
116
|
},
|
|
112
117
|
bubbles: true,
|
|
113
118
|
composed: true,
|
|
@@ -24,6 +24,7 @@ export class SignPad extends DeesElement {
|
|
|
24
24
|
css`
|
|
25
25
|
:host {
|
|
26
26
|
display: block;
|
|
27
|
+
width: 100%;
|
|
27
28
|
color: white;
|
|
28
29
|
position: relative;
|
|
29
30
|
max-width: 600px;
|
|
@@ -33,7 +34,8 @@ export class SignPad extends DeesElement {
|
|
|
33
34
|
|
|
34
35
|
.mainbox {
|
|
35
36
|
position: relative;
|
|
36
|
-
width:
|
|
37
|
+
width: 100%;
|
|
38
|
+
max-width: 600px;
|
|
37
39
|
height: 280px;
|
|
38
40
|
}
|
|
39
41
|
|
|
@@ -47,6 +49,8 @@ export class SignPad extends DeesElement {
|
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
canvas {
|
|
52
|
+
display: block;
|
|
53
|
+
max-width: 100%;
|
|
50
54
|
filter: ${cssManager.bdTheme('invert(0)', 'invert(1)')};
|
|
51
55
|
}
|
|
52
56
|
`
|
|
@@ -107,6 +111,13 @@ export class SignPad extends DeesElement {
|
|
|
107
111
|
return returnData;
|
|
108
112
|
}
|
|
109
113
|
|
|
114
|
+
public getCanvasSize(): { width: number; height: number } {
|
|
115
|
+
return {
|
|
116
|
+
width: this.canvas?.width || 0,
|
|
117
|
+
height: this.canvas?.height || 0,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
110
121
|
public async fromData(dataArrayArg: plugins.TSignaturePadPointGroup[]) {
|
|
111
122
|
this.signaturePad?.fromData(dataArrayArg);
|
|
112
123
|
}
|