@genesislcap/ai-assistant 15.86.0 → 15.86.1-FUI-2666.3

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 (30) hide show
  1. package/dist/ai-assistant.api.json +63 -2
  2. package/dist/ai-assistant.d.ts +10 -0
  3. package/dist/custom-elements.json +253 -182
  4. package/dist/dts/components/chat-bubble/chat-bubble.d.ts +9 -2
  5. package/dist/dts/components/chat-bubble/chat-bubble.d.ts.map +1 -1
  6. package/dist/dts/components/chat-markdown/chat-markdown.d.ts.map +1 -1
  7. package/dist/dts/genesis/write-review/write-review.d.ts +23 -0
  8. package/dist/dts/genesis/write-review/write-review.d.ts.map +1 -1
  9. package/dist/dts/genesis/write-review/write-review.styles.d.ts.map +1 -1
  10. package/dist/dts/genesis/write-review/write-review.template.d.ts.map +1 -1
  11. package/dist/dts/main/main.d.ts +8 -0
  12. package/dist/dts/main/main.d.ts.map +1 -1
  13. package/dist/dts/main/main.styles.d.ts.map +1 -1
  14. package/dist/dts/main/main.template.d.ts.map +1 -1
  15. package/dist/dts/main/main.types.d.ts +2 -0
  16. package/dist/dts/main/main.types.d.ts.map +1 -1
  17. package/dist/dts/react.d.ts +1 -0
  18. package/dist/esm/components/chat-bubble/chat-bubble.js +18 -21
  19. package/dist/esm/components/chat-markdown/chat-markdown.js +18 -2
  20. package/dist/esm/genesis/write-review/write-review.js +48 -0
  21. package/dist/esm/genesis/write-review/write-review.styles.js +67 -1
  22. package/dist/esm/genesis/write-review/write-review.template.js +44 -27
  23. package/dist/esm/main/main.js +13 -0
  24. package/dist/esm/main/main.styles.js +42 -0
  25. package/dist/esm/main/main.template.js +11 -1
  26. package/dist/esm/main/main.types.js +2 -0
  27. package/dist/react.cjs +6 -1
  28. package/dist/react.mjs +6 -1
  29. package/docs/styling.md +10 -4
  30. package/package.json +17 -17
@@ -6997,180 +6997,6 @@
6997
6997
  "declarations": [],
6998
6998
  "exports": []
6999
6999
  },
7000
- {
7001
- "kind": "javascript-module",
7002
- "path": "src/notifications/agent-notifications.ts",
7003
- "declarations": [
7004
- {
7005
- "kind": "variable",
7006
- "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
7007
- "type": {
7008
- "text": "string"
7009
- },
7010
- "default": "'The assistant is ready for your next input'",
7011
- "description": "The notification's text when neither the app nor the widget gives one."
7012
- },
7013
- {
7014
- "kind": "function",
7015
- "name": "agentNotificationPermission",
7016
- "return": {
7017
- "type": {
7018
- "text": "AgentNotificationPermission"
7019
- }
7020
- },
7021
- "description": "Whether this page may show notifications. Safe to call anywhere, including Node."
7022
- },
7023
- {
7024
- "kind": "function",
7025
- "name": "requestAgentNotificationPermission",
7026
- "return": {
7027
- "type": {
7028
- "text": "Promise<AgentNotificationPermission>"
7029
- }
7030
- },
7031
- "description": "Ask the person for permission to show notifications, and resolve to the result. Call it from a\nclick or key handler: browsers ignore or refuse a request that does not come from the person.\nResolves straight away when permission is already decided or unsupported, since a browser only\never asks once."
7032
- }
7033
- ],
7034
- "exports": [
7035
- {
7036
- "kind": "js",
7037
- "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
7038
- "declaration": {
7039
- "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
7040
- "module": "src/notifications/agent-notifications.ts"
7041
- }
7042
- },
7043
- {
7044
- "kind": "js",
7045
- "name": "agentNotificationPermission",
7046
- "declaration": {
7047
- "name": "agentNotificationPermission",
7048
- "module": "src/notifications/agent-notifications.ts"
7049
- }
7050
- },
7051
- {
7052
- "kind": "js",
7053
- "name": "requestAgentNotificationPermission",
7054
- "declaration": {
7055
- "name": "requestAgentNotificationPermission",
7056
- "module": "src/notifications/agent-notifications.ts"
7057
- }
7058
- }
7059
- ]
7060
- },
7061
- {
7062
- "kind": "javascript-module",
7063
- "path": "src/notifications/agent-notifier.ts",
7064
- "declarations": [],
7065
- "exports": []
7066
- },
7067
- {
7068
- "kind": "javascript-module",
7069
- "path": "src/notifications/index.ts",
7070
- "declarations": [],
7071
- "exports": [
7072
- {
7073
- "kind": "js",
7074
- "name": "agentNotificationPermission",
7075
- "declaration": {
7076
- "name": "agentNotificationPermission",
7077
- "module": "./agent-notifications"
7078
- }
7079
- },
7080
- {
7081
- "kind": "js",
7082
- "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
7083
- "declaration": {
7084
- "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
7085
- "module": "./agent-notifications"
7086
- }
7087
- },
7088
- {
7089
- "kind": "js",
7090
- "name": "requestAgentNotificationPermission",
7091
- "declaration": {
7092
- "name": "requestAgentNotificationPermission",
7093
- "module": "./agent-notifications"
7094
- }
7095
- },
7096
- {
7097
- "kind": "js",
7098
- "name": "type",
7099
- "declaration": {
7100
- "name": "type",
7101
- "module": "./agent-notifications"
7102
- }
7103
- },
7104
- {
7105
- "kind": "js",
7106
- "name": "AgentAttentionDetail",
7107
- "declaration": {
7108
- "name": "AgentAttentionDetail",
7109
- "module": "./agent-notifications"
7110
- }
7111
- },
7112
- {
7113
- "kind": "js",
7114
- "name": "type",
7115
- "declaration": {
7116
- "name": "type",
7117
- "module": "./agent-notifications"
7118
- }
7119
- },
7120
- {
7121
- "kind": "js",
7122
- "name": "AgentAttentionKind",
7123
- "declaration": {
7124
- "name": "AgentAttentionKind",
7125
- "module": "./agent-notifications"
7126
- }
7127
- },
7128
- {
7129
- "kind": "js",
7130
- "name": "type",
7131
- "declaration": {
7132
- "name": "type",
7133
- "module": "./agent-notifications"
7134
- }
7135
- },
7136
- {
7137
- "kind": "js",
7138
- "name": "AgentNotificationLevel",
7139
- "declaration": {
7140
- "name": "AgentNotificationLevel",
7141
- "module": "./agent-notifications"
7142
- }
7143
- },
7144
- {
7145
- "kind": "js",
7146
- "name": "type",
7147
- "declaration": {
7148
- "name": "type",
7149
- "module": "./agent-notifications"
7150
- }
7151
- },
7152
- {
7153
- "kind": "js",
7154
- "name": "AgentNotificationPermission",
7155
- "declaration": {
7156
- "name": "AgentNotificationPermission",
7157
- "module": "./agent-notifications"
7158
- }
7159
- }
7160
- ]
7161
- },
7162
- {
7163
- "kind": "javascript-module",
7164
- "path": "src/notifications/notification-level-picker.template.ts",
7165
- "declarations": [],
7166
- "exports": []
7167
- },
7168
- {
7169
- "kind": "javascript-module",
7170
- "path": "src/notifications/notification-settings.ts",
7171
- "declarations": [],
7172
- "exports": []
7173
- },
7174
7000
  {
7175
7001
  "kind": "javascript-module",
7176
7002
  "path": "src/main/attachment-controller.ts",
@@ -7508,6 +7334,15 @@
7508
7334
  },
