@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.
Files changed (37) hide show
  1. package/dist_ts_web/00_commitinfo_data.js +3 -3
  2. package/dist_ts_web/elements/index.d.ts +1 -0
  3. package/dist_ts_web/elements/index.js +3 -1
  4. package/dist_ts_web/elements/sdig-app-shell/index.d.ts +1 -0
  5. package/dist_ts_web/elements/sdig-app-shell/index.js +2 -0
  6. package/dist_ts_web/elements/sdig-app-shell/sdig-app-shell.d.ts +38 -0
  7. package/dist_ts_web/elements/sdig-app-shell/sdig-app-shell.js +309 -0
  8. package/dist_ts_web/elements/sdig-signbox/sdig-signbox.js +6 -1
  9. package/dist_ts_web/elements/sdig-signpad/sdig-signpad.d.ts +4 -0
  10. package/dist_ts_web/elements/sdig-signpad/sdig-signpad.js +12 -2
  11. package/dist_ts_web/elements/sdig-workspace/sdig-workspace-audit.js +5 -5
  12. package/dist_ts_web/elements/sdig-workspace/sdig-workspace-compose.js +4 -4
  13. package/dist_ts_web/elements/sdig-workspace/sdig-workspace-developers.js +13 -15
  14. package/dist_ts_web/elements/sdig-workspace/sdig-workspace-inbox.js +12 -12
  15. package/dist_ts_web/elements/sdig-workspace/sdig-workspace.js +28 -28
  16. package/dist_ts_web/elements/sdig-workspace/sdig-workspace.shared.js +35 -34
  17. package/package.json +5 -12
  18. package/readme.md +54 -2
  19. package/ts_web/00_commitinfo_data.ts +2 -2
  20. package/ts_web/elements/index.ts +3 -0
  21. package/ts_web/elements/sdig-app-shell/index.ts +1 -0
  22. package/ts_web/elements/sdig-app-shell/sdig-app-shell.ts +200 -0
  23. package/ts_web/elements/sdig-signbox/sdig-signbox.ts +5 -0
  24. package/ts_web/elements/sdig-signpad/sdig-signpad.ts +12 -1
  25. package/ts_web/elements/sdig-workspace/sdig-workspace-audit.ts +4 -4
  26. package/ts_web/elements/sdig-workspace/sdig-workspace-compose.ts +3 -3
  27. package/ts_web/elements/sdig-workspace/sdig-workspace-developers.ts +12 -14
  28. package/ts_web/elements/sdig-workspace/sdig-workspace-inbox.ts +11 -11
  29. package/ts_web/elements/sdig-workspace/sdig-workspace.shared.ts +34 -33
  30. package/ts_web/elements/sdig-workspace/sdig-workspace.ts +27 -27
  31. package/.smartconfig.json +0 -95
  32. package/dist_bundle/bundle.js +0 -6218
  33. package/dist_bundle/bundle.js.map +0 -7
  34. package/dist_bundle/index.html +0 -28
  35. package/dist_watch/bundle.js +0 -135739
  36. package/dist_watch/bundle.js.map +0 -7
  37. 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 adopted (typed)', '81.221.4.18 · Brussels, BE', '0x4a7b…f29c', 'info'],
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} · cryptographically sealed`, document.status === 'declined' ? 'error' : document.status === 'signed' ? 'success' : 'info', true), actions: html`${actionButton('Certificate (PDF)', 'outline', 'download')}${actionButton('Verify on chain', 'outline', 'hash')}` })}
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;">Event log</span><span class="mono" style="font-size: 10px; color: var(--text-muted);">${events.length} events · immutable</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">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: 4px; border: 1px solid var(--border-subtle);">0x4a7b8f29c91e3d2a5b6c8e0f1d3c5a7b9d2e4f6a8c1e3d5f7b9c1e3a5b7d9f0e</div></div><div class="card" style="padding: 16px;"><div class="label-upper">Signers</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>${icon('check', 12)}</div>`)}</div><div class="card" style="padding: 16px; border-color: rgba(34,197,94,0.2);"><div style="display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--success); margin-bottom: 6px;">${icon('shield', 13)} eIDAS Qualified · ESIGN Act compliant</div><div style="font-size: 11px; color: var(--text-muted); line-height: 1.55;">Open-source verifier available. Anyone can independently validate this signature against the public ledger.</div></div></div>
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: 'Every step update', shortLabel: 'Updates', description: 'Receives notifications for every routing step.' },
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 · auto-saved'), actions: html`${actionButton('Save draft', 'ghost')}${actionButton('Preview', 'outline', 'eye')}${actionButton('Send for signature', 'primary', 'send')}` })}
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 who signs, who gets the completed copy, and who is notified at every step.</div>
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 { actionButton, icon, pill, topBar, workspaceBaseStyles, workspaceDemoFrame } from './sdig-workspace.shared.js';
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('API · v0.42', 'info', true), actions: html`${actionButton('View on GitHub', 'outline', 'github')}${actionButton('New API key', 'primary', 'plus')}` })}
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;">Send a document in 8 lines</span><span class="pill">node</span></div><pre class="code mono">import { Signature } from '@signature.digital/sdk';
30
-
31
- const sig = new Signature(process.env.SIGD_KEY);
32
-
33
- await sig.documents.send({
34
- file: './msa.pdf',
35
- recipients: [{ name: 'Sarah Chen', email: 'sarah@acme.com' }],
36
- fields: 'auto',
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('github', 14)}<span style="font-size: 12px; font-weight: 600;">signature-digital/core</span></div><div style="font-size: 11px; color: var(--text-muted); line-height: 1.5;">MIT-licensed. Self-host on your own infra, or use signature.digital cloud.</div></div>
42
- <div class="card" style="padding: 16px;"><div class="label-upper">Self-host status</div>${[['Docker image', 'ghcr.io/signature-digital'], ['Helm chart', 'v0.42.1'], ['Postgres ≥ 14', 'required'], ['S3-compatible', 'optional']].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>
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: 6px; }
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: 6px; border: 1px solid var(--border-subtle); }
26
- .segmented button { padding: 4px 10px; font-size: 11px; font-weight: 500; border-radius: 4px; background: transparent; color: var(--text-muted); display: inline-flex; align-items: center; gap: 5px; }
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: 4px; background: var(--bg-input); border: 1px solid var(--border); display: flex; align-items: center; justify-content: center; }
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', 'Lossless GmbH', 'Inbox'],
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: 'Sent this month', value: '127', delta: '+24%', icon: 'send' },
118
- { label: 'Avg time to sign', value: '4.2h', delta: '-18%', icon: 'clock' },
119
- { label: 'Completion rate', value: '94.1%', delta: '+2.1%', icon: 'check' },
120
- { label: 'API signatures', value: '2,481', delta: '+312', 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(--success);">${metric.delta}</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>`)}
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: 'Philipp K.', email: 'philipp@lossless.com', color: '#3b82f6', order: 3, role: 'updates' },
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: Geist, Inter, Roboto, -apple-system, BlinkMacSystemFont, sans-serif;
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: 'Plus Jakarta Sans', Inter, sans-serif;
127
- font-size: 18px;
128
- font-weight: 600;
129
- letter-spacing: -0.02em;
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: 6px;
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: 8px;
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} style="font-size: ${size}px;"></dees-icon>`;
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:GitBranch', git: 'lucide:GitBranch', server: 'lucide:Server', star: 'lucide:Star', sparkle: 'lucide:Sparkles',
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 = 'dark'): TemplateResult {
380
+ export function workspaceDemoFrame(content: TemplateResult, theme: TWorkspaceTheme = 'light'): TemplateResult {
380
381
  const darkVars = `
