@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
|
@@ -24,16 +24,16 @@ export class SdigWorkspaceAudit extends DeesElement {
|
|
|
24
24
|
const document = this.document || demoDocuments[1];
|
|
25
25
|
const events = [
|
|
26
26
|
['2026-05-02 14:32:18 UTC', 'Sarah Chen', 'Document signed', '81.221.4.18 · Brussels, BE', '0x4a7b…f29c', 'success'],
|
|
27
|
-
['2026-05-02 14:31:54 UTC', 'Sarah Chen', 'Signature
|
|
27
|
+
['2026-05-02 14:31:54 UTC', 'Sarah Chen', 'Signature strokes captured', 'recipient session', '0x4a7b…f29c', 'info'],
|
|
28
28
|
['2026-05-02 14:28:02 UTC', 'Sarah Chen', 'Document opened', '81.221.4.18 · Brussels, BE', '', 'default'],
|
|
29
29
|
['2026-05-02 11:02:11 UTC', 'Philipp K.', 'Document sent for signature', '92.42.114.7 · Berlin, DE', '0x1c8a…3b6f', 'info'],
|
|
30
30
|
['2026-05-02 10:54:22 UTC', 'Philipp K.', 'Document created', '92.42.114.7 · Berlin, DE', '0x1c8a…3b6f', 'default'],
|
|
31
31
|
];
|
|
32
32
|
return html`
|
|
33
|
-
${topBar({ breadcrumb: ['signature.digital', 'Inbox', document.id, 'Audit Trail'], title: `Audit Trail · ${document.title}`, subtitle: pill(`${document.status} ·
|
|
33
|
+
${topBar({ breadcrumb: ['signature.digital', 'Inbox', document.id, 'Audit Trail'], title: `Audit Trail · ${document.title}`, subtitle: pill(`${document.status} · demo application hash chain`, document.status === 'declined' ? 'error' : document.status === 'signed' ? 'success' : 'info', true), actions: html`${actionButton('Evidence export', 'outline', 'download')}` })}
|
|
34
34
|
<div class="content-scroll audit-grid">
|
|
35
|
-
<div class="card"><div style="height: 36px; padding: 0 16px; border-bottom: 1px solid var(--border-subtle); display: flex; align-items: center; justify-content: space-between;"><span style="font-size: 12px; font-weight: 600;">
|
|
36
|
-
<div style="display: flex; flex-direction: column; gap: 16px;"><div class="card" style="padding: 16px;"><div class="label-upper">
|
|
35
|
+
<div class="card"><div style="height: 36px; padding: 0 16px; border-bottom: 1px solid var(--border-subtle); display: flex; align-items: center; justify-content: space-between;"><span style="font-size: 12px; font-weight: 600;">Demo event log</span><span class="mono" style="font-size: 10px; color: var(--text-muted);">${events.length} local demo events</span></div>${events.map((event) => html`<div class="event-row"><div><span style="display: block; width: 8px; height: 8px; border-radius: 50%; background: ${event[5] === 'success' ? 'var(--success)' : event[5] === 'info' ? 'var(--accent)' : 'var(--text-dim)'};"></span></div><div class="mono hide-mobile" style="font-size: 11px; color: var(--text-muted);">${event[0]}</div><div><div style="font-size: 12px; font-weight: 500;">${event[2]}</div><div style="font-size: 10px; color: var(--text-muted); margin-top: 2px;">by ${event[1]} ${event[4] ? html`<span class="mono" style="color: var(--accent); margin-left: 8px;">${event[4]}</span>` : ''}</div></div><div class="mono hide-mobile" style="font-size: 10px; color: var(--text-muted); text-align: right;">${event[3]}</div></div>`)}</div>
|
|
36
|
+
<div style="display: flex; flex-direction: column; gap: 16px;"><div class="card" style="padding: 16px;"><div class="label-upper">Demo document hash</div><div class="mono" style="font-size: 11px; color: var(--accent); word-break: break-all; line-height: 1.5; padding: 10px; background: var(--bg-el); border-radius: 8px; border: 1px solid var(--border-subtle);">4a7b8f29c91e3d2a5b6c8e0f1d3c5a7b9d2e4f6a8c1e3d5f7b9c1e3a5b7d9f0e</div></div><div class="card" style="padding: 16px;"><div class="label-upper">Demo recipients</div>${demoRecipients.map((recipient) => html`<div class="recipient-line"><span class="avatar" style="background: ${recipient.color};">${recipient.name.split(' ').map((part) => part[0]).slice(0, 2).join('')}</span><div style="flex: 1;"><div style="font-size: 12px;">${recipient.name}</div><div class="mono" style="font-size: 10px; color: var(--text-muted);">${recipient.email}</div></div>${recipient.role === 'signer' ? icon('check', 12) : ''}</div>`)}</div><div class="card" style="padding: 16px; border-color: rgba(0,122,255,0.2);"><div style="display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--accent); margin-bottom: 6px;">${icon('shield', 13)} Application evidence preview</div><div style="font-size: 11px; color: var(--text-muted); line-height: 1.55;">The host application supplies recorded events and SHA-256 values. This demo component does not assert identity, trusted timestamps, blockchain anchoring, or legal signature level.</div></div></div>
|
|
37
37
|
</div>
|
|
38
38
|
`;
|
|
39
39
|
}
|
|
@@ -60,7 +60,7 @@ const resizeHandles: TResizeHandle[] = ['n', 'ne', 'e', 'se', 's', 'sw', 'w', 'n
|
|
|
60
60
|
const recipientRoleDefinitions: Array<{ role: TRecipientRole; label: string; shortLabel: string; description: string }> = [
|
|
61
61
|
{ role: 'signer', label: 'Needs signature', shortLabel: 'Signer', description: 'Can receive fields and must sign in order.' },
|
|
62
62
|
{ role: 'copy', label: 'Final copy only', shortLabel: 'Copy', description: 'Receives the completed document after signing.' },
|
|
63
|
-
{ role: 'updates', label: '
|
|
63
|
+
{ role: 'updates', label: 'Host-defined update', shortLabel: 'Updates', description: 'Emits an update-role intent for the host application.' },
|
|
64
64
|
];
|
|
65
65
|
|
|
66
66
|
@customElement('sdig-workspace-compose')
|
|
@@ -626,7 +626,7 @@ export class SdigWorkspaceCompose extends DeesElement {
|
|
|
626
626
|
const selectedField = this.fields.find((field) => field.id === this.selectedFieldId);
|
|
627
627
|
|
|
628
628
|
return html`
|
|
629
|
-
${topBar({ breadcrumb: ['signature.digital', 'Inbox', 'Compose'], title: document.title, subtitle: pill('Draft ·
|
|
629
|
+
${topBar({ breadcrumb: ['signature.digital', 'Inbox', 'Compose'], title: document.title, subtitle: pill('Draft · host controlled'), actions: html`${actionButton('Save draft', 'ghost')}${actionButton('Preview', 'outline', 'eye')}${actionButton('Send for signature', 'primary', 'send')}` })}
|
|
630
630
|
${this.renderStepper()}
|
|
631
631
|
<div class="compose-workspace">
|
|
632
632
|
${this.renderRecipientContextMenu()}
|
|
@@ -647,7 +647,7 @@ export class SdigWorkspaceCompose extends DeesElement {
|
|
|
647
647
|
</div>
|
|
648
648
|
<div class="right-panel">
|
|
649
649
|
<div class="label-upper">Routing order · drag to reorder</div>
|
|
650
|
-
<div class="role-hint">Choose
|
|
650
|
+
<div class="role-hint">Choose visual routing roles. Delivery and notifications remain the host application's responsibility.</div>
|
|
651
651
|
${this.renderSigningOrder()}
|
|
652
652
|
${selectedField ? this.renderFieldEditor(selectedField) : ''}
|
|
653
653
|
</div>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DeesElement, html, customElement, type TemplateResult, css } from '@design.estate/dees-element';
|
|
2
|
-
import {
|
|
2
|
+
import { icon, pill, topBar, workspaceBaseStyles, workspaceDemoFrame } from './sdig-workspace.shared.js';
|
|
3
3
|
|
|
4
4
|
declare global {
|
|
5
5
|
interface HTMLElementTagNameMap {
|
|
@@ -23,23 +23,21 @@ export class SdigWorkspaceDevelopers extends DeesElement {
|
|
|
23
23
|
|
|
24
24
|
public render(): TemplateResult {
|
|
25
25
|
return html`
|
|
26
|
-
${topBar({ breadcrumb: ['signature.digital', 'Developers'], title: 'Developers', subtitle: pill('
|
|
26
|
+
${topBar({ breadcrumb: ['signature.digital', 'Developers'], title: 'Developers', subtitle: pill('foss.global · typed end to end', 'info', true) })}
|
|
27
27
|
<div class="content-scroll developer-grid">
|
|
28
28
|
<div style="display: flex; flex-direction: column; gap: 16px;">
|
|
29
|
-
<div class="card" style="padding: 20px;"><div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px;"><span style="font-size: 14px; font-weight: 600;">
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
});</pre></div>
|
|
38
|
-
<div class="stats-grid">${[['Requests this month', '14,892', '+8.2%'], ['P95 latency', '142ms', '-12ms'], ['Error rate', '0.04%', '✓']].map((metric) => html`<div class="card metric-card"><div class="metric-value">${metric[1]}</div><div style="font-size: 10px; color: var(--text-muted); margin-top: 2px;">${metric[0]}</div><div class="mono" style="font-size: 10px; color: var(--success); margin-top: 6px;">${metric[2]}</div></div>`)}</div>
|
|
29
|
+
<div class="card" style="padding: 20px;"><div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px;"><span style="font-size: 14px; font-weight: 600;">Production application boundary</span><span class="pill">TypeScript</span></div><pre class="code mono">const stack = {
|
|
30
|
+
ui: 'Lit + design.estate',
|
|
31
|
+
api: 'TypedRequest + TypedServer',
|
|
32
|
+
state: 'SmartData + MongoDB',
|
|
33
|
+
blobs: 'SmartBucket + S3',
|
|
34
|
+
pdf: 'pdf-lib + PDF.js',
|
|
35
|
+
} as const;</pre></div>
|
|
36
|
+
<div class="stats-grid">${[['Typed boundary', 'TypedRequest', 'request/response'], ['Persistence', 'SmartData', 'MongoDB'], ['Artifacts', 'SmartBucket', 'S3-compatible']].map((metric) => html`<div class="card metric-card"><div class="metric-value" style="font-size:15px">${metric[1]}</div><div style="font-size: 10px; color: var(--text-muted); margin-top: 2px;">${metric[0]}</div><div class="mono" style="font-size: 10px; color: var(--accent); margin-top: 6px;">${metric[2]}</div></div>`)}</div>
|
|
39
37
|
</div>
|
|
40
38
|
<div style="display: flex; flex-direction: column; gap: 16px;">
|
|
41
|
-
<div class="card" style="padding: 16px;"><div style="display: flex; align-items: center; gap: 8px; margin-bottom: 10px;">${icon('
|
|
42
|
-
<div class="card" style="padding: 16px;"><div class="label-upper">Self-
|
|
39
|
+
<div class="card" style="padding: 16px;"><div style="display: flex; align-items: center; gap: 8px; margin-bottom: 10px;">${icon('code', 14)}<span style="font-size: 12px; font-weight: 600;">Controlled component contract</span></div><div style="font-size: 11px; color: var(--text-muted); line-height: 1.5;">Hosts inject workspace data and own authentication, routing, persistence, and delivery. Catalog components emit bubbling, composed intent events.</div></div>
|
|
40
|
+
<div class="card" style="padding: 16px;"><div class="label-upper">Self-hosted application</div>${[['Runtime', 'Node + TypeScript'], ['State', 'MongoDB'], ['Artifacts', 'S3-compatible'], ['License', 'MIT core']].map((row) => html`<div style="display: flex; justify-content: space-between; font-size: 11px; margin-bottom: 6px;"><span style="color: var(--text-muted);">${row[0]}</span><span class="mono" style="color: var(--text-sec);">${row[1]}</span></div>`)}</div>
|
|
43
41
|
</div>
|
|
44
42
|
</div>
|
|
45
43
|
`;
|
|
@@ -20,10 +20,10 @@ export class SdigWorkspaceInbox extends DeesElement {
|
|
|
20
20
|
|
|
21
21
|
public static styles = [workspaceBaseStyles, css`
|
|
22
22
|
.filterbar { padding: 14px 24px; border-bottom: 1px solid var(--border-subtle); display: flex; align-items: center; gap: 8px; }
|
|
23
|
-
.searchbox { display: flex; align-items: center; gap: 8px; padding: 0 10px; height: 32px; width: 280px; background: var(--bg-input); border: 1px solid var(--border); border-radius:
|
|
23
|
+
.searchbox { display: flex; align-items: center; gap: 8px; padding: 0 10px; height: 32px; width: 280px; background: var(--bg-input); border: 1px solid var(--border); border-radius: 8px; }
|
|
24
24
|
.searchbox input { flex: 1; min-width: 0; background: transparent; border: none; outline: none; color: var(--text); font-size: 12px; }
|
|
25
|
-
.segmented { display: flex; gap: 2px; padding: 2px; background: var(--bg-el); border-radius:
|
|
26
|
-
.segmented button { padding: 4px 10px; font-size:
|
|
25
|
+
.segmented { display: flex; gap: 2px; padding: 2px; background: var(--bg-el); border-radius: 8px; border: 1px solid var(--border-subtle); }
|
|
26
|
+
.segmented button { padding: 4px 10px; font-size: 11.5px; font-weight: 510; border-radius: 6px; background: transparent; color: var(--text-muted); display: inline-flex; align-items: center; gap: 5px; }
|
|
27
27
|
.segmented button.active { background: var(--bg-card); color: var(--text); box-shadow: inset 0 0 0 1px var(--border); }
|
|
28
28
|
.doc-table { min-width: 880px; }
|
|
29
29
|
.doc-head, .doc-row { display: grid; grid-template-columns: 32px minmax(220px,2.4fr) 150px 160px 90px 60px 32px; align-items: center; gap: 14px; padding: 0 16px; }
|
|
@@ -32,7 +32,7 @@ export class SdigWorkspaceInbox extends DeesElement {
|
|
|
32
32
|
.doc-row.compact { height: 48px; }
|
|
33
33
|
.doc-row:last-child { border-bottom: 0; }
|
|
34
34
|
.doc-row:hover { background: var(--row-hover); }
|
|
35
|
-
.doc-icon { width: 28px; height: 32px; border-radius:
|
|
35
|
+
.doc-icon { width: 28px; height: 32px; border-radius: 6px; background: var(--bg-input); border: 1px solid var(--border); display: flex; align-items: center; justify-content: center; }
|
|
36
36
|
.doc-title { font-size: 13px; color: var(--text); font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
37
37
|
.doc-meta { margin-top: 2px; font-size: 11px; color: var(--text-muted); }
|
|
38
38
|
.recipient-stack { display: flex; align-items: center; }
|
|
@@ -85,10 +85,10 @@ export class SdigWorkspaceInbox extends DeesElement {
|
|
|
85
85
|
|
|
86
86
|
return html`
|
|
87
87
|
${topBar({
|
|
88
|
-
breadcrumb: ['signature.digital', '
|
|
88
|
+
breadcrumb: ['signature.digital', 'Example workspace', 'Inbox'],
|
|
89
89
|
title: 'Inbox',
|
|
90
90
|
subtitle: pill(`${attentionCount} need attention`, 'info'),
|
|
91
|
-
actions: html`${actionButton('Import', 'outline', 'upload')}${actionButton('New document', 'primary', 'plus', () => requestWorkspaceView(this, 'compose'))}`,
|
|
91
|
+
actions: html`${actionButton('Import', 'outline', 'upload', () => this.dispatchEvent(new CustomEvent('import-request', { bubbles: true, composed: true })))}${actionButton('New document', 'primary', 'plus', () => requestWorkspaceView(this, 'compose'))}`,
|
|
92
92
|
})}
|
|
93
93
|
<div class="filterbar">
|
|
94
94
|
<div class="searchbox">${icon('search', 13)}<input .value=${this.search} @input=${(event: Event) => this.search = (event.target as HTMLInputElement).value} placeholder="Search documents, recipients, IDs..." /><span class="mono" style="font-size: 10px; color: var(--text-dim); border: 1px solid var(--border); border-radius: 3px; padding: 1px 5px;">⌘K</span></div>
|
|
@@ -114,11 +114,11 @@ export class SdigWorkspaceInbox extends DeesElement {
|
|
|
114
114
|
</div>
|
|
115
115
|
<div class="stats-grid">
|
|
116
116
|
${[
|
|
117
|
-
{ label: '
|
|
118
|
-
{ label: '
|
|
119
|
-
{ label: '
|
|
120
|
-
{ label: '
|
|
121
|
-
].map((metric) => html`<div class="card metric-card"><div style="display: flex; justify-content: space-between; margin-bottom: 12px;">${icon(metric.icon, 14)}<span class="mono" style="font-size: 10px; color: var(--
|
|
117
|
+
{ label: 'Documents', value: documents.length, icon: 'file' },
|
|
118
|
+
{ label: 'Awaiting signatures', value: attentionCount, icon: 'clock' },
|
|
119
|
+
{ label: 'Completed', value: documents.filter((document) => document.status === 'signed').length, icon: 'check' },
|
|
120
|
+
{ label: 'Drafts', value: documents.filter((document) => document.status === 'draft').length, icon: 'code' },
|
|
121
|
+
].map((metric) => html`<div class="card metric-card"><div style="display: flex; justify-content: space-between; margin-bottom: 12px;">${icon(metric.icon, 14)}<span class="mono" style="font-size: 10px; color: var(--text-muted);">current</span></div><div class="metric-value">${metric.value}</div><div style="font-size: 11px; color: var(--text-muted); margin-top: 2px;">${metric.label}</div></div>`)}
|
|
122
122
|
</div>
|
|
123
123
|
</div>
|
|
124
124
|
`;
|
|
@@ -59,7 +59,7 @@ export const demoDocuments: IDocumentRow[] = [
|
|
|
59
59
|
export const demoRecipients: IRecipient[] = [
|
|
60
60
|
{ id: 0, name: 'Sarah Chen', email: 'sarah@acme.com', color: '#60a5fa', order: 1, role: 'signer' },
|
|
61
61
|
{ id: 1, name: 'David Park', email: 'd.park@acme.com', color: '#fbbf24', order: 2, role: 'signer' },
|
|
62
|
-
{ id: 2, name: '
|
|
62
|
+
{ id: 2, name: 'Alex Example', email: 'alex@example.test', color: '#007aff', order: 3, role: 'copy' },
|
|
63
63
|
];
|
|
64
64
|
|
|
65
65
|
export const demoFields: IFieldPlacement[] = [
|
|
@@ -77,7 +77,7 @@ export const workspaceBaseStyles = css`
|
|
|
77
77
|
min-height: 0;
|
|
78
78
|
color: var(--text);
|
|
79
79
|
background: var(--bg);
|
|
80
|
-
font-family:
|
|
80
|
+
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", Arial, sans-serif;
|
|
81
81
|
font-feature-settings: 'cv11', 'tnum', 'cv05' 1;
|
|
82
82
|
}
|
|
83
83
|
|
|
@@ -100,7 +100,8 @@ export const workspaceBaseStyles = css`
|
|
|
100
100
|
align-items: center;
|
|
101
101
|
justify-content: space-between;
|
|
102
102
|
border-bottom: 1px solid var(--border-subtle);
|
|
103
|
-
background: var(--bg);
|
|
103
|
+
background: color-mix(in srgb, var(--bg) 72%, transparent);
|
|
104
|
+
backdrop-filter: saturate(180%) blur(20px);
|
|
104
105
|
gap: 12px;
|
|
105
106
|
}
|
|
106
107
|
|
|
@@ -123,10 +124,10 @@ export const workspaceBaseStyles = css`
|
|
|
123
124
|
}
|
|
124
125
|
|
|
125
126
|
.top-title > span:first-child {
|
|
126
|
-
font-family:
|
|
127
|
-
font-size:
|
|
128
|
-
font-weight:
|
|
129
|
-
letter-spacing: -0.
|
|
127
|
+
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Helvetica Neue", Arial, sans-serif;
|
|
128
|
+
font-size: 19px;
|
|
129
|
+
font-weight: 640;
|
|
130
|
+
letter-spacing: -0.022em;
|
|
130
131
|
white-space: nowrap;
|
|
131
132
|
overflow: hidden;
|
|
132
133
|
text-overflow: ellipsis;
|
|
@@ -142,7 +143,7 @@ export const workspaceBaseStyles = css`
|
|
|
142
143
|
.btn {
|
|
143
144
|
height: 34px;
|
|
144
145
|
padding: 0 14px;
|
|
145
|
-
border-radius:
|
|
146
|
+
border-radius: 7px;
|
|
146
147
|
font-size: 13px;
|
|
147
148
|
font-weight: 500;
|
|
148
149
|
letter-spacing: -0.01em;
|
|
@@ -217,7 +218,7 @@ export const workspaceBaseStyles = css`
|
|
|
217
218
|
.card {
|
|
218
219
|
background: var(--bg-card);
|
|
219
220
|
border: 1px solid var(--border);
|
|
220
|
-
border-radius:
|
|
221
|
+
border-radius: 12px;
|
|
221
222
|
overflow: hidden;
|
|
222
223
|
}
|
|
223
224
|
|
|
@@ -342,7 +343,7 @@ export const workspaceBaseStyles = css`
|
|
|
342
343
|
`;
|
|
343
344
|
|
|
344
345
|
export function icon(name: string, size = 14): TemplateResult {
|
|
345
|
-
return html`<dees-icon .icon=${iconMap[name] || iconMap.file}
|
|
346
|
+
return html`<dees-icon .icon=${iconMap[name] || iconMap.file} .iconSize=${size}></dees-icon>`;
|
|
346
347
|
}
|
|
347
348
|
|
|
348
349
|
const iconMap: Record<string, string> = {
|
|
@@ -350,7 +351,7 @@ const iconMap: Record<string, string> = {
|
|
|
350
351
|
user: 'lucide:User', settings: 'lucide:Settings', upload: 'lucide:Upload', file: 'lucide:FileText', sign: 'lucide:PenTool',
|
|
351
352
|
clock: 'lucide:Clock', search: 'lucide:Search', more: 'lucide:MoreHorizontal', send: 'lucide:Send', check: 'lucide:Check',
|
|
352
353
|
eye: 'lucide:Eye', calendar: 'lucide:Calendar', type: 'lucide:Type', download: 'lucide:Download', hash: 'lucide:Hash',
|
|
353
|
-
github: 'lucide:
|
|
354
|
+
github: 'lucide:Github', git: 'lucide:GitBranch', server: 'lucide:Server', star: 'lucide:Star', sparkle: 'lucide:Sparkles',
|
|
354
355
|
chevronRight: 'lucide:ChevronRight', chevronDown: 'lucide:ChevronDown', x: 'lucide:X', activity: 'lucide:Activity',
|
|
355
356
|
};
|
|
356
357
|
|
|
@@ -376,9 +377,9 @@ export function topBar(config: { breadcrumb: string[]; title: string; subtitle?:
|
|
|
376
377
|
`;
|
|
377
378
|
}
|
|
378
379
|
|
|
379
|
-
export function workspaceDemoFrame(content: TemplateResult, theme: TWorkspaceTheme = '
|
|
380
|
+
export function workspaceDemoFrame(content: TemplateResult, theme: TWorkspaceTheme = 'light'): TemplateResult {
|
|
380
381
|
const darkVars = `
|
|
381
|
-
--accent: #
|
|
382
|
+
--accent: #007aff;
|
|
382
383
|
--bg: hsl(0 0% 3.9%);
|
|
383
384
|
--bg-el: hsl(0 0% 6%);
|
|
384
385
|
--bg-card: hsl(0 0% 7%);
|
|
@@ -398,39 +399,39 @@ export function workspaceDemoFrame(content: TemplateResult, theme: TWorkspaceThe
|
|
|
398
399
|
--error: #ef4444;
|
|
399
400
|
`;
|
|
400
401
|
const lightVars = `
|
|
401
|
-
--accent: #
|
|
402
|
-
--bg: hsl(0 0%
|
|
403
|
-
--bg-el: hsl(
|
|
402
|
+
--accent: #007aff;
|
|
403
|
+
--bg: hsl(0 0% 100%);
|
|
404
|
+
--bg-el: hsl(240 9% 96.5%);
|
|
404
405
|
--bg-card: hsl(0 0% 100%);
|
|
405
|
-
--bg-input: hsl(0 0%
|
|
406
|
-
--border: hsl(
|
|
407
|
-
--border-subtle: hsl(
|
|
408
|
-
--border-strong: hsl(
|
|
409
|
-
--text: hsl(
|
|
410
|
-
--text-sec: hsl(
|
|
411
|
-
--text-muted: hsl(
|
|
412
|
-
--text-dim: hsl(
|
|
413
|
-
--hover: rgba(0,0,0,0.
|
|
414
|
-
--hover-subtle: rgba(0,0,0,0.
|
|
415
|
-
--row-hover: rgba(0,0,0,0.
|
|
416
|
-
--success: #
|
|
417
|
-
--warning: #
|
|
418
|
-
--error: #
|
|
406
|
+
--bg-input: hsl(0 0% 100%);
|
|
407
|
+
--border: hsl(240 6% 89%);
|
|
408
|
+
--border-subtle: hsl(240 6% 92.5%);
|
|
409
|
+
--border-strong: hsl(240 6% 80%);
|
|
410
|
+
--text: hsl(240 6% 11%);
|
|
411
|
+
--text-sec: hsl(240 4% 34%);
|
|
412
|
+
--text-muted: hsl(240 3% 52%);
|
|
413
|
+
--text-dim: hsl(240 3% 66%);
|
|
414
|
+
--hover: rgba(0,0,0,0.05);
|
|
415
|
+
--hover-subtle: rgba(0,0,0,0.028);
|
|
416
|
+
--row-hover: rgba(0,0,0,0.028);
|
|
417
|
+
--success: #34c759;
|
|
418
|
+
--warning: #ff9500;
|
|
419
|
+
--error: #ff3b30;
|
|
419
420
|
`;
|
|
420
421
|
|
|
421
|
-
return html`<div style="${theme === 'dark' ? darkVars : lightVars} height: 720px; min-height: 720px; background: var(--bg); color: var(--text); overflow: hidden; font-family:
|
|
422
|
+
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>`;
|
|
422
423
|
}
|
|
423
424
|
|
|
424
425
|
export function fakeDocument(): TemplateResult {
|
|
425
426
|
return html`
|
|
426
427
|
<div class="fake-document">
|
|
427
428
|
<div class="fake-title">Master Services Agreement</div>
|
|
428
|
-
<div class="mono" style="font-size: 10px; color: hsl(0 0% 45%); margin-bottom: 24px;">Effective: May 2, 2026 · Acme Corp ↔
|
|
429
|
+
<div class="mono" style="font-size: 10px; color: hsl(0 0% 45%); margin-bottom: 24px;">Effective: May 2, 2026 · Acme Corp ↔ Example Company</div>
|
|
429
430
|
${Array.from({ length: 18 }).map((_, index) => html`<div class="fake-line ${index % 5 === 0 ? 'heavy' : ''} ${index % 4 === 3 ? 'short' : ''}"></div>`)}
|
|
430
431
|
<div style="height: 16px;"></div>
|
|
431
432
|
${Array.from({ length: 8 }).map((_, index) => html`<div class="fake-line ${index % 3 === 2 ? 'short' : ''}"></div>`)}
|
|
432
433
|
<div style="margin-top: 60px; font-size: 10px; font-weight: 600; color: hsl(0 0% 35%);">SIGNED ON BEHALF OF ACME CORP</div>
|
|
433
|
-
<div style="margin-top: 70px; font-size: 10px; font-weight: 600; color: hsl(0 0% 35%);">SIGNED ON BEHALF OF
|
|
434
|
+
<div style="margin-top: 70px; font-size: 10px; font-weight: 600; color: hsl(0 0% 35%);">SIGNED ON BEHALF OF EXAMPLE COMPANY</div>
|
|
434
435
|
</div>
|
|
435
436
|
`;
|
|
436
437
|
}
|
|
@@ -15,7 +15,7 @@ declare global {
|
|
|
15
15
|
|
|
16
16
|
@customElement('sdig-workspace')
|
|
17
17
|
export class SdigWorkspace extends DeesElement {
|
|
18
|
-
public static demo = () => html`<sdig-workspace></sdig-workspace>`;
|
|
18
|
+
public static demo = () => html`<sdig-workspace theme="light" accent="#007aff"></sdig-workspace>`;
|
|
19
19
|
public static demoGroups = ['Signature Digital Workspace'];
|
|
20
20
|
|
|
21
21
|
@property({ type: String }) public accessor accent: string = '#3b82f6';
|
|
@@ -69,29 +69,29 @@ export class SdigWorkspace extends DeesElement {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
:host([theme='light']) {
|
|
72
|
-
--bg: hsl(0 0%
|
|
73
|
-
--bg-el: hsl(
|
|
72
|
+
--bg: hsl(0 0% 100%);
|
|
73
|
+
--bg-el: hsl(240 9% 96.5%);
|
|
74
74
|
--bg-card: hsl(0 0% 100%);
|
|
75
|
-
--bg-input: hsl(0 0%
|
|
76
|
-
--border: hsl(
|
|
77
|
-
--border-subtle: hsl(
|
|
78
|
-
--border-strong: hsl(
|
|
79
|
-
--text: hsl(
|
|
80
|
-
--text-sec: hsl(
|
|
81
|
-
--text-muted: hsl(
|
|
82
|
-
--text-dim: hsl(
|
|
83
|
-
--hover: rgba(0,0,0,0.
|
|
84
|
-
--hover-subtle: rgba(0,0,0,0.
|
|
85
|
-
--row-hover: rgba(0,0,0,0.
|
|
86
|
-
--success: #
|
|
87
|
-
--warning: #
|
|
88
|
-
--error: #
|
|
75
|
+
--bg-input: hsl(0 0% 100%);
|
|
76
|
+
--border: hsl(240 6% 89%);
|
|
77
|
+
--border-subtle: hsl(240 6% 92.5%);
|
|
78
|
+
--border-strong: hsl(240 6% 80%);
|
|
79
|
+
--text: hsl(240 6% 11%);
|
|
80
|
+
--text-sec: hsl(240 4% 34%);
|
|
81
|
+
--text-muted: hsl(240 3% 52%);
|
|
82
|
+
--text-dim: hsl(240 3% 66%);
|
|
83
|
+
--hover: rgba(0,0,0,0.05);
|
|
84
|
+
--hover-subtle: rgba(0,0,0,0.028);
|
|
85
|
+
--row-hover: rgba(0,0,0,0.028);
|
|
86
|
+
--success: #34c759;
|
|
87
|
+
--warning: #ff9500;
|
|
88
|
+
--error: #ff3b30;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
* { box-sizing: border-box; }
|
|
92
92
|
button { font: inherit; border: 0; cursor: pointer; }
|
|
93
93
|
.workspace { display: flex; height: 100%; min-height: 720px; background: var(--bg); color: var(--text); overflow: hidden; }
|
|
94
|
-
.sidebar { width:
|
|
94
|
+
.sidebar { width: 224px; background: color-mix(in srgb, var(--bg-el) 94%, transparent); border-right: 1px solid var(--border-subtle); display: flex; flex-direction: column; flex-shrink: 0; height: 100%; backdrop-filter: saturate(180%) blur(20px); }
|
|
95
95
|
.brand { padding: 14px 16px 12px; display: flex; align-items: center; gap: 8px; }
|
|
96
96
|
.logomark { width: 26px; height: 26px; border-radius: 6px; background: var(--bg-el); border: 1px solid var(--border-strong); display: inline-flex; align-items: center; justify-content: center; font-family: 'Plus Jakarta Sans', Inter, sans-serif; font-size: 13px; font-weight: 700; position: relative; }
|
|
97
97
|
.logomark::after, .wordmark::after { content: ''; display: inline-block; border-radius: 50%; background: var(--accent); }
|
|
@@ -99,18 +99,18 @@ export class SdigWorkspace extends DeesElement {
|
|
|
99
99
|
.wordmark { font-size: 13px; font-weight: 500; letter-spacing: -0.02em; white-space: nowrap; }
|
|
100
100
|
.wordmark .dot { color: var(--text-muted); }
|
|
101
101
|
.wordmark::after { width: 4px; height: 4px; margin-left: 3px; transform: translateY(-1px); }
|
|
102
|
-
.workspace-card { margin: 0 12px 8px; padding: 7px 10px; background: var(--bg-
|
|
102
|
+
.workspace-card { margin: 0 12px 8px; padding: 7px 10px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 9px; display: flex; align-items: center; gap: 8px; }
|
|
103
103
|
.workspace-badge { width: 18px; height: 18px; border-radius: 4px; background: linear-gradient(135deg, var(--accent), hsl(280 70% 60%)); color: white; font-size: 10px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
|
|
104
104
|
.workspace-name { font-size: 12px; font-weight: 500; line-height: 1.2; }
|
|
105
105
|
.workspace-plan { font-size: 10px; color: var(--text-muted); }
|
|
106
106
|
.nav-block { padding: 4px 0; }
|
|
107
|
-
.nav-item { display: flex; align-items: center; gap:
|
|
107
|
+
.nav-item { display: flex; align-items: center; gap: 9px; padding: 6px 9px; margin: 1px 9px; border-radius: 7px; color: var(--text-sec); background: transparent; transition: all 0.1s ease; font-size: 13px; position: relative; width: calc(100% - 18px); text-align: left; }
|
|
108
108
|
.compact .nav-item { padding: 5px 10px; }
|
|
109
109
|
.nav-item:hover { background: var(--hover-subtle); color: var(--text-sec); }
|
|
110
|
-
.nav-item.active { background: var(--
|
|
111
|
-
.nav-item.active::before {
|
|
110
|
+
.nav-item.active { background: var(--accent); color: white; font-weight: 510; box-shadow: 0 1px 2px color-mix(in srgb, var(--accent) 42%, transparent); }
|
|
111
|
+
.nav-item.active::before { display: none; }
|
|
112
112
|
.nav-count { margin-left: auto; min-width: 18px; padding: 1px 6px; border-radius: 999px; background: var(--bg-el); color: var(--text-muted); font-size: 10px; text-align: center; }
|
|
113
|
-
.github-card { margin: 8px 12px; padding: 10px; border: 1px solid var(--border
|
|
113
|
+
.github-card { margin: 8px 12px; padding: 10px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg-card); }
|
|
114
114
|
.sparkline { margin-top: 8px; display: flex; gap: 2px; align-items: flex-end; height: 18px; }
|
|
115
115
|
.sparkline span { flex: 1; background: var(--border-strong); border-radius: 1px; }
|
|
116
116
|
.sparkline span:nth-last-child(-n+4) { background: var(--accent); }
|
|
@@ -151,12 +151,12 @@ export class SdigWorkspace extends DeesElement {
|
|
|
151
151
|
return html`
|
|
152
152
|
<aside class="sidebar">
|
|
153
153
|
<div class="brand"><span class="logomark">s</span><span class="wordmark">signature<span class="dot">.</span>digital</span></div>
|
|
154
|
-
<div class="workspace-card"><span class="workspace-badge">
|
|
154
|
+
<div class="workspace-card"><span class="workspace-badge">E</span><div style="flex: 1; min-width: 0;"><div class="workspace-name">Example workspace</div><div class="workspace-plan">Component preview</div></div></div>
|
|
155
155
|
<div class="nav-block">${navItems.map((item) => this.navButton(item))}</div>
|
|
156
156
|
<div style="flex: 1;"></div>
|
|
157
|
-
<div class="github-card"><div style="display: flex; align-items: center; gap: 6px; margin-bottom:
|
|
157
|
+
<div class="github-card"><div style="display: flex; align-items: center; gap: 6px; margin-bottom: 6px; font-size: 11px; color: var(--text-sec); font-family: 'Intel One Mono', ui-monospace;">${icon('code', 13)} host controlled</div><div style="font-size: 10px; line-height: 1.45; color: var(--text-muted);">Demo data is replaceable through component properties and intent events.</div></div>
|
|
158
158
|
<div class="nav-block" style="border-top: 1px solid var(--border-subtle); padding-top: 8px;">${lowerItems.map((item) => this.navButton(item))}</div>
|
|
159
|
-
<div class="user-card"><span class="avatar">
|
|
159
|
+
<div class="user-card"><span class="avatar">DE</span><div style="flex: 1; min-width: 0;"><div style="font-size: 12px; font-weight: 500;">Demo owner</div><div style="font-family: 'Intel One Mono', ui-monospace; font-size: 10px; color: var(--text-muted); overflow: hidden; text-overflow: ellipsis;">owner@example.test</div></div>${icon('more', 14)}</div>
|
|
160
160
|
</aside>
|
|
161
161
|
`;
|
|
162
162
|
}
|
|
@@ -177,6 +177,6 @@ export class SdigWorkspace extends DeesElement {
|
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
public render(): TemplateResult {
|
|
180
|
-
return html`<div class="workspace ${this.density === 'compact' ? 'compact' : ''}" style="--accent: ${this.accent};" data-screen-label=${this.view}>${this.renderSidebar()}<main class="main">${this.renderView()}<div class="statusbar"><span style="display: inline-flex; align-items: center; gap: 5px;"><span style="width: 6px; height: 6px; border-radius: 50%; background: var(--success);"></span>
|
|
180
|
+
return html`<div class="workspace ${this.density === 'compact' ? 'compact' : ''}" style="--accent: ${this.accent};" data-screen-label=${this.view}>${this.renderSidebar()}<main class="main">${this.renderView()}<div class="statusbar"><span style="display: inline-flex; align-items: center; gap: 5px;"><span style="width: 6px; height: 6px; border-radius: 50%; background: var(--success);"></span>component preview</span><span>${this.documents.length} documents</span><div style="flex: 1;"></div><span style="color: var(--accent);">Open Source · MIT</span><span>host controlled</span></div></main></div>`;
|
|
181
181
|
}
|
|
182
182
|
}
|
package/.smartconfig.json
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"@git.zone/cli": {
|
|
3
|
-
"schemaVersion": 2,
|
|
4
|
-
"projectType": "wcc",
|
|
5
|
-
"module": {
|
|
6
|
-
"githost": "gitlab.com",
|
|
7
|
-
"gitscope": "signature.digital",
|
|
8
|
-
"gitrepo": "catalog",
|
|
9
|
-
"description": "A comprehensive catalog of customizable web components designed for building and managing e-signature applications.",
|
|
10
|
-
"npmPackagename": "@signature.digital/catalog",
|
|
11
|
-
"license": "MIT",
|
|
12
|
-
"projectDomain": "signature.digital",
|
|
13
|
-
"keywords": [
|
|
14
|
-
"e-signature",
|
|
15
|
-
"web components",
|
|
16
|
-
"digital signature",
|
|
17
|
-
"signature capture",
|
|
18
|
-
"ECMAScript Modules",
|
|
19
|
-
"typescript",
|
|
20
|
-
"component library",
|
|
21
|
-
"contract management",
|
|
22
|
-
"frontend development",
|
|
23
|
-
"signature pad",
|
|
24
|
-
"custom elements",
|
|
25
|
-
"electronic signing",
|
|
26
|
-
"npm package"
|
|
27
|
-
]
|
|
28
|
-
},
|
|
29
|
-
"release": {
|
|
30
|
-
"targets": {
|
|
31
|
-
"git": {
|
|
32
|
-
"enabled": true,
|
|
33
|
-
"remote": "origin",
|
|
34
|
-
"pushBranch": true,
|
|
35
|
-
"pushTags": true
|
|
36
|
-
},
|
|
37
|
-
"npm": {
|
|
38
|
-
"enabled": true,
|
|
39
|
-
"registries": [
|
|
40
|
-
"https://verdaccio.lossless.digital",
|
|
41
|
-
"https://registry.npmjs.org"
|
|
42
|
-
],
|
|
43
|
-
"accessLevel": "public",
|
|
44
|
-
"alreadyPublished": "success"
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
"@git.zone/tsbundle": {
|
|
50
|
-
"bundles": [
|
|
51
|
-
{
|
|
52
|
-
"from": "./html/index.ts",
|
|
53
|
-
"to": "./dist_bundle/bundle.js",
|
|
54
|
-
"outputMode": "bundle",
|
|
55
|
-
"bundler": "esbuild",
|
|
56
|
-
"production": true,
|
|
57
|
-
"includeFiles": [
|
|
58
|
-
"./html/index.html"
|
|
59
|
-
]
|
|
60
|
-
}
|
|
61
|
-
]
|
|
62
|
-
},
|
|
63
|
-
"@git.zone/tswatch": {
|
|
64
|
-
"server": {
|
|
65
|
-
"enabled": true,
|
|
66
|
-
"port": 3002,
|
|
67
|
-
"serveDir": "./dist_watch/",
|
|
68
|
-
"liveReload": true
|
|
69
|
-
},
|
|
70
|
-
"bundles": [
|
|
71
|
-
{
|
|
72
|
-
"name": "element-bundle",
|
|
73
|
-
"from": "./html/index.ts",
|
|
74
|
-
"to": "./dist_watch/bundle.js",
|
|
75
|
-
"watchPatterns": [
|
|
76
|
-
"./ts_web/**/*",
|
|
77
|
-
"./html/index.ts"
|
|
78
|
-
],
|
|
79
|
-
"triggerReload": true,
|
|
80
|
-
"bundler": "esbuild",
|
|
81
|
-
"production": false
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"name": "html",
|
|
85
|
-
"from": "./html/index.html",
|
|
86
|
-
"to": "./dist_watch/index.html",
|
|
87
|
-
"watchPatterns": [
|
|
88
|
-
"./html/**/*"
|
|
89
|
-
],
|
|
90
|
-
"triggerReload": true
|
|
91
|
-
}
|
|
92
|
-
]
|
|
93
|
-
},
|
|
94
|
-
"@ship.zone/szci": {}
|
|
95
|
-
}
|