7509
7335
  "description": "Controls the pop-out button shown next to the settings cog.\n\"expand\" — in bubble, expands to layout panel (fires chat-popout).\n\"collapse\" — in layout panel, collapses back to bubble (fires chat-popin).\nAbsent — no button (default standalone behaviour, no breaking change)."
7510
7336
  },
7337
+ {
7338
+ "kind": "field",
7339
+ "name": "closable",
7340
+ "type": {
7341
+ "text": "boolean"
7342
+ },
7343
+ "default": "false",
7344
+ "description": "Shows a Close button in the header, which fires `close-requested` and leaves the closing to\nwhatever holds the assistant. The chat bubble sets it while the assistant is in its dialog."
7345
+ },
7511
7346
  {
7512
7347
  "kind": "field",
7513
7348
  "name": "agents",
@@ -11064,6 +10899,16 @@
11064
10899
  ],
11065
10900
  "description": "Report a turn that ended with the assistant waiting for the person to type (GENC-1660), for the\nAlways level: `turn-ended` on the activity bus, like every other notification report.\n\nOnly for a turn that ran to its end, failed ones included: not one the person stopped\n(`cancelling`), since they are there. Not while an interaction waits on them, which reports\nitself, so the person is never told twice about one moment. And not while an autopilot runs for\nthe flow: it answers, hands back or reports its own stop. Sub-agents' turns never get here; they\nrun inside one of the parent's."
11066
10901
  },
10902
+ {
10903
+ "kind": "method",
10904
+ "name": "handleClose",
10905
+ "return": {
10906
+ "type": {
10907
+ "text": "void"
10908
+ }
10909
+ },
10910
+ "description": "Called when the user clicks the header's Close button."
10911
+ },
11067
10912
  {
11068
10913
  "kind": "method",
11069
10914
  "name": "onChatHeaderMouseDown",
@@ -11205,6 +11050,10 @@
11205
11050
  "description": "Fired when the user presses the chat header in `popout-mode=\"expand\"` (for drag-to-popout hosts). Bubbles and composed. detail: `ChatHeaderMouseDownDetail`",
11206
11051
  "name": "chat-header-mousedown"
11207
11052
  },
11053
+ {
11054
+ "description": "Fired when the user presses the header's Close button, which shows while `closable` is set (the chat bubble sets it while the assistant is in its dialog). Bubbles and composed.",
11055
+ "name": "close-requested"
11056
+ },
11208
11057
  {
11209
11058
  "description": "Fired after the session is wiped (the lifecycle menu's Clear). The payload is captured before teardown so the host can clean up any external state the active agent was working on. Bubbles and composed. detail: `SessionClearedDetail`",
11210
11059
  "name": "session-cleared"
@@ -11269,6 +11118,14 @@
11269
11118
  "description": "Controls the pop-out button shown next to the settings cog.\n\"expand\" — in bubble, expands to layout panel (fires chat-popout).\n\"collapse\" — in layout panel, collapses back to bubble (fires chat-popin).\nAbsent — no button (default standalone behaviour, no breaking change).",
11270
11119
  "fieldName": "popoutMode"
11271
11120
  },
