@adia-ai/web-components 0.8.6 → 0.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +3 -3
  3. package/dist/host.min.css +1 -1
  4. package/dist/host.sheet.js +1 -1
  5. package/dist/theme-provider.min.js +2 -2
  6. package/dist/web-components.min.css +1 -1
  7. package/dist/web-components.min.js +1 -1
  8. package/dist/web-components.sheet.js +1 -1
  9. package/package.json +2 -1
  10. package/patterns/access-requests/access-requests.examples.html +132 -0
  11. package/patterns/access-requests/access-requests.html +60 -0
  12. package/patterns/admin-keys-and-export/admin-keys-and-export.examples.html +236 -0
  13. package/patterns/admin-keys-and-export/admin-keys-and-export.html +64 -0
  14. package/patterns/admin-shell/admin-shell.examples.html +327 -0
  15. package/patterns/admin-shell/admin-shell.html +44 -0
  16. package/patterns/agent-cost/agent-cost.examples.html +111 -0
  17. package/patterns/agent-cost/agent-cost.html +62 -0
  18. package/patterns/agent-memory/agent-memory.examples.html +155 -0
  19. package/patterns/agent-memory/agent-memory.html +64 -0
  20. package/patterns/agent-prompt-library/agent-prompt-library.examples.html +181 -0
  21. package/patterns/agent-prompt-library/agent-prompt-library.html +64 -0
  22. package/patterns/agent-tool-call/agent-tool-call.examples.html +123 -0
  23. package/patterns/agent-tool-call/agent-tool-call.html +60 -0
  24. package/patterns/alert-dialog/alert-dialog.examples.html +105 -0
  25. package/patterns/alert-dialog/alert-dialog.html +57 -0
  26. package/patterns/app-nav/app-nav.examples.html +421 -0
  27. package/patterns/app-nav/app-nav.html +50 -0
  28. package/patterns/approvals/approvals.examples.html +131 -0
  29. package/patterns/approvals/approvals.html +58 -0
  30. package/patterns/audit-log/audit-log.examples.html +74 -0
  31. package/patterns/audit-log/audit-log.examples.js +60 -0
  32. package/patterns/audit-log/audit-log.html +63 -0
  33. package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.html +89 -0
  34. package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.js +69 -0
  35. package/patterns/bulk-action-toolbar/bulk-action-toolbar.html +62 -0
  36. package/patterns/changelog-feed/changelog-feed.examples.html +151 -0
  37. package/patterns/changelog-feed/changelog-feed.html +57 -0
  38. package/patterns/chart-in-card/chart-in-card.examples.html +193 -0
  39. package/patterns/chart-in-card/chart-in-card.examples.js +46 -0
  40. package/patterns/chart-in-card/chart-in-card.html +66 -0
  41. package/patterns/chat-shell/chat-shell.examples.html +129 -0
  42. package/patterns/chat-shell/chat-shell.html +46 -0
  43. package/patterns/comments-and-collaboration/comments-and-collaboration.examples.html +241 -0
  44. package/patterns/comments-and-collaboration/comments-and-collaboration.html +66 -0
  45. package/patterns/component-tokens/component-tokens.examples.html +483 -0
  46. package/patterns/component-tokens/component-tokens.html +42 -0
  47. package/patterns/conversion-funnel/conversion-funnel.examples.html +158 -0
  48. package/patterns/conversion-funnel/conversion-funnel.examples.js +4 -0
  49. package/patterns/conversion-funnel/conversion-funnel.html +64 -0
  50. package/patterns/data-tables-inline-edit-and-tree/data-tables-inline-edit-and-tree.examples.html +196 -0
  51. package/patterns/data-tables-inline-edit-and-tree/data-tables-inline-edit-and-tree.html +58 -0
  52. package/patterns/diff-review/diff-review.examples.html +147 -0
  53. package/patterns/diff-review/diff-review.html +56 -0
  54. package/patterns/editor-shell/editor-shell.examples.html +139 -0
  55. package/patterns/editor-shell/editor-shell.html +62 -0
  56. package/patterns/export-flow/export-flow.examples.html +152 -0
  57. package/patterns/export-flow/export-flow.examples.js +37 -0
  58. package/patterns/export-flow/export-flow.html +65 -0
  59. package/patterns/filter-bar/filter-bar.examples.html +116 -0
  60. package/patterns/filter-bar/filter-bar.examples.js +23 -0
  61. package/patterns/filter-bar/filter-bar.html +70 -0
  62. package/patterns/form-drawer/form-drawer.examples.html +210 -0
  63. package/patterns/form-drawer/form-drawer.html +64 -0
  64. package/patterns/form-system/form-system.examples.html +383 -0
  65. package/patterns/form-system/form-system.html +48 -0
  66. package/patterns/forms-conditional-and-autocomplete/forms-conditional-and-autocomplete.examples.html +189 -0
  67. package/patterns/forms-conditional-and-autocomplete/forms-conditional-and-autocomplete.html +64 -0
  68. package/patterns/inline-dialog/inline-dialog.examples.html +143 -0
  69. package/patterns/inline-dialog/inline-dialog.html +59 -0
  70. package/patterns/kanban-board/kanban-board.examples.html +224 -0
  71. package/patterns/kanban-board/kanban-board.html +58 -0
  72. package/patterns/layout/layout.examples.html +365 -0
  73. package/patterns/layout/layout.html +54 -0
  74. package/patterns/marketing-engagement/marketing-engagement.examples.html +280 -0
  75. package/patterns/marketing-engagement/marketing-engagement.html +64 -0
  76. package/patterns/notifications-bell-and-digest/notifications-bell-and-digest.examples.html +213 -0
  77. package/patterns/notifications-bell-and-digest/notifications-bell-and-digest.html +58 -0
  78. package/patterns/overview/overview.examples.html +119 -0
  79. package/patterns/overview/overview.html +42 -0
  80. package/patterns/permissions-matrix/permissions-matrix.examples.html +91 -0
  81. package/patterns/permissions-matrix/permissions-matrix.examples.js +28 -0
  82. package/patterns/permissions-matrix/permissions-matrix.html +56 -0
  83. package/patterns/permissions-role-picker/permissions-role-picker.examples.html +81 -0
  84. package/patterns/permissions-role-picker/permissions-role-picker.html +56 -0
  85. package/patterns/permissions-sharing/permissions-sharing.examples.html +175 -0
  86. package/patterns/permissions-sharing/permissions-sharing.html +66 -0
  87. package/patterns/profile-public-and-verification/profile-public-and-verification.examples.html +227 -0
  88. package/patterns/profile-public-and-verification/profile-public-and-verification.html +70 -0
  89. package/patterns/record-detail-drawer/record-detail-drawer.examples.html +164 -0
  90. package/patterns/record-detail-drawer/record-detail-drawer.html +64 -0
  91. package/patterns/responsive-shell-sidebar/README.md +37 -0
  92. package/patterns/responsive-shell-sidebar/responsive-shell-sidebar.css +39 -0
  93. package/patterns/responsive-shell-sidebar/responsive-shell-sidebar.examples.html +208 -0
  94. package/patterns/responsive-shell-sidebar/responsive-shell-sidebar.html +47 -0
  95. package/patterns/retention-cohort/retention-cohort.examples.html +149 -0
  96. package/patterns/retention-cohort/retention-cohort.examples.js +37 -0
  97. package/patterns/retention-cohort/retention-cohort.html +62 -0
  98. package/patterns/search-discovery/search-discovery.examples.html +263 -0
  99. package/patterns/search-discovery/search-discovery.html +58 -0
  100. package/patterns/system-banners/system-banners.examples.html +150 -0
  101. package/patterns/system-banners/system-banners.html +52 -0
  102. package/patterns/timezone-selector/timezone-selector.examples.html +82 -0
  103. package/patterns/timezone-selector/timezone-selector.examples.js +72 -0
  104. package/patterns/timezone-selector/timezone-selector.html +57 -0
  105. package/patterns/wizard-drawer/wizard-drawer.examples.html +144 -0
  106. package/patterns/wizard-drawer/wizard-drawer.examples.js +33 -0
  107. package/patterns/wizard-drawer/wizard-drawer.html +72 -0
  108. package/styles/type/roles.css +8 -8