381
- --accent: #3b82f6;
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: #3b82f6;
402
- --bg: hsl(0 0% 99%);
403
- --bg-el: hsl(0 0% 97%);
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% 98%);
406
- --border: hsl(0 0% 90%);
407
- --border-subtle: hsl(0 0% 93%);
408
- --border-strong: hsl(0 0% 80%);
409
- --text: hsl(0 0% 9%);
410
- --text-sec: hsl(0 0% 32%);
411
- --text-muted: hsl(0 0% 45%);
412
- --text-dim: hsl(0 0% 62%);
413
- --hover: rgba(0,0,0,0.04);
414
- --hover-subtle: rgba(0,0,0,0.02);
415
- --row-hover: rgba(0,0,0,0.02);
416
- --success: #16a34a;
417
- --warning: #d97706;
418
- --error: #dc2626;
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: Geist, Inter, Roboto, -apple-system, BlinkMacSystemFont, sans-serif;">${content}</div>`;
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 ↔ Lossless GmbH</div>
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 LOSSLESS GMBH</div>
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% 99%);
73
- --bg-el: hsl(0 0% 97%);
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% 98%);
76
- --border: hsl(0 0% 90%);
77
- --border-subtle: hsl(0 0% 93%);
78
- --border-strong: hsl(0 0% 80%);
79
- --text: hsl(0 0% 9%);
80
- --text-sec: hsl(0 0% 32%);
81
- --text-muted: hsl(0 0% 45%);
82
- --text-dim: hsl(0 0% 62%);
83
- --hover: rgba(0,0,0,0.04);
84
- --hover-subtle: rgba(0,0,0,0.02);
85
- --row-hover: rgba(0,0,0,0.02);
86
- --success: #16a34a;
87
- --warning: #d97706;
88
- --error: #dc2626;
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: 220px; background: var(--bg); border-right: 1px solid var(--border-subtle); display: flex; flex-direction: column; flex-shrink: 0; height: 100%; }
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-el); border: 1px solid var(--border-subtle); border-radius: 6px; display: flex; align-items: center; gap: 8px; }
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: 10px; padding: 7px 10px; margin: 1px 8px; border-radius: 6px; color: var(--text-muted); background: transparent; transition: all 0.1s ease; font-size: 13px; position: relative; width: calc(100% - 16px); text-align: left; }
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(--hover); color: var(--text); font-weight: 500; }
111
- .nav-item.active::before { content: ''; position: absolute; left: -8px; width: 2px; height: 14px; border-radius: 2px; background: var(--accent); }
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-subtle); border-radius: 6px; background: var(--bg-el); }
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">L</span><div style="flex: 1; min-width: 0;"><div class="workspace-name">Lossless GmbH</div><div class="workspace-plan">Cloud · Pro</div></div>${icon('chevronDown', 12)}</div>
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: 8px; font-size: 11px; color: var(--text-sec); font-family: 'Intel One Mono', ui-monospace;">${icon('github', 13)} signature-digital/core</div><div style="display: flex; gap: 12px; font-size: 11px; color: var(--text-muted);"><span>${icon('star', 11)} 8.2k</span><span>${icon('git', 11)} 248</span></div><div class="sparkline">${[3, 5, 2, 7, 4, 6, 8, 5, 9, 6, 4, 8, 7, 10].map((height) => html`<span style="height: ${height * 10}%"></span>`)}</div></div>
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">PK</span><div style="flex: 1; min-width: 0;"><div style="font-size: 12px; font-weight: 500;">Philipp K.</div><div style="font-family: 'Intel One Mono', ui-monospace; font-size: 10px; color: var(--text-muted); overflow: hidden; text-overflow: ellipsis;">philipp@lossless.com</div></div>${icon('more', 14)}</div>
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>api.signature.digital</span><span>eu-central-1</span><span>4 sigs queued</span><div style="flex: 1;"></div><span style="color: var(--accent);">Open Source · MIT</span><span>v0.42.1</span><span>${icon('git', 11)} main</span></div></main></div>`;
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
- }