11121
+ {
11122
+ "type": {
11123
+ "text": "boolean"
11124
+ },
11125
+ "default": "false",
11126
+ "description": "Shows a Close button in the header, which fires `close-requested` and leaves the closing to\nwhatever holds the assistant. The chat bubble sets it while the assistant is in its dialog.",
11127
+ "fieldName": "closable"
11128
+ },
11272
11129
  {
11273
11130
  "name": "debug-redux",
11274
11131
  "type": {
@@ -11354,9 +11211,9 @@
11354
11211
  "kind": "variable",
11355
11212
  "name": "AiAssistantEvent",
11356
11213
  "type": {
11357
- "text": "{\n /** Session wiped via the lifecycle menu's Clear. `detail`: `SessionClearedDetail`. */\n SessionCleared: 'session-cleared',\n /** Header pressed in `popout-mode=\"expand\"` (drag-to-popout hosts). `detail`: `ChatHeaderMouseDownDetail`. */\n ChatHeaderMouseDown: 'chat-header-mousedown',\n /** An agent's hand-off started (GENC-1737). `detail`: `HandOffFrame`. */\n HandOffStarted: 'handoff-started',\n /** A hand-off ended and its caller is active again. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffReturned: 'handoff-returned',\n /** A hand-off ended with no hand-back. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffUnwound: 'handoff-unwound',\n}"
11214
+ "text": "{\n /** Session wiped via the lifecycle menu's Clear. `detail`: `SessionClearedDetail`. */\n SessionCleared: 'session-cleared',\n /** Header pressed in `popout-mode=\"expand\"` (drag-to-popout hosts). `detail`: `ChatHeaderMouseDownDetail`. */\n ChatHeaderMouseDown: 'chat-header-mousedown',\n /** An agent's hand-off started (GENC-1737). `detail`: `HandOffFrame`. */\n HandOffStarted: 'handoff-started',\n /** A hand-off ended and its caller is active again. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffReturned: 'handoff-returned',\n /** A hand-off ended with no hand-back. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffUnwound: 'handoff-unwound',\n /** The header's Close button pressed, shown while `closable` is set. No `detail`. */\n CloseRequested: 'close-requested',\n}"
11358
11215
  },
11359
- "default": "{\n /** Session wiped via the lifecycle menu's Clear. `detail`: `SessionClearedDetail`. */\n SessionCleared: 'session-cleared',\n /** Header pressed in `popout-mode=\"expand\"` (drag-to-popout hosts). `detail`: `ChatHeaderMouseDownDetail`. */\n ChatHeaderMouseDown: 'chat-header-mousedown',\n /** An agent's hand-off started (GENC-1737). `detail`: `HandOffFrame`. */\n HandOffStarted: 'handoff-started',\n /** A hand-off ended and its caller is active again. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffReturned: 'handoff-returned',\n /** A hand-off ended with no hand-back. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffUnwound: 'handoff-unwound',\n}",
11216
+ "default": "{\n /** Session wiped via the lifecycle menu's Clear. `detail`: `SessionClearedDetail`. */\n SessionCleared: 'session-cleared',\n /** Header pressed in `popout-mode=\"expand\"` (drag-to-popout hosts). `detail`: `ChatHeaderMouseDownDetail`. */\n ChatHeaderMouseDown: 'chat-header-mousedown',\n /** An agent's hand-off started (GENC-1737). `detail`: `HandOffFrame`. */\n HandOffStarted: 'handoff-started',\n /** A hand-off ended and its caller is active again. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffReturned: 'handoff-returned',\n /** A hand-off ended with no hand-back. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffUnwound: 'handoff-unwound',\n /** The header's Close button pressed, shown while `closable` is set. No `detail`. */\n CloseRequested: 'close-requested',\n}",
11360
11217
  "description": "DOM events the `<foundation-ai-assistant>` element dispatches to its host.\nAll bubble and are `composed` (they cross the shadow boundary), so a host can\nlisten on the element — or any ancestor — to react. Use these constants to\nwire listeners instead of hand-typing event-name strings.\n\nAn `as const` map (not a TS `enum` — this package ships none), so it serves as\nboth the listener-name value and, via the same-named type below, a union."
11361
11218
  },
11362
11219
  {
@@ -11428,6 +11285,180 @@
11428
11285
  "declarations": [],
11429
11286
  "exports": []
11430
11287
  },
11288
+ {
11289
+ "kind": "javascript-module",
11290
+ "path": "src/notifications/agent-notifications.ts",
11291
+ "declarations": [
11292
+ {
11293
+ "kind": "variable",
11294
+ "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
11295
+ "type": {
11296
+ "text": "string"
11297
+ },
11298
+ "default": "'The assistant is ready for your next input'",
11299
+ "description": "The notification's text when neither the app nor the widget gives one."
11300
+ },
11301
+ {
11302
+ "kind": "function",
11303
+ "name": "agentNotificationPermission",
11304
+ "return": {
11305
+ "type": {
11306
+ "text": "AgentNotificationPermission"
11307
+ }
11308
+ },
11309
+ "description": "Whether this page may show notifications. Safe to call anywhere, including Node."
11310
+ },
11311
+ {
11312
+ "kind": "function",
11313
+ "name": "requestAgentNotificationPermission",
11314
+ "return": {
11315
+ "type": {
11316
+ "text": "Promise<AgentNotificationPermission>"
11317
+ }
11318
+ },
11319
+ "description": "Ask the person for permission to show notifications, and resolve to the result. Call it from a\nclick or key handler: browsers ignore or refuse a request that does not come from the person.\nResolves straight away when permission is already decided or unsupported, since a browser only\never asks once."
11320
+ }
11321
+ ],
11322
+ "exports": [
11323
+ {
11324
+ "kind": "js",
11325
+ "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
11326
+ "declaration": {
11327
+ "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
11328
+ "module": "src/notifications/agent-notifications.ts"
11329
+ }
11330
+ },
11331
+ {
11332
+ "kind": "js",
11333
+ "name": "agentNotificationPermission",
11334
+ "declaration": {
11335
+ "name": "agentNotificationPermission",
11336
+ "module": "src/notifications/agent-notifications.ts"
11337
+ }
11338
+ },
11339
+ {
11340
+ "kind": "js",
11341
+ "name": "requestAgentNotificationPermission",
11342
+ "declaration": {
11343
+ "name": "requestAgentNotificationPermission",
11344
+ "module": "src/notifications/agent-notifications.ts"
11345
+ }
11346
+ }
11347
+ ]
11348
+ },
11349
+ {
11350
+ "kind": "javascript-module",
11351
+ "path": "src/notifications/agent-notifier.ts",
11352
+ "declarations": [],
11353
+ "exports": []
11354
+ },
11355
+ {
11356
+ "kind": "javascript-module",
11357
+ "path": "src/notifications/index.ts",
11358
+ "declarations": [],
11359
+ "exports": [
11360
+ {
11361
+ "kind": "js",
11362
+ "name": "agentNotificationPermission",
11363
+ "declaration": {
11364
+ "name": "agentNotificationPermission",
11365
+ "module": "./agent-notifications"
11366
+ }
11367
+ },
11368
+ {
11369
+ "kind": "js",
11370
+ "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
11371
+ "declaration": {
11372
+ "name": "DEFAULT_AGENT_NOTIFICATION_MESSAGE",
11373
+ "module": "./agent-notifications"
11374
+ }
11375
+ },
11376
+ {
11377
+ "kind": "js",
11378
+ "name": "requestAgentNotificationPermission",
11379
+ "declaration": {
11380
+ "name": "requestAgentNotificationPermission",
11381
+ "module": "./agent-notifications"
11382
+ }
11383
+ },
11384
+ {
11385
+ "kind": "js",
11386
+ "name": "type",
11387
+ "declaration": {
11388
+ "name": "type",
11389
+ "module": "./agent-notifications"
11390
+ }
11391
+ },
11392
+ {
11393
+ "kind": "js",
11394
+ "name": "AgentAttentionDetail",
11395
+ "declaration": {
11396
+ "name": "AgentAttentionDetail",
11397
+ "module": "./agent-notifications"
11398
+ }
11399
+ },
11400
+ {
11401
+ "kind": "js",
11402
+ "name": "type",
11403
+ "declaration": {
11404
+ "name": "type",
11405
+ "module": "./agent-notifications"
11406
+ }
11407
+ },
11408
+ {
11409
+ "kind": "js",
11410
+ "name": "AgentAttentionKind",
11411
+ "declaration": {
11412
+ "name": "AgentAttentionKind",
11413
+ "module": "./agent-notifications"
11414
+ }
11415
+ },
11416
+ {
11417
+ "kind": "js",
11418
+ "name": "type",
11419
+ "declaration": {
11420
+ "name": "type",
11421
+ "module": "./agent-notifications"
11422
+ }
11423
+ },
11424
+ {
11425
+ "kind": "js",
11426
+ "name": "AgentNotificationLevel",
11427
+ "declaration": {
11428
+ "name": "AgentNotificationLevel",
11429
+ "module": "./agent-notifications"
11430
+ }
11431
+ },
11432
+ {
11433
+ "kind": "js",
11434
+ "name": "type",
11435
+ "declaration": {
11436
+ "name": "type",
11437
+ "module": "./agent-notifications"
11438
+ }
11439
+ },
11440
+ {
11441
+ "kind": "js",
11442
+ "name": "AgentNotificationPermission",
11443
+ "declaration": {
11444
+ "name": "AgentNotificationPermission",
11445
+ "module": "./agent-notifications"
11446
+ }
11447
+ }
11448
+ ]
11449
+ },
11450
+ {
11451
+ "kind": "javascript-module",
11452
+ "path": "src/notifications/notification-level-picker.template.ts",
11453
+ "declarations": [],
11454
+ "exports": []
11455
+ },
11456
+ {
11457
+ "kind": "javascript-module",
11458
+ "path": "src/notifications/notification-settings.ts",
11459
+ "declarations": [],
11460
+ "exports": []
11461
+ },
11431
11462
  {
11432
11463
  "kind": "javascript-module",
11433
11464
  "path": "src/provider/ai-provider-switcher.ts",
@@ -17683,11 +17714,12 @@
17683
17714
  },
17684
17715
  {
17685
17716
  "kind": "field",
17686
- "name": "injectedCloseBtn",
17717
+ "name": "closableAssistant",
17687
17718
  "type": {
17688
17719
  "text": "Element | undefined"
17689
17720
  },
17690
- "privacy": "private"
17721
+ "privacy": "private",
17722
+ "description": "The assistant whose header Close button this bubble turned on, and listens to."
17691
17723
  },
17692
17724
  {
17693
17725
  "kind": "field",
@@ -17903,7 +17935,7 @@
17903
17935
  },
17904
17936
  {
17905
17937
  "kind": "method",
17906
- "name": "injectCloseButton",
17938
+ "name": "showCloseButton",
17907
17939
  "privacy": "private",
17908
17940
  "parameters": [
17909
17941
  {
@@ -17912,7 +17944,8 @@
17912
17944
  "text": "Element"
17913
17945
  }
17914
17946
  }
17915
- ]
17947
+ ],
17948
+ "description": "The Close button is the assistant's own, rendered in its header beside the cog. It used to be\na design-system button injected into the assistant's light DOM, where the assistant's styles\ncould reach its host but not the padded control inside it, so it sat narrower than the cog\nand off its centre line, and every host carried a shim to square it up."
17916
17949
  },
