@adia-ai/web-modules 0.8.36 → 0.8.38

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 (90) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +4 -4
  3. package/agent-admin/admin-roster/admin-roster.js +1 -1
  4. package/agent-admin/admin-settings/admin-settings.js +1 -1
  5. package/agent-admin/agent-admin/agent-admin.js +1 -1
  6. package/billing/billing-overview/billing-overview.a2ui.json +281 -0
  7. package/billing/billing-overview/billing-overview.class.js +838 -0
  8. package/billing/billing-overview/billing-overview.css +223 -0
  9. package/billing/billing-overview/billing-overview.js +16 -0
  10. package/billing/billing-overview/billing-overview.yaml +441 -0
  11. package/billing/index.js +21 -0
  12. package/billing/invoice-detail/invoice-detail.a2ui.json +276 -0
  13. package/billing/invoice-detail/invoice-detail.class.js +711 -0
  14. package/billing/invoice-detail/invoice-detail.css +305 -0
  15. package/billing/invoice-detail/invoice-detail.js +16 -0
  16. package/billing/invoice-detail/invoice-detail.yaml +411 -0
  17. package/billing/invoice-history/invoice-history.a2ui.json +315 -0
  18. package/billing/invoice-history/invoice-history.class.js +672 -0
  19. package/billing/invoice-history/invoice-history.css +130 -0
  20. package/billing/invoice-history/invoice-history.js +16 -0
  21. package/billing/invoice-history/invoice-history.yaml +398 -0
  22. package/billing/payment-method-form/payment-method-form.a2ui.json +310 -0
  23. package/billing/payment-method-form/payment-method-form.class.js +886 -0
  24. package/billing/payment-method-form/payment-method-form.css +149 -0
  25. package/billing/payment-method-form/payment-method-form.js +16 -0
  26. package/billing/payment-method-form/payment-method-form.yaml +430 -0
  27. package/billing/payment-method-list/payment-method-list.a2ui.json +283 -0
  28. package/billing/payment-method-list/payment-method-list.class.js +705 -0
  29. package/billing/payment-method-list/payment-method-list.css +128 -0
  30. package/billing/payment-method-list/payment-method-list.js +16 -0
  31. package/billing/payment-method-list/payment-method-list.yaml +355 -0
  32. package/billing/plan-picker/plan-picker.a2ui.json +349 -0
  33. package/billing/plan-picker/plan-picker.class.js +635 -0
  34. package/billing/plan-picker/plan-picker.css +227 -0
  35. package/billing/plan-picker/plan-picker.js +16 -0
  36. package/billing/plan-picker/plan-picker.yaml +453 -0
  37. package/chat/README.md +2 -2
  38. package/chat/chat-composer/chat-composer.js +2 -2
  39. package/chat/chat-empty/chat-empty.js +2 -2
  40. package/chat/chat-shell/chat-shell.js +6 -6
  41. package/chat/chat-sidebar/chat-sidebar.js +2 -2
  42. package/chat/chat-surfaces/chat-surfaces.js +3 -3
  43. package/chat/chat-thread/chat-thread.js +2 -2
  44. package/dashboard/dashboard-layout/dashboard-layout.a2ui.json +254 -0
  45. package/dashboard/dashboard-layout/dashboard-layout.css +190 -0
  46. package/dashboard/dashboard-layout/dashboard-layout.js +289 -0
  47. package/dashboard/dashboard-layout/dashboard-layout.yaml +374 -0
  48. package/dashboard/date-range-selector/date-range-selector.a2ui.json +236 -0
  49. package/dashboard/date-range-selector/date-range-selector.css +84 -0
  50. package/dashboard/date-range-selector/date-range-selector.js +686 -0
  51. package/dashboard/date-range-selector/date-range-selector.yaml +358 -0
  52. package/dashboard/index.js +14 -0
  53. package/dist/chat/chat-shell.min.js +1 -1
  54. package/dist/everything.min.js +121 -102
  55. package/editor/editor-canvas/editor-canvas.js +2 -2
  56. package/editor/editor-shell/editor-shell.js +2 -2
  57. package/editor/editor-sidebar/editor-sidebar.js +2 -2
  58. package/editor/editor-toolbar/editor-toolbar.js +2 -2
  59. package/feedback/confirm-dialog/confirm-dialog.a2ui.json +206 -0
  60. package/feedback/confirm-dialog/confirm-dialog.css +157 -0
  61. package/feedback/confirm-dialog/confirm-dialog.js +383 -0
  62. package/feedback/confirm-dialog/confirm-dialog.yaml +297 -0
  63. package/feedback/index.js +10 -0
  64. package/form/form-popover/form-popover.js +1 -1
  65. package/generative/index.d.ts +1 -1
  66. package/generative/index.js +2 -2
  67. package/onboarding/index.js +1 -0
  68. package/onboarding/onboarding-checklist/onboarding-checklist.a2ui.json +263 -0
  69. package/onboarding/onboarding-checklist/onboarding-checklist.css +157 -0
  70. package/onboarding/onboarding-checklist/onboarding-checklist.js +428 -0
  71. package/onboarding/onboarding-checklist/onboarding-checklist.yaml +236 -0
  72. package/package.json +99 -6
  73. package/runtime/a2ui-root/a2ui-root.js +3 -3
  74. package/runtime/gen-root/gen-root.js +5 -5
  75. package/settings/index.js +12 -0
  76. package/settings/integrations-page/integrations-page.a2ui.json +274 -0
  77. package/settings/integrations-page/integrations-page.css +177 -0
  78. package/settings/integrations-page/integrations-page.d.ts +77 -0
  79. package/settings/integrations-page/integrations-page.js +413 -0
  80. package/settings/integrations-page/integrations-page.yaml +317 -0
  81. package/settings/notification-preferences/notification-preferences.a2ui.json +245 -0
  82. package/settings/notification-preferences/notification-preferences.css +204 -0
  83. package/settings/notification-preferences/notification-preferences.js +622 -0
  84. package/settings/notification-preferences/notification-preferences.yaml +358 -0
  85. package/shell/admin-command/admin-command.js +2 -2
  86. package/shell/admin-shell/admin-shell.js +2 -2
  87. package/shell/admin-sidebar/admin-sidebar.js +2 -2
  88. package/shell/embed-shell/embed-shell.js +3 -3
  89. package/simple/simple-shell/simple-shell.js +1 -1
  90. package/theme/theme-panel/theme-panel.js +2 -2