@@ -0,0 +1,175 @@
1
+ <header>
2
+ <div>
3
+ <h1>Permissions Sharing</h1>
4
+ <div data-actions>
5
+ <tag-ui size="sm">option-card-ui</tag-ui> <tag-ui size="sm">search-ui</tag-ui> <tag-ui size="sm">select-ui</tag-ui> <tag-ui size="sm">description-list-ui</tag-ui> <tag-ui size="sm">button-ui</tag-ui>
6
+ </div>
7
+ </div>
8
+ <p>Surfaces for sharing a resource (doc, dashboard, project) with people outside its default audience. Three shapes — visibility scope picker (private / link / org / public), generated share link with expiry, and add-people autocomplete with per-person role.</p>
9
+ </header>
10
+
11
+ <section data-section data-property="when-to-use">
12
+ <h2 variant="section">When to use</h2>
13
+ <p data-note>
14
+ Whenever a user wants to extend a resource's audience past its
15
+ default (workspace-only). The three surfaces compose into one
16
+ "Share" dialog: scope picker as the headline decision; link or
17
+ people surfaces depending on which scope the user chose. Don't
18
+ show all three at once — that asks the user to pick a primitive
19
+ instead of an outcome.
20
+ </p>
21
+ </section>
22
+
23
+ <section data-section data-property="scopes">
24
+ <h2 variant="section">Visibility scope picker</h2>
25
+ <p data-note>Four scopes as <code>option-card-ui</code> in a stacked radio group: Private, Link, Organization, Public. Each shows the audience and the action the user takes after picking.</p>
26
+ <div data-artifact-container>
27
+ <div data-artifact-item data-artifact-label="visibility scope picker">
28
+ <field-ui data-chunk="permissions-sharing-scopes" label="Who can access this dashboard?">
29
+ <col-ui gap="2">
30
+ <option-card-ui name="scope" value="private" heading="Private" description="Only people you've added explicitly." icon="lock" checked></option-card-ui>
31
+ <option-card-ui name="scope" value="link" heading="Anyone with the link" description="No sign-in required. Link can be revoked anytime." icon="link"></option-card-ui>
32
+ <option-card-ui name="scope" value="org" heading="Anyone in your workspace" description="Members of acme.com can find and open it." icon="users"></option-card-ui>
33
+ <option-card-ui name="scope" value="public" description="Discoverable via search. Use with care." icon="globe">
34
+ <span slot="heading">Public on the web <tag-ui variant="warning" size="sm">Indexable</tag-ui></span>
35
+ </option-card-ui>
36
+ </col-ui>
37
+ </field-ui>
38
+ </div>
39
+ </div>
40
+ </section>
41
+
42
+ <section data-section data-property="share-link">
43
+ <h2 variant="section">Share link with expiry</h2>
44
+ <p data-note>Surfaces when the user picks Link or Public scope. Generated URL with copy button; <code>select-ui</code> for expiry; revoke button as a danger-tone secondary action.</p>
45
+ <div data-artifact-container>
46
+ <div data-artifact-item data-artifact-label="share link with expiry">
47
+ <card-ui data-chunk="permissions-share-link" style="max-width: 560px;">
48
+ <header>
49
+ <span slot="heading" variant="section">Share link</span>
50
+ <tag-ui slot="action" variant="accent" size="sm">Anyone with the link</tag-ui>
51
+ </header>
52
+ <section>
53
+ <col-ui gap="3">
54
+ <row-ui gap="2" align="center">
55
+ <input-ui readonly value="https://acme.app/d/8421-revenue-q2" style="flex: 1;"></input-ui>
56
+ <button-ui text="Copy" variant="primary" icon-leading="copy"></button-ui>
57
+ </row-ui>
58
+ <row-ui gap="3" align="center">
59
+ <field-ui label="Expires" inline>
60
+ <select-ui value="7d" size="sm" style="min-width: 140px;">
61
+ <option value="never">Never</option>
62
+ <option value="24h">24 hours</option>
63
+ <option value="7d" selected>7 days</option>
64
+ <option value="30d">30 days</option>
65
+ <option value="custom">Custom date…</option>
66
+ </select-ui>
67
+ </field-ui>
68
+ <field-ui label="Permission" inline>
69
+ <select-ui value="view" size="sm" style="min-width: 140px;">
70
+ <option value="view" selected>Can view</option>
71
+ <option value="comment">Can comment</option>
72
+ <option value="edit">Can edit</option>
73
+ </select-ui>
74
+ </field-ui>
75
+ </row-ui>
76
+ <description-list-ui>
77
+ <dt>Created</dt>
78
+ <dd>Apr 22 · by Kim Granlund</dd>
79
+ <dt>Used</dt>
80
+ <dd>14 opens · last 2 hours ago</dd>
81
+ </description-list-ui>
82
+ </col-ui>
83
+ </section>
84
+ <footer divider>
85
+ <button-ui slot="action" text="Revoke link" variant="ghost" color="danger" size="sm" icon-leading="x"></button-ui>
86
+ </footer>
87
+ </card-ui>
88
+ </div>
89
+ </div>
90
+ </section>
91
+
92
+ <section data-section data-property="people">
93
+ <h2 variant="section">Add people with role</h2>
94
+ <p data-note>Surfaces in the Private and Org scopes. Autocomplete <code>search-ui</code> for people; per-row <code>select-ui</code> for the access role; existing-shares list below the input.</p>
95
+ <div data-artifact-container>
96
+ <div data-artifact-item data-artifact-label="add people share">
97
+ <card-ui data-chunk="permissions-share-people" style="max-width: 560px;">
98
+ <header>
99
+ <span slot="heading" variant="section">Share with people</span>
100
+ </header>
101
+ <section>
102
+ <col-ui gap="3">
103
+ <row-ui gap="2" align="center">
104
+ <search-ui size="sm" placeholder="Add by name or email" style="flex: 1;"></search-ui>
105
+ <select-ui value="view" size="sm" style="min-width: 130px;">
106
+ <option value="view" selected>Can view</option>
107
+ <option value="comment">Can comment</option>
108
+ <option value="edit">Can edit</option>
109
+ </select-ui>
110
+ <button-ui text="Invite" variant="primary" size="sm"></button-ui>
111
+ </row-ui>
112
+ <col-ui gap="2">
113
+ <row-ui gap="3" align="center">
114
+ <avatar-ui size="sm" text="Kim Granlund"></avatar-ui>
115
+ <col-ui gap="0" grow>
116
+ <text-ui strong>Kim Granlund</text-ui>
117
+ <text-ui color="subtle" size="sm">kim@example.com</text-ui>
118
+ </col-ui>
119
+ <tag-ui size="sm">Owner</tag-ui>
120
+ </row-ui>
121
+ <row-ui gap="3" align="center">
122
+ <avatar-ui size="sm" text="Avery Chen"></avatar-ui>
123
+ <col-ui gap="0" grow>
124
+ <text-ui strong>Avery Chen</text-ui>
125
+ <text-ui color="subtle" size="sm">avery@example.com</text-ui>
126
+ </col-ui>
127
+ <select-ui value="edit" size="sm" style="min-width: 130px;">
128
+ <option value="view">Can view</option>
129
+ <option value="comment">Can comment</option>
130
+ <option value="edit" selected>Can edit</option>
131
+ <option value="remove">Remove access</option>
132
+ </select-ui>
133
+ </row-ui>
134
+ <row-ui gap="3" align="center">
135
+ <avatar-ui size="sm" text="Jordan Park"></avatar-ui>
136
+ <col-ui gap="0" grow>
137
+ <text-ui strong>Jordan Park</text-ui>
138
+ <text-ui color="subtle" size="sm">jordan@example.com</text-ui>
139
+ </col-ui>
140
+ <select-ui value="comment" size="sm" style="min-width: 130px;">
141
+ <option value="view">Can view</option>
142
+ <option value="comment" selected>Can comment</option>
143
+ <option value="edit">Can edit</option>
144
+ <option value="remove">Remove access</option>
145
+ </select-ui>
146
+ </row-ui>
147
+ </col-ui>
148
+ </col-ui>
149
+ </section>
150
+ </card-ui>
151
+ </div>
152
+ </div>
153
+ </section>
154
+
155
+ <section data-section data-property="composition">
156
+ <h2 variant="section">Composition rules</h2>
157
+ <ul>
158
+ <li><strong>Scope picker drives the surface</strong> — pick scope, then surface the matching control (link UI for Link/Public, people UI for Private/Org). Don't show all three at once.</li>
159
+ <li><strong>Default to Private</strong> — every share dialog starts at the most restrictive scope. Public is a deliberate decision, never an accident.</li>
160
+ <li><strong>Public scope carries an "Indexable" warning tag</strong> — search engines can find it. Make this visible at the picker, not buried in a tooltip.</li>
161
+ <li><strong>Link shares show the open count</strong> — telling users "14 opens · 2 hours ago" prompts them to revoke when activity surprises them.</li>
162
+ <li><strong>Existing shares list always sorts owner first</strong> — the rest in invite-time order. Don't sort by role; users can't predict where their own row will be.</li>
163
+ <li><strong>Remove is a select option, not a separate button</strong> — keeps the row tidy and uses the same control surface for change-role and remove.</li>
164
+ </ul>
165
+ </section>
166
+
167
+ <section data-section data-property="cross-references">
168
+ <h2 variant="section">See also</h2>
169
+ <ul>
170
+ <li><a href="/site/components/option-card">option-card-ui</a> — scope picker primitive.</li>
171
+ <li><a href="/site/components/search">search-ui</a> — people autocomplete.</li>
172
+ <li><a href="/site/patterns/permissions-role-picker">permissions-role-picker</a> — sibling for role assignment.</li>
173
+ <li><a href="/site/patterns/permissions-matrix">permissions-matrix</a> — sibling for full RBAC grid.</li>
174
+ </ul>
175
+ </section>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" theme="auto">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Permissions Sharing (pattern) — AdiaUI</title>
7
+
8
+ <!-- Token base -->
9
+ <link rel="stylesheet" href="../../styles/resets.css">
10
+ <link rel="stylesheet" href="../../styles/tokens.css">
11
+
12
+ <!-- Component CSS — primitives this pattern composes -->
13
+ <link rel="stylesheet" href="../../components/avatar/avatar.css">
14
+ <link rel="stylesheet" href="../../components/button/button.css">
15
+ <link rel="stylesheet" href="../../components/card/card.css">
16
+ <link rel="stylesheet" href="../../components/col/col.css">
17
+ <link rel="stylesheet" href="../../components/description-list/description-list.css">
18
+ <link rel="stylesheet" href="../../components/field/field.css">
19
+ <link rel="stylesheet" href="../../components/input/input.css">
20
+ <link rel="stylesheet" href="../../components/option-card/option-card.css">
21
+ <link rel="stylesheet" href="../../components/row/row.css">
22
+ <link rel="stylesheet" href="../../components/search/search.css">
23
+ <link rel="stylesheet" href="../../components/select/select.css">
24
+ <link rel="stylesheet" href="../../components/tag/tag.css">
25
+ <link rel="stylesheet" href="../../components/text/text.css">
26
+
27
+ <!-- Component JS -->
28
+ <script type="module" src="../../components/avatar/avatar.js"></script>
29
+ <script type="module" src="../../components/button/button.js"></script>
30
+ <script type="module" src="../../components/card/card.js"></script>
31
+ <script type="module" src="../../components/col/col.js"></script>
32
+ <script type="module" src="../../components/description-list/description-list.js"></script>
33
+ <script type="module" src="../../components/field/field.js"></script>
34
+ <script type="module" src="../../components/input/input.js"></script>
35
+ <script type="module" src="../../components/option-card/option-card.js"></script>
36
+ <script type="module" src="../../components/row/row.js"></script>
37
+ <script type="module" src="../../components/search/search.js"></script>
38
+ <script type="module" src="../../components/select/select.js"></script>
39
+ <script type="module" src="../../components/tag/tag.js"></script>
40
+ <script type="module" src="../../components/text/text.js"></script>
41
+
42
+ <style>
43
+ :where(html, body) { margin: 0; min-height: 100vh; background: var(--md-sys-color-neutral-background); color: var(--md-sys-color-neutral-on-surface); font-family: var(--a-font-family); }
44
+ main { max-width: 960px; margin-inline: auto; padding: var(--a-space-6) var(--a-space-5); }
45
+ </style>
46
+ </head>
47
+ <body>
48
+
49
+ <main id="demo-root">
50
+ <p>Loading examples…</p>
51
+ </main>
52
+
53
+ <script type="module">
54
+ const root = document.getElementById('demo-root');
55
+ try {
56
+ const res = await fetch('./permissions-sharing.examples.html');
57
+ if (!res.ok) throw new Error(`fetch failed (${res.status})`);
58
+ root.innerHTML = await res.text();
59
+ } catch (err) {
60
+ root.innerHTML = `<p style="color:var(--a-danger-strong);">Failed to load permissions-sharing.examples.html — ${err.message}</p>`;
61
+ console.error('[permissions-sharing.html]', err);
62
+ }
63
+ </script>
64
+
65
+ </body>
66
+ </html>
@@ -0,0 +1,227 @@
1
+ <header>
2
+ <div>
3
+ <h1>Public profile &amp; identity verification</h1>
4
+ <div data-actions>
5
+ <tag-ui size="sm">card-ui</tag-ui> <tag-ui size="sm">avatar-ui</tag-ui> <tag-ui size="sm">stat-ui</tag-ui> <tag-ui size="sm">upload-ui</tag-ui> <tag-ui size="sm">stepper-ui</tag-ui> <tag-ui size="sm">tag-ui</tag-ui>
6
+ </div>
7
+ </div>
8
+ <p>Two adjacent profile surfaces: the externally-shareable public page (16d) and the KYC/identity-verification flow (16e). Both compose card-ui shells around primitives — no new components needed.</p>
9
+ </header>
10
+
11
+ <section data-section data-property="when-to-use">
12
+ <h2 variant="section">When to use</h2>
13
+ <p data-note>
14
+ Public profile: any place outside the workspace can link to a
15
+ user — author bylines on shared docs, reviewer attribution,
16
+ public team pages, contributor lists. Distinct from 16a
17
+ (workspace-internal profile card) and 16b (member detail in
18
+ settings).
19
+ Identity verification: regulated flows where the system needs
20
+ legal-name + government ID — payouts, paid plans in some
21
+ jurisdictions, agent-driven actions over a financial threshold.
22
+ </p>
23
+ </section>
24
+
25
+ <section data-section data-property="public-profile">
26
+ <h2 variant="section">Public profile</h2>
27
+ <p data-note>Shareable user/team page. Header: large avatar, display name, optional verified badge, role/title, location, joined date. Body: bio, social links, stats grid (`stat-ui` × N), recent public work. The verified badge means identity-verified (16e), not "important user".</p>
28
+ <div data-artifact-container>
29
+ <div data-artifact-item data-artifact-label="public profile">
30
+ <card-ui data-chunk="profile-public" style="max-width: 720px;">
31
+ <section>
32
+ <col-ui gap="4">
33
+ <row-ui gap="4" align="start">
34
+ <avatar-ui size="xl" text="Kim Granlund"></avatar-ui>
35
+ <col-ui gap="1" grow>
36
+ <row-ui gap="2" align="center">
37
+ <text-ui strong size="lg">Kim Granlund</text-ui>
38
+ <tag-ui size="sm" variant="primary" icon-leading="seal-check">Verified</tag-ui>
39
+ </row-ui>
40
+ <text-ui color="subtle">Founder · AdiaUI · Reykjavík, IS</text-ui>
41
+ <text-ui>Building the AdiaUI web-components library and the A2UI generative-UI runtime. Previously at Construct, before that at Modular.</text-ui>
42
+ <row-ui gap="2" style="margin-top: 0.5rem;">
43
+ <button-ui text="Follow" variant="primary" size="sm"></button-ui>
44
+ <button-ui text="Message" variant="ghost" size="sm" icon-leading="chat-circle"></button-ui>
45
+ <button-ui icon="dots-three" variant="ghost" size="sm" aria-label="More"></button-ui>
46
+ </row-ui>
47
+ </col-ui>
48
+ </row-ui>
49
+ <grid-ui columns="3" gap="3">
50
+ <stat-ui label="Followers" value="1,284"></stat-ui>
51
+ <stat-ui label="Following" value="312"></stat-ui>
52
+ <stat-ui label="Joined" value="Apr 2024"></stat-ui>
53
+ </grid-ui>
54
+ <col-ui gap="2">
55
+ <text-ui strong size="sm" color="subtle">Recent public work</text-ui>
56
+ <list-ui divider contained>
57
+ <list-item-ui>
58
+ <col-ui gap="0">
59
+ <text-ui strong>AdiaUI v0.0.26 — Safari @scope sweep</text-ui>
60
+ <text-ui color="subtle" size="sm">Released 2 days ago · 47 components updated</text-ui>
61
+ </col-ui>
62
+ </list-item-ui>
63
+ <list-item-ui>
64
+ <col-ui gap="0">
65
+ <text-ui strong>A2UI generator — chunk corpus expansion</text-ui>
66
+ <text-ui color="subtle" size="sm">748 chunks across 36 domains · open-source</text-ui>
67
+ </col-ui>
68
+ </list-item-ui>
69
+ <list-item-ui>
70
+ <col-ui gap="0">
71
+ <text-ui strong>OKLCH ramps for design systems</text-ui>
72
+ <text-ui color="subtle" size="sm">Talk · 2026-03 · 18 min</text-ui>
73
+ </col-ui>
74
+ </list-item-ui>
75
+ </list-ui>
76
+ </col-ui>
77
+ </col-ui>
78
+ </section>
79
+ </card-ui>
80
+ </div>
81
+ </div>
82
+ </section>
83
+
84
+ <section data-section data-property="verification-stepper">
85
+ <h2 variant="section">Identity verification — flow stepper</h2>
86
+ <p data-note>The progress indicator across the verification flow. Steps: Personal info → Document upload → Selfie → Review. Uses <code>stepper-ui</code> with completed states. Each step is a separate page (or drawer step), not a single long form.</p>
87
+ <div data-artifact-container>
88
+ <div data-artifact-item data-artifact-label="verification stepper">
89
+ <card-ui data-chunk="verification-stepper" style="max-width: 720px;">
90
+ <header>
91
+ <span slot="heading" variant="section">Verify your identity</span>
92
+ <text-ui slot="description" color="subtle">Required for payouts and agent-driven transactions over $1,000</text-ui>
93
+ </header>
94
+ <section>
95
+ <stepper-ui orientation="horizontal" step="2">
96
+ <stepper-item-ui text="Personal info" description="Legal name, date of birth"></stepper-item-ui>
97
+ <stepper-item-ui text="Document" description="Government-issued ID"></stepper-item-ui>
98
+ <stepper-item-ui text="Selfie" description="Match the photo on your ID"></stepper-item-ui>
99
+ <stepper-item-ui text="Review" description="Usually within 1 business day"></stepper-item-ui>
100
+ </stepper-ui>
101
+ </section>
102
+ </card-ui>
103
+ </div>
104
+ </div>
105
+ </section>
106
+
107
+ <section data-section data-property="document-upload">
108
+ <h2 variant="section">Document upload step</h2>
109
+ <p data-note>The document-capture step. <code>upload-ui</code> with `accept="image/*,.pdf"`, hint about supported formats, and security copy explaining what happens to the file. Front + back uploads for ID cards.</p>
110
+ <div data-artifact-container>
111
+ <div data-artifact-item data-artifact-label="document upload">
112
+ <card-ui data-chunk="verification-document-upload" style="max-width: 640px;">
113
+ <header>
114
+ <span slot="heading" variant="section">Upload your government-issued ID</span>
115
+ <text-ui slot="description" color="subtle">Passport, driver's license, or national ID card</text-ui>
116
+ </header>
117
+ <section>
118
+ <col-ui gap="3">
119
+ <field-ui label="Document type" required>
120
+ <select-ui name="doc_type">
121
+ <option value="passport">Passport</option>
122
+ <option value="license" selected>Driver's license</option>
123
+ <option value="national_id">National ID card</option>
124
+ </select-ui>
125
+ </field-ui>
126
+ <upload-ui label="Front of license" accept="image/*,.pdf" hint="JPEG, PNG, or PDF · max 10MB" required></upload-ui>
127
+ <upload-ui label="Back of license" accept="image/*,.pdf" hint="JPEG, PNG, or PDF · max 10MB" required></upload-ui>
128
+ <alert-ui variant="info" icon="lock">
129
+ <col-ui slot="content" gap="0-5">
130
+ <text-ui strong>Your ID is encrypted in transit and at rest.</text-ui>
131
+ <text-ui>We use it once to verify your identity, then hold it for 30 days for compliance before deletion.</text-ui>
132
+ </col-ui>
133
+ </alert-ui>
134
+ </col-ui>
135
+ </section>
136
+ <footer divider>
137
+ <button-ui slot="action" text="Back" variant="ghost"></button-ui>
138
+ <button-ui slot="action" text="Continue" variant="primary"></button-ui>
139
+ </footer>
140
+ </card-ui>
141
+ </div>
142
+ </div>
143
+ </section>
144
+
145
+ <section data-section data-property="verification-status">
146
+ <h2 variant="section">Verification status states</h2>
147
+ <p data-note>The post-submission states the user sees while the system reviews. Three flavors: pending review (clock), verified (seal-check primary), rejected (warning). Each is a card-ui with status alert + next-action.</p>
148
+ <div data-artifact-container>
149
+ <div data-artifact-item data-artifact-label="verification pending">
150
+ <card-ui data-chunk="verification-status" style="max-width: 480px;">
151
+ <header>
152
+ <span slot="heading" variant="section">Verification submitted</span>
153
+ </header>
154
+ <section>
155
+ <alert-ui variant="info" icon="clock-counter-clockwise">
156
+ <col-ui slot="content" gap="0-5">
157
+ <text-ui strong>Under review — usually within 1 business day.</text-ui>
158
+ <text-ui>We'll email you when your identity is verified or if we need more info.</text-ui>
159
+ </col-ui>
160
+ </alert-ui>
161
+ </section>
162
+ </card-ui>
163
+ </div>
164
+ <div data-artifact-item data-artifact-label="verification verified">
165
+ <card-ui style="max-width: 480px;">
166
+ <header>
167
+ <span slot="heading" variant="section">
168
+ You're verified
169
+ <tag-ui size="sm" variant="primary" icon-leading="seal-check">Verified</tag-ui>
170
+ </span>
171
+ </header>
172
+ <section>
173
+ <alert-ui variant="success" icon="check-circle">
174
+ <col-ui slot="content" gap="0-5">
175
+ <text-ui strong>Identity confirmed.</text-ui>
176
+ <text-ui>Payouts and high-value actions are now unlocked.</text-ui>
177
+ </col-ui>
178
+ </alert-ui>
179
+ </section>
180
+ </card-ui>
181
+ </div>
182
+ <div data-artifact-item data-artifact-label="verification rejected">
183
+ <card-ui style="max-width: 480px;">
184
+ <header>
185
+ <span slot="heading" variant="section">We couldn't verify your ID</span>
186
+ </header>
187
+ <section>
188
+ <alert-ui variant="warning" icon="warning">
189
+ <col-ui slot="content" gap="0-5">
190
+ <text-ui strong>The document image was unreadable.</text-ui>
191
+ <text-ui>Try again with a clearer photo — make sure all corners are visible and there's no glare.</text-ui>
192
+ </col-ui>
193
+ </alert-ui>
194
+ </section>
195
+ <footer divider>
196
+ <button-ui slot="action" text="Try again" variant="primary" icon-leading="arrow-counter-clockwise"></button-ui>
197
+ <button-ui slot="action" text="Contact support" variant="ghost"></button-ui>
198
+ </footer>
199
+ </card-ui>
200
+ </div>
201
+ </div>
202
+ </section>
203
+
204
+ <section data-section data-property="composition">
205
+ <h2 variant="section">Composition rules</h2>
206
+ <ul>
207
+ <li><strong>Verified badge means identity-verified, not "important user"</strong> — twitter-style "blue check" semantic creep is a smell. Reserve <code>seal-check</code> + primary tag for the KYC outcome of 16e; use other tags for role / staff / pro / etc.</li>
208
+ <li><strong>Public profile shows public work only</strong> — drafts, internal docs, private repos must not surface even if the viewer happens to have access. The page is the user's public face; access-aware filtering happens upstream.</li>
209
+ <li><strong>Verification is multi-step, not multi-section</strong> — one page per step. A long single form bounces users on validation; per-step pages let you reset focus and progress.</li>
210
+ <li><strong>Document upload front + back</strong> — ID cards have two sides; passports have one. Make this an explicit pair (or single) field, not a "Add another file" affordance.</li>
211
+ <li><strong>Encryption + retention copy is mandatory</strong> — users handing over a passport need to read what happens to it. The compliance rationale ("30 days for audit, then deleted") makes the system look serious, not threatening.</li>
212
+ <li><strong>Status pages are mandatory after submission</strong> — verification can take hours or days. The user must see "we got it, we're processing" or they'll re-submit. Pending → verified | rejected is a 3-state machine; cover all three.</li>
213
+ <li><strong>Rejection copy must be actionable</strong> — "We couldn't verify your ID" is half-useful; "the document image was unreadable, try again with a clearer photo" tells the user what to do.</li>
214
+ </ul>
215
+ </section>
216
+
217
+ <section data-section data-property="cross-references">
218
+ <h2 variant="section">See also</h2>
219
+ <ul>
220
+ <li><a href="/site/components/avatar">avatar-ui</a> · <a href="/site/components/stat">stat-ui</a> — public profile primitives.</li>
221
+ <li><a href="/site/components/upload">upload-ui</a> — document capture.</li>
222
+ <li><a href="/site/components/stepper">stepper-ui</a> — verification flow indicator.</li>
223
+ <li><a href="/site/components/tag">tag-ui</a> — verified badge.</li>
224
+ <li><a href="/site/patterns/permissions-sharing">permissions-sharing</a> — adjacent (the "share publicly" surface).</li>
225
+ <li><a href="/site/patterns/wizard-drawer">wizard-drawer</a> — alternative host for the verification flow.</li>
226
+ </ul>
227
+ </section>
@@ -0,0 +1,70 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" theme="auto">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Public profile &amp; identity verification (pattern) — AdiaUI</title>
7
+
8
+ <!-- Token base -->
9
+ <link rel="stylesheet" href="../../styles/resets.css">
10
+ <link rel="stylesheet" href="../../styles/tokens.css">
11
+
12
+ <!-- Component CSS — primitives this pattern composes -->
13
+ <link rel="stylesheet" href="../../components/alert/alert.css">
14
+ <link rel="stylesheet" href="../../components/avatar/avatar.css">
15
+ <link rel="stylesheet" href="../../components/button/button.css">
16
+ <link rel="stylesheet" href="../../components/card/card.css">
17
+ <link rel="stylesheet" href="../../components/col/col.css">
18
+ <link rel="stylesheet" href="../../components/field/field.css">
19
+ <link rel="stylesheet" href="../../components/grid/grid.css">
20
+ <link rel="stylesheet" href="../../components/list/list.css">
21
+ <link rel="stylesheet" href="../../components/row/row.css">
22
+ <link rel="stylesheet" href="../../components/select/select.css">
23
+ <link rel="stylesheet" href="../../components/stat/stat.css">
24
+ <link rel="stylesheet" href="../../components/stepper/stepper.css">
25
+ <link rel="stylesheet" href="../../components/tag/tag.css">
26
+ <link rel="stylesheet" href="../../components/text/text.css">
27
+ <link rel="stylesheet" href="../../components/upload/upload.css">
28
+
29
+ <!-- Component JS -->
30
+ <script type="module" src="../../components/alert/alert.js"></script>
31
+ <script type="module" src="../../components/avatar/avatar.js"></script>
32
+ <script type="module" src="../../components/button/button.js"></script>
33
+ <script type="module" src="../../components/card/card.js"></script>
34
+ <script type="module" src="../../components/col/col.js"></script>
35
+ <script type="module" src="../../components/field/field.js"></script>
36
+ <script type="module" src="../../components/grid/grid.js"></script>
37
+ <script type="module" src="../../components/list/list.js"></script>
38
+ <script type="module" src="../../components/row/row.js"></script>
39
+ <script type="module" src="../../components/select/select.js"></script>
40
+ <script type="module" src="../../components/stat/stat.js"></script>
41
+ <script type="module" src="../../components/stepper/stepper.js"></script>
42
+ <script type="module" src="../../components/tag/tag.js"></script>
43
+ <script type="module" src="../../components/text/text.js"></script>
44
+ <script type="module" src="../../components/upload/upload.js"></script>
45
+
46
+ <style>
47
+ :where(html, body) { margin: 0; min-height: 100vh; background: var(--md-sys-color-neutral-background); color: var(--md-sys-color-neutral-on-surface); font-family: var(--a-font-family); }
48
+ main { max-width: 960px; margin-inline: auto; padding: var(--a-space-6) var(--a-space-5); }
49
+ </style>
50
+ </head>
51
+ <body>
52
+
53
+ <main id="demo-root">
54
+ <p>Loading examples…</p>
55
+ </main>
56
+
57
+ <script type="module">
58
+ const root = document.getElementById('demo-root');
59
+ try {
60
+ const res = await fetch('./profile-public-and-verification.examples.html');
61
+ if (!res.ok) throw new Error(`fetch failed (${res.status})`);
62
+ root.innerHTML = await res.text();
63
+ } catch (err) {
64
+ root.innerHTML = `<p style="color:var(--a-danger-strong);">Failed to load profile-public-and-verification.examples.html — ${err.message}</p>`;
65
+ console.error('[profile-public-and-verification.html]', err);
66
+ }
67
+ </script>
68
+
69
+ </body>
70
+ </html>