17917
17950
  {
17918
17951
  "kind": "method",
@@ -25138,7 +25171,7 @@
25138
25171
  {
25139
25172
  "kind": "variable",
25140
25173
  "name": "WriteReviewStyles",
25141
- "default": "css`\n :host {\n display: block;\n font: inherit;\n\n /* The diff tints — see the diff rules below for why they are backgrounds only. */\n --write-review-added: color-mix(in srgb, var(--success-fill-rest, #2da44e) 18%, transparent);\n --write-review-removed: color-mix(in srgb, var(--error-fill-rest, #cf222e) 18%, transparent);\n }\n\n /*\n * The review mounts inside the chat bubble's dialog content, which is overflow: hidden — so a\n * wide event's columns were CLIPPED rather than pushed off screen, with no scrollbar to say\n * anything was missing. A user approving values they cannot see is the failure this whole\n * component exists to prevent, so the table scrolls within itself.\n */\n .scroller {\n overflow-x: auto;\n max-width: 100%;\n }\n\n table {\n border-collapse: collapse;\n width: 100%;\n }\n\n th,\n td {\n border-bottom: calc(var(--stroke-width, 1) * 1px) solid var(--neutral-stroke-rest);\n padding: calc(var(--design-unit, 4) * 1px) calc(var(--design-unit, 4) * 2px);\n text-align: left;\n }\n\n /* A heading is a column name: kept on one line. */\n th {\n white-space: nowrap;\n }\n\n /*\n * A value is never clipped. Every character stays on screen.\n *\n * Clipping was the first bound, and the wrong one: 24ch with an ellipsis cut the END of every\n * cell, which in a changed cell is the NEW value, so the user approved a value they never saw.\n * No cell is safe to clip either. An insert has no pre-image, so none of its cells is\n * \"changed\", and every one of them is a value being written; a delete's cells are the record\n * being removed; and a title attribute holding the full text reaches nobody on a keyboard or a\n * touch screen.\n *\n * A SHORT value stays whole on one line, and the table scrolls. Wrapping every cell broke a\n * short value mid-token in a squeezed table — \"101.\" over \"2345\" — and the first line could\n * pass for the whole value.\n *\n * A LONG value (review-model marks it) wraps within a bound. With no bound at all, one long\n * value (a NOTE another user wrote) widened its column until the changed one sat out of view,\n * behind a scrollbar an overlay-scrollbar platform does not draw until you scroll.\n */\n td {\n white-space: nowrap;\n }\n\n td.long {\n white-space: normal;\n overflow-wrap: anywhere;\n\n /*\n * A floor as well as a ceiling. With only the ceiling, a squeezed table shrank a long value's\n * column to a sliver (a 100-character note became 22 lines of a few characters each) while\n * the one-line cells kept their width. The table scrolls instead.\n */\n min-width: 20ch;\n max-width: 40ch;\n }\n\n /*\n * The two marks this table carries — \"this field is changing\" and \"this field decides which\n * record disappears\" — were weight, colour and a strike-through only. None of that reaches\n * somebody using a screen reader, who is the one approver with no other way to tell, so each\n * mark has words as well.\n */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n\n /*\n * A delete shows the whole record and sends its key alone, so the fields that actually decide\n * which record disappears are marked. Not colour alone — an underline carries to a user who\n * cannot distinguish it.\n */\n td.identifying {\n font-weight: 600;\n text-decoration: underline;\n }\n\n /*\n * The diff, the way a code review shows one: what goes is tinted as removed and struck through,\n * what comes in is tinted as added and bold. Only the BACKGROUND is tinted, at low alpha, from\n * the theme's own success and error tokens (with fallbacks, as foundation-forms does), and the\n * text keeps the normal foreground colour: coloured text on a coloured ground is where contrast\n * fails, dark mode first. The tint is never the only signal. Strike-through, weight, the visible\n * + and − marks and the spoken \"was\" and \"now\" all carry the same thing without colour.\n */\n\n /* The mark a user's eye needs: this field is being changed. */\n td.changed {\n font-weight: 600;\n }\n\n /* On its own line above the new value, so neither can push the other out of view. */\n td.changed .was {\n display: block;\n font-weight: 400;\n text-decoration: line-through;\n background: var(--write-review-removed);\n }\n\n td.changed .now {\n display: block;\n background: var(--write-review-added);\n }\n\n /* Room inside the tint, so the − and + do not sit on its edge. */\n td.changed .was,\n td.changed .now {\n padding-inline: calc(var(--design-unit, 4) * 1px);\n }\n\n /*\n * A row that will not be written is never tinted, not even inside a cell. For a refused row\n * review-model already gives it no changed cells, and this is the second guard. For a row the\n * resolved review did not approve, the − and + stay as the record of what was proposed, but\n * without the tint that says it will happen.\n */\n tr.refused td.changed .was,\n tr.refused td.changed .now,\n tr.unwritten td.changed .was,\n tr.unwritten td.changed .now {\n background: none;\n }\n\n /* A whole row coming in, or going. A refused row is neither, and keeps its muted look. */\n tr.added td {\n background: var(--write-review-added);\n }\n\n tr.removed td {\n background: var(--write-review-removed);\n }\n\n /*\n * A closed review's row that was not approved says so in words — without them, a denied modify\n * read in greyscale or by a screen reader exactly like an approved one. An approved row says what\n * came of it the same way, once the write tool has recorded that (written, not written\n * because the user stopped, or its own reason).\n */\n .not-written,\n .fate {\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n font-size: var(--type-ramp-minus-1-font-size, 0.875em);\n color: var(--neutral-foreground-hint);\n }\n\n /*\n * A row action's input is what its handler is given, not a change to the row, so it is labelled\n * rather than marked as a diff. The label is text, so it reaches a screen reader as well.\n */\n .input-mark {\n font-style: italic;\n color: var(--neutral-foreground-hint);\n padding-inline-end: calc(var(--design-unit, 4) * 1px);\n }\n\n .row-action p {\n margin-block: calc(var(--design-unit, 4) * 1px);\n }\n\n /* The empty placeholder: a style no row text can take, so a literal \"(blank)\" cannot pass for it. */\n .blank {\n font-style: italic;\n font-weight: 400;\n color: var(--neutral-foreground-hint);\n }\n\n .mark {\n font-weight: 600;\n padding-inline-end: calc(var(--design-unit, 4) * 1px);\n user-select: none;\n }\n\n /* The row's + or − sits beside its checkbox, not on the baseline under it (where − reads as _). */\n td.select {\n white-space: nowrap;\n }\n\n td.select rapid-checkbox,\n td.select .mark {\n vertical-align: middle;\n }\n\n /* A gap from the checkbox, so the mark reads as the row's sign rather than part of the box. */\n td.select .mark {\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n }\n\n /* The strike-through belongs to the value, not to its − mark. */\n td.changed .was .mark {\n display: inline-block;\n text-decoration: none;\n }\n\n tr.refused {\n color: var(--neutral-foreground-hint);\n }\n\n /* A refusal is a sentence, and it spans the table: it wraps rather than running off it. */\n .problems {\n color: var(--error-fill-rest, #c00);\n white-space: normal;\n }\n\n .actions {\n display: flex;\n gap: calc(var(--design-unit, 4) * 2px);\n margin-top: calc(var(--design-unit, 4) * 2px);\n }\n\n /* The change request takes the width the buttons leave it. */\n .change-request {\n flex: 1 1 24ch;\n }\n\n /* The outcome's live region is always there; while the review is open it takes no room. */\n .closed:empty {\n margin: 0;\n }\n\n /* The count sits at the foot of the field, beside it rather than in its way. */\n .remaining {\n align-self: flex-end;\n white-space: nowrap;\n font-size: var(--type-ramp-minus-1-font-size, 0.875em);\n color: var(--neutral-foreground-hint);\n }\n`"
25174
+ "default": "css`\n :host {\n display: block;\n font: inherit;\n\n /* The diff tints — see the diff rules below for why they are backgrounds only. */\n --write-review-added: color-mix(in srgb, var(--success-fill-rest, #2da44e) 18%, transparent);\n --write-review-removed: color-mix(in srgb, var(--error-fill-rest, #cf222e) 18%, transparent);\n }\n\n /*\n * The review mounts inside the chat bubble's dialog content, which is overflow: hidden — so a\n * wide event's columns were CLIPPED rather than pushed off screen, with no scrollbar to say\n * anything was missing. A user approving values they cannot see is the failure this whole\n * component exists to prevent, so the table scrolls within itself.\n */\n .scroller {\n overflow-x: auto;\n max-width: 100%;\n }\n\n table {\n border-collapse: collapse;\n width: 100%;\n }\n\n th,\n td {\n border-bottom: calc(var(--stroke-width, 1) * 1px) solid var(--neutral-stroke-rest);\n padding: calc(var(--design-unit, 4) * 1px) calc(var(--design-unit, 4) * 2px);\n text-align: left;\n }\n\n /* A heading is a column name: kept on one line. */\n th {\n white-space: nowrap;\n }\n\n /*\n * A value is never clipped. Every character stays on screen.\n *\n * Clipping was the first bound, and the wrong one: 24ch with an ellipsis cut the END of every\n * cell, which in a changed cell is the NEW value, so the user approved a value they never saw.\n * No cell is safe to clip either. An insert has no pre-image, so none of its cells is\n * \"changed\", and every one of them is a value being written; a delete's cells are the record\n * being removed; and a title attribute holding the full text reaches nobody on a keyboard or a\n * touch screen.\n *\n * A SHORT value stays whole on one line, and the table scrolls. Wrapping every cell broke a\n * short value mid-token in a squeezed table — \"101.\" over \"2345\" — and the first line could\n * pass for the whole value.\n *\n * A LONG value (review-model marks it) wraps within a bound. With no bound at all, one long\n * value (a NOTE another user wrote) widened its column until the changed one sat out of view,\n * behind a scrollbar an overlay-scrollbar platform does not draw until you scroll.\n */\n td {\n white-space: nowrap;\n }\n\n td.long {\n white-space: normal;\n overflow-wrap: anywhere;\n\n /*\n * A floor as well as a ceiling. With only the ceiling, a squeezed table shrank a long value's\n * column to a sliver (a 100-character note became 22 lines of a few characters each) while\n * the one-line cells kept their width. The table scrolls instead.\n */\n min-width: 20ch;\n max-width: 40ch;\n }\n\n /*\n * Stacked: the table did not fit (see GenesisWriteReview.stacked), so each row becomes a block\n * and each field a line of its own, its label beside its value, and nothing is off to the side.\n * The headings go, as every value now carries its own; the select-all box stays, labelled.\n */\n .stacked table,\n .stacked tbody,\n .stacked tr,\n .stacked td {\n display: block;\n }\n\n .stacked thead tr {\n display: flex;\n }\n\n .stacked thead th:not(.select) {\n display: none;\n }\n\n .stacked thead th.select {\n border-bottom: none;\n font-weight: 400;\n }\n\n /* Without its column of row boxes beneath it, a lone box at the top says nothing on sight. Its\n spoken name is its aria-label, so the words here are for the eye only (the empty alt). */\n .stacked thead th.select::after {\n content: 'Select all' / '';\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n vertical-align: middle;\n }\n\n .stacked tbody tr {\n padding-block: calc(var(--design-unit, 4) * 1px);\n border-top: calc(var(--stroke-width, 1) * 1px) solid var(--neutral-stroke-rest);\n }\n\n .stacked td {\n border-bottom: none;\n }\n\n .stacked td[data-label] {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);\n gap: calc(var(--design-unit, 4) * 2px);\n white-space: normal;\n overflow-wrap: anywhere;\n }\n\n .stacked td[data-label]::before {\n content: attr(data-label);\n font-weight: 600;\n }\n\n /* No column to bound any more: a long value takes the line's width like any other, and wraps\n within it like any other. */\n .stacked td.long {\n min-width: 0;\n max-width: none;\n white-space: normal;\n overflow-wrap: anywhere;\n }\n\n /*\n * The two marks this table carries — \"this field is changing\" and \"this field decides which\n * record disappears\" — were weight, colour and a strike-through only. None of that reaches\n * somebody using a screen reader, who is the one approver with no other way to tell, so each\n * mark has words as well.\n */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n\n /*\n * A delete shows the whole record and sends its key alone, so the fields that actually decide\n * which record disappears are marked. Not colour alone — an underline carries to a user who\n * cannot distinguish it.\n */\n td.identifying {\n font-weight: 600;\n text-decoration: underline;\n }\n\n /*\n * The diff, the way a code review shows one: what goes is tinted as removed and struck through,\n * what comes in is tinted as added and bold. Only the BACKGROUND is tinted, at low alpha, from\n * the theme's own success and error tokens (with fallbacks, as foundation-forms does), and the\n * text keeps the normal foreground colour: coloured text on a coloured ground is where contrast\n * fails, dark mode first. The tint is never the only signal. Strike-through, weight, the visible\n * + and − marks and the spoken \"was\" and \"now\" all carry the same thing without colour.\n */\n\n /* The mark a user's eye needs: this field is being changed. */\n td.changed {\n font-weight: 600;\n }\n\n /* On its own line above the new value, so neither can push the other out of view. */\n td.changed .was {\n display: block;\n font-weight: 400;\n text-decoration: line-through;\n background: var(--write-review-removed);\n }\n\n td.changed .now {\n display: block;\n background: var(--write-review-added);\n }\n\n /* Room inside the tint, so the − and + do not sit on its edge. */\n td.changed .was,\n td.changed .now {\n padding-inline: calc(var(--design-unit, 4) * 1px);\n }\n\n /*\n * A row that will not be written is never tinted, not even inside a cell. For a refused row\n * review-model already gives it no changed cells, and this is the second guard. For a row the\n * resolved review did not approve, the − and + stay as the record of what was proposed, but\n * without the tint that says it will happen.\n */\n tr.refused td.changed .was,\n tr.refused td.changed .now,\n tr.unwritten td.changed .was,\n tr.unwritten td.changed .now {\n background: none;\n }\n\n /* A whole row coming in, or going. A refused row is neither, and keeps its muted look. */\n tr.added td {\n background: var(--write-review-added);\n }\n\n tr.removed td {\n background: var(--write-review-removed);\n }\n\n /*\n * A closed review's row that was not approved says so in words — without them, a denied modify\n * read in greyscale or by a screen reader exactly like an approved one. An approved row says what\n * came of it the same way, once the write tool has recorded that (written, not written\n * because the user stopped, or its own reason).\n */\n .not-written,\n .fate {\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n font-size: var(--type-ramp-minus-1-font-size, 0.875em);\n color: var(--neutral-foreground-hint);\n }\n\n /*\n * A row action's input is what its handler is given, not a change to the row, so it is labelled\n * rather than marked as a diff. The label is text, so it reaches a screen reader as well.\n */\n .input-mark {\n font-style: italic;\n color: var(--neutral-foreground-hint);\n padding-inline-end: calc(var(--design-unit, 4) * 1px);\n }\n\n .row-action p {\n margin-block: calc(var(--design-unit, 4) * 1px);\n }\n\n /* The empty placeholder: a style no row text can take, so a literal \"(blank)\" cannot pass for it. */\n .blank {\n font-style: italic;\n font-weight: 400;\n color: var(--neutral-foreground-hint);\n }\n\n .mark {\n font-weight: 600;\n padding-inline-end: calc(var(--design-unit, 4) * 1px);\n user-select: none;\n }\n\n /* The row's + or − sits beside its checkbox, not on the baseline under it (where − reads as _). */\n td.select {\n white-space: nowrap;\n }\n\n .select rapid-checkbox,\n td.select .mark {\n vertical-align: middle;\n }\n\n /* A gap from the checkbox, so the mark reads as the row's sign rather than part of the box. */\n td.select .mark {\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n }\n\n /* The strike-through belongs to the value, not to its − mark. */\n td.changed .was .mark {\n display: inline-block;\n text-decoration: none;\n }\n\n tr.refused {\n color: var(--neutral-foreground-hint);\n }\n\n /* A refusal is a sentence, and it spans the table: it wraps rather than running off it. */\n .problems {\n color: var(--error-fill-rest, #c00);\n white-space: normal;\n }\n\n /* Wraps, so in a narrow bubble the last button drops to a new line rather than off the edge. */\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: calc(var(--design-unit, 4) * 2px);\n margin-top: calc(var(--design-unit, 4) * 2px);\n }\n\n /* The change request takes the width the buttons leave it. */\n .change-request {\n flex: 1 1 24ch;\n }\n\n /* The outcome's live region is always there; while the review is open it takes no room. */\n .closed:empty {\n margin: 0;\n }\n\n /* The count sits at the foot of the field, beside it rather than in its way. */\n .remaining {\n align-self: flex-end;\n white-space: nowrap;\n font-size: var(--type-ramp-minus-1-font-size, 0.875em);\n color: var(--neutral-foreground-hint);\n }\n`"
25142
25175
  }
25143
25176
  ],