@@ -0,0 +1,358 @@
1
+ # Edit this file; run `npm run build:components` to regenerate a2ui.json.
2
+ $schema: ../../../../scripts/schemas/component.yaml.schema.json
3
+ name: UINotificationPreferences
4
+ tag: notification-preferences-ui
5
+ status: stable
6
+ component: NotificationPreferences
7
+ category: container
8
+ version: 1
9
+ description: |
10
+ Page-level Settings composite: a matrix of notification types (rows)
11
+ × delivery channels (columns: in-app, email, SMS) with a binary
12
+ <check-ui> in each cell and an optional <switch-ui> column-header
13
+ master toggle for bulk-flipping a channel across every row.
14
+
15
+ Form-bearing — the composite extends UIFormElement and serializes its
16
+ current preferences shape as JSON on `value`. Per first-principle #2
17
+ ("save is the consumer's job"), the composite does NOT mutate the
18
+ passed-in `preferences` array; it emits a typed `change` event per
19
+ cell toggle and a `bulk-toggle` event per column-header switch, and
20
+ exposes the staged JSON via the form value so a host <form> submit
21
+ carries it through ElementInternals.
22
+
23
+ Channels are columns; types are rows (the smaller-set / larger-set
24
+ invariant — channels are 3-5 in the wild, types are 10-50). Layout
25
+ renders as a semantic ARIA grid (`role="table"`/`row`/`cell`/
26
+ `rowheader`/`columnheader`) — NOT native `<table>` (per the HTML
27
+ parser strip rule, table-content tags would foster-parent out of a
28
+ custom-element subtree).
29
+
30
+ Spec: .claude/docs/specs/implementation-ready/SPEC-064-notification-preferences.md.
31
+
32
+ # Per ADR-0027 — composites do NOT auto-import the primitives they
33
+ # stamp in connected()/render(). The consumer (or this primitive's
34
+ # .html demo shell) must explicitly side-effect-import each one.
35
+ composes:
36
+ - check-ui
37
+ - switch-ui
38
+ - icon-ui
39
+ - text-ui
40
+ - empty-state-ui
41
+
42
+ props:
43
+ preferences:
44
+ description: |
45
+ Matrix data — one row per notification type. Each record carries
46
+ a stable `key`, a `label`, optional `description` (rendered under
47
+ the label), optional `group` (when `group-by="group"`), and a
48
+ `channels` map keyed by channel key with boolean values.
49
+ Example: {key:"mentions", label:"Mentions", channels:{"in-app":true,
50
+ email:false, sms:false}}. Empty array renders the empty state.
51
+ type: array
52
+ default: []
53
+ dynamic: true
54
+ required: true
55
+
56
+ channels:
57
+ description: |
58
+ Column definitions — one record per delivery channel. Each
59
+ carries a stable `key`, a `label` (the column header), and an
60
+ optional `icon` name (Phosphor — defaults to no icon when
61
+ absent). Example: [{key:"in-app", label:"In-app", icon:"chat-circle"},
62
+ {key:"email", label:"Email", icon:"envelope"}]. Empty array
63
+ renders nothing (the matrix needs at least one column).
64
+ type: array
65
+ default: []
66
+ dynamic: true
67
+ required: true
68
+
69
+ channelEnabled:
70
+ description: |
71
+ Map of channel-key → master-toggle boolean for the column-header
72
+ <switch-ui>. When omitted, master toggles default to `true` for
73
+ every channel. Independent of cell values — toggling the master
74
+ off does NOT auto-update the cells; the host receives a
75
+ `bulk-toggle` event and updates `preferences` itself.
76
+ type: object
77
+ default: {}
78
+ dynamic: true
79
+
80
+ loading:
81
+ description: |
82
+ Renders a skeleton matrix overlay. Cells become non-interactive
83
+ and dim while loading.
84
+ type: boolean
85
+ default: false
86
+ reflect: true
87
+
88
+ disabled:
89
+ description: All cells + master toggles become non-interactive.
90
+ type: boolean
91
+ default: false
92
+ reflect: true
93
+
94
+ group-by:
95
+ description: |
96
+ Row-grouping mode. `none` (default) renders all rows in one
97
+ block. `group` renders one section per unique `preferences[].group`
98
+ value with a header row above each section.
99
+ type: string
100
+ default: "none"
101
+ enum:
102
+ - none
103
+ - group
104
+ reflect: true
105
+
106
+ events:
107
+ change:
108
+ description: |
109
+ Fired when the user toggles a cell <check-ui>. Bubbles. The
110
+ composite emits this with the previous state — the host must
111
+ apply the new state to its own data and re-pass `preferences`
112
+ for the cell to visually update.
113
+ detail:
114
+ row:
115
+ type: string
116
+ description: The `key` of the notification type whose cell flipped.
117
+ channel:
118
+ type: string
119
+ description: The `key` of the channel column whose cell flipped.
120
+ enabled:
121
+ type: boolean
122
+ description: The new desired state (true = opted in).
123
+
124
+ bulk-toggle:
125
+ description: |
126
+ Fired when the user toggles a column-header <switch-ui>.
127
+ Bubbles. Mirrors `change` shape but for the column master —
128
+ host applies the bulk change to its own `preferences` data.
129
+ detail:
130
+ channel:
131
+ type: string
132
+ description: The `key` of the channel column whose master flipped.
133
+ enabled:
134
+ type: boolean
135
+ description: The new desired master state.
136
+
137
+ slots:
138
+ header:
139
+ description: |
140
+ Optional content above the matrix — e.g. a page title, intro
141
+ copy, or per-page save row. Falls back to nothing when empty.
142
+
143
+ footer:
144
+ description: |
145
+ Optional content below the matrix — e.g. a global Save Changes
146
+ button row or fine-print disclaimer. Falls back to nothing.
147
+
148
+ empty:
149
+ description: |
150
+ Custom empty-state copy shown when `preferences` is empty. Falls
151
+ back to a default <empty-state-ui> when not provided.
152
+
153
+ states:
154
+ - name: idle
155
+ description: Default — matrix rendered, ready for interaction.
156
+ - name: loading
157
+ description: Skeleton overlay while data loads.
158
+ attribute: loading
159
+ - name: disabled
160
+ description: All toggles non-interactive.
161
+ attribute: disabled
162
+ - name: empty
163
+ description: No notification types configured.
164
+ attribute: empty
165
+
166
+ traits: []
167
+
168
+ tokens:
169
+ --notification-preferences-bg:
170
+ description: Host background.
171
+ default: var(--a-bg)
172
+ --notification-preferences-row-bg:
173
+ description: Even-row zebra background.
174
+ default: var(--a-bg-muted)
175
+ --notification-preferences-px:
176
+ description: Host horizontal padding.
177
+ default: var(--a-space-5)
178
+ --notification-preferences-py:
179
+ description: Host vertical padding.
180
+ default: var(--a-space-5)
181
+ --notification-preferences-row-py:
182
+ description: Per-row vertical padding.
183
+ default: var(--a-space-3)
184
+ --notification-preferences-row-px:
185
+ description: Per-cell horizontal padding.
186
+ default: var(--a-space-3)
187
+ --notification-preferences-channel-width:
188
+ description: Minimum column width for each channel cell.
189
+ default: var(--a-space-9)
190
+ --notification-preferences-row-label-min:
191
+ description: Minimum row-label column width.
192
+ default: 12rem
193
+ --notification-preferences-border:
194
+ description: Row separator color.
195
+ default: var(--a-border-subtle)
196
+ --notification-preferences-radius:
197
+ description: Outer matrix container radius.
198
+ default: var(--a-radius-md)
199
+ --notification-preferences-group-fg:
200
+ description: Group-heading label color.
201
+ default: var(--a-fg-muted)
202
+
203
+ requiredIcons:
204
+ - bell
205
+ - envelope
206
+ - device-mobile
207
+ - chat-circle
208
+
209
+ a2ui:
210
+ rules:
211
+ - >-
212
+ NotificationPreferences.channels MUST be non-empty. A matrix with
213
+ zero columns renders nothing meaningful — author at least one
214
+ channel record.
215
+ - >-
216
+ NotificationPreferences.preferences[].channels keys MUST match the
217
+ channels[].key set. Mismatched keys silently render the cell as
218
+ `false` (off) — they do NOT raise an error, but the user can never
219
+ toggle them into existence either.
220
+ - >-
221
+ The composite is fully CONTROLLED — toggling a cell does NOT
222
+ mutate `preferences`. The host MUST listen for `change` (and
223
+ `bulk-toggle` for the column master), apply the change to its
224
+ own state, then re-pass the new `preferences` array. Failing to
225
+ do this leaves the toggle visually flipping back to its prior
226
+ state on the next render.
227
+ - >-
228
+ For binary on/off cell toggles, use <check-ui> semantics — NOT
229
+ <switch-ui>. The column-header master IS a <switch-ui> (because
230
+ it's a "setting" — flip the whole column), but each cell is a
231
+ multi-select-style checkbox.
232
+ - >-
233
+ Use `group-by="group"` only when `preferences[]` records carry a
234
+ stable `group` field. Mixing grouped + ungrouped rows in the
235
+ same matrix produces inconsistent section heights.
236
+
237
+ anti_patterns:
238
+ - wrong: |
239
+ <notification-preferences-ui>
240
+ <switch-ui label="Email mentions"></switch-ui>
241
+ <switch-ui label="Email replies"></switch-ui>
242
+ </notification-preferences-ui>
243
+ why: |
244
+ Cells are generated from the `preferences` matrix. Slotted
245
+ switches are ignored and the host renders empty.
246
+ fix: |
247
+ <notification-preferences-ui id="prefs"></notification-preferences-ui>
248
+ <script>
249
+ document.querySelector('#prefs').channels = [
250
+ {key:'email', label:'Email'}
251
+ ];
252
+ document.querySelector('#prefs').preferences = [
253
+ {key:'mentions', label:'Mentions', channels:{email:true}},
254
+ {key:'replies', label:'Replies', channels:{email:false}}
255
+ ];
256
+ </script>
257
+ - wrong: |
258
+ <table>
259
+ <thead><tr><th></th><th>Email</th></tr></thead>
260
+ <tbody>
261
+ <tr><th>Mentions</th><td><check-ui></check-ui></td></tr>
262
+ </tbody>
263
+ </table>
264
+ why: |
265
+ Re-implements the matrix in raw HTML — loses the typed
266
+ `change` / `bulk-toggle` event contract, the column-master
267
+ switch, the group-by support, and the consistent token-driven
268
+ visual treatment. Worse, table-content tags inside a custom
269
+ element subtree are foster-parented out of the DOM by the HTML
270
+ parser — they silently vanish.
271
+ fix: |
272
+ <notification-preferences-ui id="prefs"></notification-preferences-ui>
273
+ <script>/* set channels + preferences here */</script>
274
+
275
+ examples:
276
+ - name: default
277
+ description: Three channels (in-app / email / SMS) × four notification types.
278
+ a2ui: |
279
+ [
280
+ {
281
+ "id": "np-default",
282
+ "component": "NotificationPreferences",
283
+ "name": "notifications",
284
+ "channels": [
285
+ {"key": "in-app", "label": "In-app", "icon": "chat-circle"},
286
+ {"key": "email", "label": "Email", "icon": "envelope"},
287
+ {"key": "sms", "label": "SMS", "icon": "device-mobile"}
288
+ ],
289
+ "preferences": [
290
+ {"key": "mentions", "label": "Mentions",
291
+ "channels": {"in-app": true, "email": true, "sms": false}},
292
+ {"key": "comments", "label": "Comments",
293
+ "channels": {"in-app": true, "email": false, "sms": false}},
294
+ {"key": "releases", "label": "Releases",
295
+ "channels": {"in-app": false,"email": true, "sms": false}},
296
+ {"key": "security", "label": "Security alerts",
297
+ "channels": {"in-app": true, "email": true, "sms": true}}
298
+ ]
299
+ }
300
+ ]
301
+ - name: grouped
302
+ description: Same matrix grouped by category via group-by="group".
303
+ a2ui: |
304
+ [
305
+ {
306
+ "id": "np-grouped",
307
+ "component": "NotificationPreferences",
308
+ "name": "notifications",
309
+ "groupBy": "group",
310
+ "channels": [
311
+ {"key": "in-app", "label": "In-app"},
312
+ {"key": "email", "label": "Email"}
313
+ ],
314
+ "preferences": [
315
+ {"key": "mentions", "label": "Mentions", "group": "Activity",
316
+ "channels": {"in-app": true, "email": true}},
317
+ {"key": "comments", "label": "Comments", "group": "Activity",
318
+ "channels": {"in-app": true, "email": false}},
319
+ {"key": "digest", "label": "Weekly digest", "group": "Summaries",
320
+ "channels": {"in-app": false, "email": true}}
321
+ ]
322
+ }
323
+ ]
324
+
325
+ keywords:
326
+ - notification-preferences
327
+ - notifications
328
+ - preferences
329
+ - opt-in
330
+ - opt-out
331
+ - alerts
332
+ - channels
333
+ - in-app
334
+ - email
335
+ - sms
336
+ - subscriptions
337
+ - notification-settings
338
+
339
+ synonyms:
340
+ notifications:
341
+ - alerts
342
+ - messages
343
+ - updates
344
+ preferences:
345
+ - settings
346
+ - opt-ins
347
+ - subscriptions
348
+ channels:
349
+ - delivery
350
+ - destinations
351
+
352
+ related:
353
+ - Check
354
+ - Switch
355
+ - Table
356
+ - EmptyState
357
+ - Icon
358
+ - Text
@@ -36,8 +36,8 @@
36
36
  * should prefer <admin-command>.
37
37
  */
38
38
 
39
- import { defineIfFree } from '../../../web-components/core/register.js';
40
- import { UIElement } from '../../../web-components/core/element.js';
39
+ import { defineIfFree } from '@adia-ai/web-components/core/register';
40
+ import { UIElement } from '@adia-ai/web-components/core/element';
41
41
 
42
42
  class AdminCommand extends UIElement {
43
43
  static properties = {
@@ -29,8 +29,8 @@
29
29
  * 4. command-select re-emit + nav routing when a <nav-ui> is present
30
30
  */
31
31
 
32
- import { defineIfFree } from '../../../web-components/core/register.js';
33
- import { UIElement } from '../../../web-components/core/element.js';
32
+ import { defineIfFree } from '@adia-ai/web-components/core/register';
33
+ import { UIElement } from '@adia-ai/web-components/core/element';
34
34
 
35
35
  const DEFAULT_MODE = 'rounded borderless';
36
36
 
@@ -37,8 +37,8 @@
37
37
  * code should prefer <admin-sidebar>.
38
38
  */
39
39
 
40
- import { defineIfFree } from '../../../web-components/core/register.js';
41
- import { UIElement } from '../../../web-components/core/element.js';
40
+ import { defineIfFree } from '@adia-ai/web-components/core/register';
41
+ import { UIElement } from '@adia-ai/web-components/core/element';
42
42
 
43
43
  const SNAP_THRESHOLD = 96;
44
44
  const SNAP_MIN_USABLE = 160;
@@ -31,9 +31,9 @@
31
31
  * edge to resize + a `resize-end` event), not a CSS stand-in. The trait is imported
32
32
  * here so it's registered for declarative lookup.
33
33
  */
34
- import { defineIfFree } from '../../../web-components/core/register.js';
35
- import { UIElement } from '../../../web-components/core/element.js';
36
- import '../../../web-components/traits/resizable/resizable.js'; // register `resizable` for traits="resizable"
34
+ import { defineIfFree } from '@adia-ai/web-components/core/register';
35
+ import { UIElement } from '@adia-ai/web-components/core/element';
36
+ import '@adia-ai/web-components/traits'; // registers the full trait library (incl. `resizable`) for declarative traits="resizable" lookup
37
37
 
38
38
  class EmbedShell extends UIElement {
39
39
  static template = () => null; // behavior-only, light-DOM — keep the consumer's children
@@ -1,4 +1,4 @@
1
- import { UIElement } from '../../../web-components/core/element.js';
1
+ import { UIElement } from '@adia-ai/web-components/core/element';
2
2
 
3
3
  /**
4
4
  * <simple-shell> — Minimal shell for marketing / landing / error pages.
@@ -51,8 +51,8 @@
51
51
  * theme-panel[active-scheme="dark"] button-ui { … }
52
52
  */
53
53
 
54
- import { defineIfFree } from '../../../web-components/core/register.js';
55
- import { UIElement } from '../../../web-components/core/element.js';
54
+ import { defineIfFree } from '@adia-ai/web-components/core/register';
55
+ import { UIElement } from '@adia-ai/web-components/core/element';
56
56
 
57
57
  // The 12 named identities shipped in styles/themes.css (real recolor +
58
58
  // real typeface pairing per theme, not a decorative hue nudge) — see that