25144
25177
  "exports": [
@@ -25162,7 +25195,7 @@
25162
25195
  "type": {
25163
25196
  "text": "ViewTemplate<GenesisWriteReview>"
25164
25197
  },
25165
- "default": "html<GenesisWriteReview>`\n ${when(\n (x) => !!x.model,\n html<GenesisWriteReview>`\n ${when(\n (x) => !x.rowActionHeading,\n html<GenesisWriteReview>`\n <p>\n ${(x) => x.model?.op} ${(x) => x.model?.rows.length} row(s) in\n ${(x) => x.model?.resource}. Nothing is written until you choose rows and select Write.\n </p>\n `,\n )}\n ${when(\n (x) => !!x.rowActionHeading,\n html<GenesisWriteReview>`\n <p class=\"row-action-heading\">${(x) => x.rowActionHeading}</p>\n <div class=\"row-action\" id=\"${ROW_ACTION_LINES_ID}\">\n ${repeat(\n (x) => x.rowActionLines,\n html<string>`\n <p>${(x) => x}</p>\n `,\n )}\n </div>\n `,\n )}\n ${when(\n (x) => !!x.customCodeLine,\n html<GenesisWriteReview>`\n <p class=\"custom-code\" id=\"${CUSTOM_CODE_LINE_ID}\">${(x) => x.customCodeLine}</p>\n `,\n )}\n <div class=\"scroller\">\n <table\n aria-label=\"${(x) => x.tableLabel}\"\n aria-describedby=\"${(x) =>\n x.customCodeLine\n ? CUSTOM_CODE_LINE_ID\n : x.rowActionHeading\n ? ROW_ACTION_LINES_ID\n : undefined}\"\n >\n <thead>\n <tr>\n <th>\n <rapid-checkbox\n aria-label=\"Select all rows\"\n :checked=\"${(x) => x.allSelected}\"\n ?disabled=\"${(x) => x.settled || !x.model?.selectable.length}\"\n @change=\"${(x, c) => x.setAll(checkedOf(c.event))}\"\n ></rapid-checkbox>\n </th>\n ${repeat(\n (x) => x.model?.columns ?? [],\n html<ReviewColumn>`\n <th>${(c) => c.label}</th>\n `,\n )}\n </tr>\n </thead>\n <tbody>${repeat((x) => x.model?.rows ?? [], row)}</tbody>\n </table>\n </div>\n <div class=\"actions\">\n ${when(\n (x) => !x.asking,\n html<GenesisWriteReview>`\n <rapid-button\n appearance=\"accent\"\n ?disabled=\"${(x) => !x.writable}\"\n @click=\"${(x) => x.write()}\"\n >\n Write ${(x) => (x.rowsSelected ? `${x.rowsSelected} row(s)` : '')}\n </rapid-button>\n <rapid-button\n class=\"ask\"\n ?disabled=\"${(x) => x.settled}\"\n @click=\"${(x) => x.startAsking()}\"\n >\n Ask for changes\n </rapid-button>\n <rapid-button ?disabled=\"${(x) => x.settled}\" @click=\"${(x) => x.deny()}\">\n Deny\n </rapid-button>\n `,\n )}\n ${when(\n (x) => x.asking,\n html<GenesisWriteReview>`\n <rapid-text-area\n class=\"change-request\"\n :value=\"${(x) => x.changeText}\"\n ?readonly=\"${(x) => x.settled}\"\n maxlength=\"${() => MAX_FEEDBACK_CHARS}\"\n @input=\"${(x, c) => {\n x.setChangeText((c.event.target as HTMLTextAreaElement).value);\n return true;\n }}\"\n >\n What should change?\n </rapid-text-area>\n <span class=\"remaining\">${(x) => x.charactersLeft} characters left</span>\n <rapid-button\n class=\"send\"\n appearance=\"accent\"\n ?disabled=\"${(x) => !x.canSendChanges}\"\n @click=\"${(x) => x.sendChanges()}\"\n >\n Send\n </rapid-button>\n <rapid-button class=\"back\" ?disabled=\"${(x) => x.settled}\" @click=\"${(x) => x.back()}\">\n Back\n </rapid-button>\n `,\n )}\n </div>\n `,\n )}\n ${\n /* A live region, and there from the start: a screen reader announces a change to one it\n already knows, and a region added with its text already in it was not announced at all.\n Empty while the review is open; filled by sayOutcome, which also decides when. Focusable\n from script only, so focus can land on the outcome after an answer. */ ''\n }\n <p class=\"closed\" role=\"status\" tabindex=\"-1\">${(x) => x.announcement}</p>\n`"
25198
+ "default": "html<GenesisWriteReview>`\n ${when(\n (x) => !!x.model,\n html<GenesisWriteReview>`\n ${when(\n (x) => !x.rowActionHeading,\n html<GenesisWriteReview>`\n <p>\n ${(x) => x.model?.op} ${(x) => x.model?.rows.length} row(s) in\n ${(x) => x.model?.resource}. Nothing is written until you choose rows and select Write.\n </p>\n `,\n )}\n ${when(\n (x) => !!x.rowActionHeading,\n html<GenesisWriteReview>`\n <p class=\"row-action-heading\">${(x) => x.rowActionHeading}</p>\n <div class=\"row-action\" id=\"${ROW_ACTION_LINES_ID}\">\n ${repeat(\n (x) => x.rowActionLines,\n html<string>`\n <p>${(x) => x}</p>\n `,\n )}\n </div>\n `,\n )}\n ${when(\n (x) => !!x.customCodeLine,\n html<GenesisWriteReview>`\n <p class=\"custom-code\" id=\"${CUSTOM_CODE_LINE_ID}\">${(x) => x.customCodeLine}</p>\n `,\n )}\n ${\n /* The table's roles are stated, not left to the tags: the stacked layout sets display: block\n on its parts, and a browser then drops their table semantics, so a screen reader would\n hear a run of values with no row or column to put them in. */ ''\n }\n <div class=\"scroller ${(x) => (x.stacked ? 'stacked' : '')}\">\n <table\n role=\"table\"\n aria-label=\"${(x) => x.tableLabel}\"\n aria-describedby=\"${(x) =>\n x.customCodeLine\n ? CUSTOM_CODE_LINE_ID\n : x.rowActionHeading\n ? ROW_ACTION_LINES_ID\n : undefined}\"\n >\n <thead role=\"rowgroup\">\n <tr role=\"row\">\n <th role=\"columnheader\" class=\"select\">\n <rapid-checkbox\n aria-label=\"Select all rows\"\n :checked=\"${(x) => x.allSelected}\"\n ?disabled=\"${(x) => x.settled || !x.model?.selectable.length}\"\n @change=\"${(x, c) => x.setAll(checkedOf(c.event))}\"\n ></rapid-checkbox>\n </th>\n ${repeat(\n (x) => x.model?.columns ?? [],\n html<ReviewColumn>`\n <th role=\"columnheader\">${(c) => c.label}</th>\n `,\n )}\n </tr>\n </thead>\n <tbody role=\"rowgroup\">${repeat((x) => x.model?.rows ?? [], row)}</tbody>\n </table>\n </div>\n <div class=\"actions\">\n ${when(\n (x) => !x.asking,\n html<GenesisWriteReview>`\n <rapid-button\n appearance=\"accent\"\n ?disabled=\"${(x) => !x.writable}\"\n @click=\"${(x) => x.write()}\"\n >\n Write ${(x) => (x.rowsSelected ? `${x.rowsSelected} row(s)` : '')}\n </rapid-button>\n <rapid-button\n class=\"ask\"\n ?disabled=\"${(x) => x.settled}\"\n @click=\"${(x) => x.startAsking()}\"\n >\n Ask for changes\n </rapid-button>\n <rapid-button ?disabled=\"${(x) => x.settled}\" @click=\"${(x) => x.deny()}\">\n Deny\n </rapid-button>\n `,\n )}\n ${when(\n (x) => x.asking,\n html<GenesisWriteReview>`\n <rapid-text-area\n class=\"change-request\"\n :value=\"${(x) => x.changeText}\"\n ?readonly=\"${(x) => x.settled}\"\n maxlength=\"${() => MAX_FEEDBACK_CHARS}\"\n @input=\"${(x, c) => {\n x.setChangeText((c.event.target as HTMLTextAreaElement).value);\n return true;\n }}\"\n >\n What should change?\n </rapid-text-area>\n <span class=\"remaining\">${(x) => x.charactersLeft} characters left</span>\n <rapid-button\n class=\"send\"\n appearance=\"accent\"\n ?disabled=\"${(x) => !x.canSendChanges}\"\n @click=\"${(x) => x.sendChanges()}\"\n >\n Send\n </rapid-button>\n <rapid-button class=\"back\" ?disabled=\"${(x) => x.settled}\" @click=\"${(x) => x.back()}\">\n Back\n </rapid-button>\n `,\n )}\n </div>\n `,\n )}\n ${\n /* A live region, and there from the start: a screen reader announces a change to one it\n already knows, and a region added with its text already in it was not announced at all.\n Empty while the review is open; filled by sayOutcome, which also decides when. Focusable\n from script only, so focus can land on the outcome after an answer. */ ''\n }\n <p class=\"closed\" role=\"status\" tabindex=\"-1\">${(x) => x.announcement}</p>\n`"
25166
25199
  }
25167
25200
  ],
25168
25201
  "exports": [
@@ -25246,6 +25279,33 @@
25246
25279
  "default": "''",
25247
25280
  "description": "What the live region says: the outcome once the review has resolved. See `sayOutcome`."
25248
25281
  },
25282
+ {
25283
+ "kind": "field",
25284
+ "name": "stacked",
25285
+ "type": {
25286
+ "text": "boolean"
25287
+ },
25288
+ "default": "false",
25289
+ "description": "True when the table would not fit the width it has, and each row is laid out as its fields\nstacked label beside value instead."
25290
+ },
25291
+ {
25292
+ "kind": "field",
25293
+ "name": "resizeObserver",
25294
+ "type": {
25295
+ "text": "ResizeObserver | undefined"
25296
+ },
25297
+ "privacy": "private"
25298
+ },
25299
+ {
25300
+ "kind": "field",
25301
+ "name": "tableWidth",
25302
+ "type": {
25303
+ "text": "number"
25304
+ },
25305
+ "privacy": "private",
25306
+ "default": "0",
25307
+ "description": "The table's width when last laid out as a table: what the review needs to stop stacking."
25308
+ },
25249
25309
  {
25250
25310
  "kind": "field",
25251
25311
  "name": "answeredNow",
@@ -25264,6 +25324,17 @@
25264
25324
  "privacy": "private",
25265
25325
  "description": "The answer this element shows while its outcome is still to come, whose `focused` it keeps\ncurrent. The rebuild that brings the outcome gives focus back only if this one held it when\nit was removed: a user who has since moved to the chat input keeps their place."
25266
25326
  },
25327
+ {
25328
+ "kind": "method",
25329
+ "name": "fitLayout",
25330
+ "privacy": "private",
25331
+ "return": {
25332
+ "type": {
25333
+ "text": "void"
25334
+ }
25335
+ },
25336
+ "description": "Stacks the rows when the table is wider than the review, and goes back to the table once the\nreview is as wide as the table was. While stacked there is no table to measure, so the width it\nhad is kept from the last time it was one."
25337
+ },
25267
25338
  {
25268
25339
  "kind": "field",
25269
25340
  "name": "model",
@@ -69,7 +69,8 @@ export declare class AiChatBubble extends GenesisElement {
69
69
  /** @internal */
70
70
  dialogEl?: HTMLElement;
71
71
  private unsubBus?;
72
- private injectedCloseBtn?;
72
+ /** The assistant whose header Close button this bubble turned on, and listens to. */
73
+ private closableAssistant?;
73
74
  private resizeObserver?;
74
75
  private dragging;
75
76
  private dragTarget;
@@ -101,7 +102,13 @@ export declare class AiChatBubble extends GenesisElement {
101
102
  private refreshNeedsUser;
102
103
  dialogContentChanged(_: HTMLElement[], next: HTMLElement[]): void;
103
104
  private findAssistant;
104
- private injectCloseButton;
105
+ /**
106
+ * The Close button is the assistant's own, rendered in its header beside the cog. It used to be
107
+ * a design-system button injected into the assistant's light DOM, where the assistant's styles
108
+ * could reach its host but not the padded control inside it, so it sat narrower than the cog
109
+ * and off its centre line, and every host carried a shim to square it up.
110
+ */
111
+ private showCloseButton;
105
112
  private removeCloseButton;
106
113
  onBubbleMouseDown(e: MouseEvent): void;
107
114
  onDialogHeaderMouseDown(e: CustomEvent<{
@@ -1 +1 @@
1
- {"version":3,"file":"chat-bubble.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-bubble/chat-bubble.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,cAAc,EAAoB,MAAM,uBAAuB,CAAC;AAM9F;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAExD;AAkCD;;;;;;;;;GASG;AACH,qBAOa,YAAa,SAAQ,cAAc;IAChB,KAAK,EAAE,MAAM,CAAkB;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IACP,kBAAkB,EAAE,MAAM,CAAW;IAClF;;;;OAIG;IACuC,eAAe,EAAE,MAAM,CAC9B;IAEnC,gBAAgB;IACJ,aAAa,EAAE,WAAW,EAAE,CAAM;IAC9C,gBAAgB;IACJ,oBAAoB,EAAE,MAAM,CAAK;IAC7C,iFAAiF;IACrE,UAAU,EAAE,MAAM,CAAK;IACnC,+EAA+E;IACnE,SAAS,EAAE,MAAM,CAAK;IAClC,mFAAmF;IACvE,UAAU,EAAE,MAAM,CAAK;IACnC,iFAAiF;IACrE,SAAS,EAAE,MAAM,CAAK;IAClC,iEAAiE;IACrD,WAAW,EAAE,MAAM,CAAwB;IACvD,kEAAkE;IACtD,YAAY,EAAE,MAAM,CAAyB;IACzD,4DAA4D;IAChD,UAAU,EAAE,OAAO,CAAS;IACxC,6DAA6D;IACjD,OAAO,EAAE,OAAO,CAAS;IACrC;;;OAGG;IACS,SAAS,EAAE,OAAO,CAAS;IAEvC,gBAAgB;IAChB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,gBAAgB;IAChB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,WAAW,CAAC;IAEvB,OAAO,CAAC,QAAQ,CAAC,CAAa;IAC9B,OAAO,CAAC,gBAAgB,CAAC,CAAU;IACnC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAkB;IAErC,iBAAiB;IAiDjB,kBAAkB;IAWlB,kBAAkB;IAIlB,oBAAoB;IAiBpB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO;IAoC3C;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAK3B,sCAAsC;IACtC,OAAO,CAAC,UAAU;IASlB,qFAAqF;IACrF,OAAO,CAAC,mBAAmB;IAO3B,8DAA8D;IAC9D,OAAO,CAAC,gBAAgB;IAIxB,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;IAc1D,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,iBAAiB;IAMzB,iBAAiB,CAAC,CAAC,EAAE,UAAU;IAa/B,uBAAuB,CAAC,CAAC,EAAE,WAAW,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAkB5E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAO9D,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,cAAc,CAOpB;IASF,OAAO,CAAC,cAAc,CAuBpB;IAMF,OAAO,CAAC,YAAY,CAmClB;IAEF,QAAQ;IAIR,aAAa;IAiBb,IAAI,YAAY,IAAI,MAAM,CAazB;CACF"}
1
+ {"version":3,"file":"chat-bubble.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-bubble/chat-bubble.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,cAAc,EAAoB,MAAM,uBAAuB,CAAC;AAO9F;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAExD;AAkCD;;;;;;;;;GASG;AACH,qBAOa,YAAa,SAAQ,cAAc;IAChB,KAAK,EAAE,MAAM,CAAkB;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IACP,kBAAkB,EAAE,MAAM,CAAW;IAClF;;;;OAIG;IACuC,eAAe,EAAE,MAAM,CAC9B;IAEnC,gBAAgB;IACJ,aAAa,EAAE,WAAW,EAAE,CAAM;IAC9C,gBAAgB;IACJ,oBAAoB,EAAE,MAAM,CAAK;IAC7C,iFAAiF;IACrE,UAAU,EAAE,MAAM,CAAK;IACnC,+EAA+E;IACnE,SAAS,EAAE,MAAM,CAAK;IAClC,mFAAmF;IACvE,UAAU,EAAE,MAAM,CAAK;IACnC,iFAAiF;IACrE,SAAS,EAAE,MAAM,CAAK;IAClC,iEAAiE;IACrD,WAAW,EAAE,MAAM,CAAwB;IACvD,kEAAkE;IACtD,YAAY,EAAE,MAAM,CAAyB;IACzD,4DAA4D;IAChD,UAAU,EAAE,OAAO,CAAS;IACxC,6DAA6D;IACjD,OAAO,EAAE,OAAO,CAAS;IACrC;;;OAGG;IACS,SAAS,EAAE,OAAO,CAAS;IAEvC,gBAAgB;IAChB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,gBAAgB;IAChB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,WAAW,CAAC;IAEvB,OAAO,CAAC,QAAQ,CAAC,CAAa;IAC9B,qFAAqF;IACrF,OAAO,CAAC,iBAAiB,CAAC,CAAU;IACpC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAkB;IAErC,iBAAiB;IAiDjB,kBAAkB;IAWlB,kBAAkB;IAIlB,oBAAoB;IAiBpB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO;IAoC3C;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAK3B,sCAAsC;IACtC,OAAO,CAAC,UAAU;IASlB,qFAAqF;IACrF,OAAO,CAAC,mBAAmB;IAO3B,8DAA8D;IAC9D,OAAO,CAAC,gBAAgB;IAIxB,oBAAoB,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;IAY1D,OAAO,CAAC,aAAa;IAarB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;IASzB,iBAAiB,CAAC,CAAC,EAAE,UAAU;IAa/B,uBAAuB,CAAC,CAAC,EAAE,WAAW,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAkB5E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAO9D,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,cAAc,CAOpB;IASF,OAAO,CAAC,cAAc,CAuBpB;IAMF,OAAO,CAAC,YAAY,CAmClB;IAEF,QAAQ;IAIR,aAAa;IAiBb,IAAI,YAAY,IAAI,MAAM,CAazB;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-markdown.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-markdown/chat-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAoB,MAAM,uBAAuB,CAAC;AA0I7F;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAOvB,CAAC;AAWb,qBAOa,cAAe,SAAQ,cAAc;IAChD,qCAAqC;IACzB,OAAO,EAAE,MAAM,CAAM;IAEjC,gBAAgB;IAChB,cAAc;IAed;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,aAAa;CAmBtB"}
1
+ {"version":3,"file":"chat-markdown.d.ts","sourceRoot":"","sources":["../../../../src/components/chat-markdown/chat-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAoB,MAAM,uBAAuB,CAAC;AA0J7F;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAOvB,CAAC;AAWb,qBAOa,cAAe,SAAQ,cAAc;IAChD,qCAAqC;IACzB,OAAO,EAAE,MAAM,CAAM;IAEjC,gBAAgB;IAChB,cAAc;IAed;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,aAAa;CAmBtB"}