@meridianlabs/log-viewer 0.3.228 → 0.3.230

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 (68) hide show
  1. package/lib/index.js +1705 -598
  2. package/lib/index.js.map +1 -1
  3. package/lib/src/app/appearance/icons.d.ts +2 -0
  4. package/lib/src/app/appearance/icons.d.ts.map +1 -1
  5. package/lib/src/app/log-list/LogsPanel.d.ts.map +1 -1
  6. package/lib/src/app/log-list/grid/LogListGrid.d.ts.map +1 -1
  7. package/lib/src/app/log-list/grid/columns/hooks.d.ts.map +1 -1
  8. package/lib/src/app/log-list/grid/columns/types.d.ts +1 -0
  9. package/lib/src/app/log-list/grid/columns/types.d.ts.map +1 -1
  10. package/lib/src/app/log-view/LogView.d.ts.map +1 -1
  11. package/lib/src/app/log-view/tabs/TaskTab.d.ts.map +1 -1
  12. package/lib/src/app/log-view/title-view/AutogrowText.d.ts +10 -0
  13. package/lib/src/app/log-view/title-view/AutogrowText.d.ts.map +1 -0
  14. package/lib/src/app/log-view/title-view/ChangeSummary.d.ts +9 -0
  15. package/lib/src/app/log-view/title-view/ChangeSummary.d.ts.map +1 -0
  16. package/lib/src/app/log-view/title-view/EditButton.d.ts +10 -0
  17. package/lib/src/app/log-view/title-view/EditButton.d.ts.map +1 -0
  18. package/lib/src/app/log-view/title-view/EditMetadataDialog.d.ts +47 -0
  19. package/lib/src/app/log-view/title-view/EditMetadataDialog.d.ts.map +1 -0
  20. package/lib/src/app/log-view/title-view/EditTagsDialog.d.ts +11 -0
  21. package/lib/src/app/log-view/title-view/EditTagsDialog.d.ts.map +1 -0
  22. package/lib/src/app/log-view/title-view/PrimaryBar.d.ts +1 -0
  23. package/lib/src/app/log-view/title-view/PrimaryBar.d.ts.map +1 -1
  24. package/lib/src/app/log-view/title-view/ProvenanceFields.d.ts +11 -0
  25. package/lib/src/app/log-view/title-view/ProvenanceFields.d.ts.map +1 -0
  26. package/lib/src/app/log-view/title-view/TagChip.d.ts +10 -0
  27. package/lib/src/app/log-view/title-view/TagChip.d.ts.map +1 -0
  28. package/lib/src/app/log-view/title-view/TagStrip.d.ts +40 -0
  29. package/lib/src/app/log-view/title-view/TagStrip.d.ts.map +1 -0
  30. package/lib/src/app/log-view/title-view/TagsField.d.ts +21 -0
  31. package/lib/src/app/log-view/title-view/TagsField.d.ts.map +1 -0
  32. package/lib/src/app/log-view/title-view/TitleView.d.ts +1 -0
  33. package/lib/src/app/log-view/title-view/TitleView.d.ts.map +1 -1
  34. package/lib/src/app/log-view/title-view/editErrors.d.ts +2 -0
  35. package/lib/src/app/log-view/title-view/editErrors.d.ts.map +1 -0
  36. package/lib/src/app/plan/PlanCard.d.ts.map +1 -1
  37. package/lib/src/app/samples/status/sampleStatus.d.ts.map +1 -1
  38. package/lib/src/app/samples-panel/SamplesPanel.d.ts.map +1 -1
  39. package/lib/src/app/shared/samples-grid/columns.d.ts.map +1 -1
  40. package/lib/src/client/api/client-api.d.ts.map +1 -1
  41. package/lib/src/client/api/types.d.ts +13 -0
  42. package/lib/src/client/api/types.d.ts.map +1 -1
  43. package/lib/src/client/api/view-server/api-view-server.d.ts.map +1 -1
  44. package/lib/src/client/api/view-server/request.d.ts +14 -0
  45. package/lib/src/client/api/view-server/request.d.ts.map +1 -1
  46. package/lib/src/client/api/vscode/api-vscode.d.ts.map +1 -1
  47. package/lib/src/client/api/vscode/jsonrpc.d.ts +2 -0
  48. package/lib/src/client/api/vscode/jsonrpc.d.ts.map +1 -1
  49. package/lib/src/client/database/service.d.ts +1 -0
  50. package/lib/src/client/database/service.d.ts.map +1 -1
  51. package/lib/src/client/remote/remoteLogFile.d.ts +21 -2
  52. package/lib/src/client/remote/remoteLogFile.d.ts.map +1 -1
  53. package/lib/src/components/Modal.d.ts +2 -0
  54. package/lib/src/components/Modal.d.ts.map +1 -1
  55. package/lib/src/index.d.ts +10 -0
  56. package/lib/src/index.d.ts.map +1 -1
  57. package/lib/src/state/clientEvents.d.ts +1 -2
  58. package/lib/src/state/clientEvents.d.ts.map +1 -1
  59. package/lib/src/state/clientEventsService.d.ts +2 -5
  60. package/lib/src/state/clientEventsService.d.ts.map +1 -1
  61. package/lib/src/state/hooks.d.ts +19 -0
  62. package/lib/src/state/hooks.d.ts.map +1 -1
  63. package/lib/src/state/sync/replicationService.d.ts +1 -0
  64. package/lib/src/state/sync/replicationService.d.ts.map +1 -1
  65. package/lib/src/utils/workQueue.d.ts +1 -0
  66. package/lib/src/utils/workQueue.d.ts.map +1 -1
  67. package/lib/styles/index.css +690 -77
  68. package/package.json +1 -1
@@ -14295,6 +14295,12 @@ pre[class*="language-"] {
14295
14295
  --bs-border-radius-lg: 4px;
14296
14296
  --bs-popover-max-width: 50%;
14297
14297
  --bs-code-color: #8b0000;
14298
+ /* Secondary/italic guidance text (e.g. "optional" next to the Reason
14299
+ label in the edit dialogs). Bootstrap's --bs-secondary-color is
14300
+ readable on a light surface; in VS Code dark themes it disappears
14301
+ against the dialog background, so this variable is re-pointed at
14302
+ --vscode-descriptionForeground below. */
14303
+ --inspect-hint-foreground: var(--bs-secondary-color);
14298
14304
  --inspect-find-background: var(--bs-body-bg);
14299
14305
  --inspect-find-foreground: var(--bs-body-color);
14300
14306
  --inspect-input-background: var(--bs-body-bg);
@@ -14494,6 +14500,10 @@ body[class^="vscode-"] {
14494
14500
  --inspect-input-background: var(--vscode-input-background);
14495
14501
  --inspect-input-foreground: var(--vscode-input-foreground);
14496
14502
  --inspect-input-border: var(--vscode-input-border);
14503
+ /* descriptionForeground is the muted-but-readable text VS Code uses
14504
+ for inline guidance (e.g. quick-pick descriptions). Matches the
14505
+ editor's contrast tuning in both light and dark themes. */
14506
+ --inspect-hint-foreground: var(--vscode-descriptionForeground);
14497
14507
  --inspect-diff-add-color: var(--vscode-diffEditor-insertedTextBackground);
14498
14508
  --inspect-diff-remove-color: var(--vscode-diffEditor-removedTextBackground);
14499
14509
  --inspect-glass-color: var(--vscode-editor-foreground);
@@ -14604,6 +14614,98 @@ body[class^="vscode-"] .btn-primary {
14604
14614
  --bs-btn-disabled-opacity: 0.8;
14605
14615
  }
14606
14616
 
14617
+ /* Inside modal dialogs (edit tags / edit metadata / scoring detail)
14618
+ the editor-tuned `--vscode-editorGroup-border` reads as nearly
14619
+ invisible against dark themes — chip strips, the metadata grid,
14620
+ and form-control inputs all lose their visual containers. Re-point
14621
+ `--bs-border-color` to a widget-grade border so anything Bootstrap
14622
+ styles with the border-color token (chip outlines, input borders,
14623
+ table dividers, etc.) becomes legible. The fallback chain prefers
14624
+ widget/editorWidget borders (typically tuned by themes for popups)
14625
+ and only drops back to editorGroup-border if nothing else is set. */
14626
+ body[class^="vscode-"] .modal {
14627
+ --bs-border-color: var(
14628
+ --vscode-widget-border,
14629
+ var(--vscode-editorWidget-border, var(--vscode-editorGroup-border))
14630
+ );
14631
+ /* Error banner inside dialogs: the global vscode block only re-points
14632
+ `--bs-danger-bg-subtle` (at the diff-editor red wash), leaving
14633
+ `--bs-danger-text-emphasis` and `--bs-danger-border-subtle` at
14634
+ Bootstrap's light-mode dark-red values — unreadable on a VS Code
14635
+ dark dialog. Use the editor's input-validation tokens (designed
14636
+ for exactly this purpose: a tinted background with readable
14637
+ foreground and a visible border) with a fallback to
14638
+ `errorForeground` for themes that only define the foreground.
14639
+ Also re-point `--bs-danger` so the required-field asterisk picks
14640
+ up the same readable red. */
14641
+ --bs-danger: var(--vscode-errorForeground);
14642
+ --bs-danger-bg-subtle: var(
14643
+ --vscode-inputValidation-errorBackground,
14644
+ var(--vscode-diffEditor-removedTextBackground)
14645
+ );
14646
+ --bs-danger-text-emphasis: var(
14647
+ --vscode-inputValidation-errorForeground,
14648
+ var(--vscode-errorForeground)
14649
+ );
14650
+ --bs-danger-border-subtle: var(
14651
+ --vscode-inputValidation-errorBorder,
14652
+ var(--vscode-errorForeground)
14653
+ );
14654
+ /* Change-tracking summary in the dialog footer uses these tokens
14655
+ for the italic body, the "Adding" / "Editing" lines, and the
14656
+ "No tags yet —" placeholder inside the chip box. Bootstrap's
14657
+ light-mode values are unreadable on a dark VS Code modal; remap
14658
+ to descriptionForeground (matches the hint label) plus the
14659
+ editor's source-control accent colors so the categories stay
14660
+ distinguishable. (Removing already inherits the readable red
14661
+ from `--bs-danger` re-pointed above.) */
14662
+ --bs-secondary-color: var(--vscode-descriptionForeground);
14663
+ --bs-success-text-emphasis: var(
14664
+ --vscode-gitDecoration-addedResourceForeground,
14665
+ var(--vscode-charts-green)
14666
+ );
14667
+ --bs-warning-text-emphasis: var(
14668
+ --vscode-gitDecoration-modifiedResourceForeground,
14669
+ var(--vscode-charts-yellow)
14670
+ );
14671
+ }
14672
+
14673
+ /* Form-control inputs inside dialogs (Author, Reason, "Add a tag…",
14674
+ "Add a key…") should look like native VS Code inputs rather than
14675
+ editor-background panes: surface the input background/foreground
14676
+ tokens, and use the input placeholder token so the placeholder
14677
+ text stays readable in dark themes. */
14678
+ body[class^="vscode-"] .modal .form-control {
14679
+ background-color: var(--vscode-input-background);
14680
+ color: var(--vscode-input-foreground);
14681
+ border-color: var(
14682
+ --vscode-input-border,
14683
+ var(--vscode-widget-border, var(--vscode-editorGroup-border))
14684
+ );
14685
+ }
14686
+
14687
+ body[class^="vscode-"] .modal .form-control::placeholder {
14688
+ color: var(--vscode-input-placeholderForeground);
14689
+ opacity: 1;
14690
+ }
14691
+
14692
+ /* Mirror .btn-primary for .btn-secondary so Cancel buttons and the
14693
+ "+ Add" pill (both rendered with Bootstrap's btn-secondary) read as
14694
+ native VS Code secondary buttons rather than the washed-out
14695
+ Bootstrap gray that has poor contrast in dark themes. */
14696
+ body[class^="vscode-"] .btn-secondary {
14697
+ --bs-btn-bg: var(--vscode-button-secondaryBackground);
14698
+ --bs-btn-border-color: var(--vscode-button-secondaryBackground);
14699
+ --bs-btn-hover-bg: var(--vscode-button-secondaryHoverBackground);
14700
+ --bs-btn-hover-border-color: var(--vscode-button-secondaryHoverBackground);
14701
+ --bs-btn-color: var(--vscode-button-secondaryForeground);
14702
+ --bs-btn-hover-color: var(--vscode-button-secondaryForeground);
14703
+ --bs-btn-disabled-color: var(--vscode-button-secondaryForeground);
14704
+ --bs-btn-disabled-bg: var(--vscode-button-secondaryBackground);
14705
+ --bs-btn-disabled-border-color: var(--vscode-button-secondaryBackground);
14706
+ --bs-btn-disabled-opacity: 0.8;
14707
+ }
14708
+
14607
14709
  body[class^="vscode-"] .navbar-brand {
14608
14710
  --bs-navbar-brand-color: var(--vscode-sideBarSectionHeader-foreground);
14609
14711
  --bs-navbar-brand-hover-color: var(--vscode-sideBarSectionHeader-foreground);
@@ -16193,40 +16295,46 @@ li > ul {
16193
16295
  margin-right: 0.5rem;
16194
16296
  color: var(--bs-red);
16195
16297
  }
16196
- ._headerContainer_gh2j2_1 {
16197
- display: grid;
16198
- grid-template-columns: max-content auto;
16199
- column-gap: 0rem;
16298
+ ._headerContainer_19525_1 {
16299
+ /* Flex (not grid) so an optional `children` action node sits inline
16300
+ beside the label rather than wrapping onto a new row. The previous
16301
+ 2-column grid (`max-content auto`) treated icon / label-text /
16302
+ children as three grid items in two columns, forcing the third
16303
+ onto its own row. With flex, icon + label sit at the start and
16304
+ any actions trailing in `children` flow inline (and can push
16305
+ themselves to the far edge with `margin-left: auto`). */
16306
+ display: flex;
16307
+ align-items: center;
16200
16308
  padding: 0.5rem 0.5rem 0.5rem 0.5rem;
16201
16309
  font-size: var(--inspect-font-size-small);
16202
16310
  font-weight: 600;
16203
16311
  border-bottom: solid 1px var(--bs-light-border-subtle);
16204
16312
  }
16205
16313
 
16206
- ._headerContainer_gh2j2_1._headerModern_gh2j2_11 {
16314
+ ._headerContainer_19525_1._headerModern_19525_17 {
16207
16315
  color: var(--bs-secondary);
16208
16316
  padding: 0.25rem 0.5rem 0rem 0.5rem;
16209
16317
  border-bottom: none;
16210
16318
  background-color: var(--bs-body-bg);
16211
16319
  }
16212
16320
 
16213
- ._headerIcon_gh2j2_18:not(._headerIconEmpty_gh2j2_18) {
16321
+ ._headerIcon_19525_24:not(._headerIconEmpty_19525_24) {
16214
16322
  padding-right: 0.2rem;
16215
16323
  }
16216
16324
 
16217
- ._body_gh2j2_22 {
16325
+ ._body_19525_28 {
16218
16326
  background-color: var(--bs-body-bg);
16219
16327
  padding: 0.5rem !important;
16220
16328
  }
16221
16329
 
16222
- ._card_gh2j2_27 {
16330
+ ._card_19525_33 {
16223
16331
  background-color: var(--bs-body-bg);
16224
16332
  border: solid 1px var(--bs-light-border-subtle);
16225
16333
  border-radius: var(--bs-border-radius);
16226
16334
  overflow: hidden;
16227
16335
  }
16228
16336
 
16229
- ._body_gh2j2_22._noPadding_gh2j2_34 {
16337
+ ._body_19525_28._noPadding_19525_40 {
16230
16338
  padding: 0;
16231
16339
  }
16232
16340
  ._copyButton_1goi8_1 {
@@ -21850,6 +21958,413 @@ pre._value_8citi_25 {
21850
21958
  .message-band-btn.warning {
21851
21959
  color: var(--bs-warning-text-emphasis);
21852
21960
  }
21961
+ /* Shared chrome — variant-specific look in `.link` and `.pill` below. */
21962
+ ._button_u0dz8_2 {
21963
+ display: inline-flex;
21964
+ align-items: center;
21965
+ gap: 0.25rem;
21966
+ background: transparent;
21967
+ cursor: pointer;
21968
+ text-decoration: none;
21969
+ text-transform: none;
21970
+ /* Matches TagChip's line-height so chips and pills auto-size to the
21971
+ same height and descenders aren't clipped. Keep in sync with
21972
+ TagChip.module.css `.chip`. */
21973
+ line-height: 1.1;
21974
+ /* When the button sits in a flex row (the PrimaryBar tag strip),
21975
+ prevent it from being shrunk past its content width. */
21976
+ flex-shrink: 0;
21977
+ }
21978
+
21979
+ /* Link variant — used in card headers (e.g. the Metadata card header)
21980
+ where the action belongs next to the section title. Body-color text
21981
+ so it reads as part of the header rather than a link, with a hover
21982
+ tint to convey clickability. */
21983
+ ._link_u0dz8_1 {
21984
+ border: none;
21985
+ color: var(--bs-body-color);
21986
+ padding: 0.125rem 0.35rem;
21987
+ border-radius: 4px;
21988
+ /* Matches the pill variant's regular weight so the two Edit
21989
+ affordances (metadata card header, tag-strip pill) read at the
21990
+ same visual weight. */
21991
+ font-weight: 400;
21992
+ letter-spacing: 0;
21993
+ }
21994
+
21995
+ ._link_u0dz8_1:hover {
21996
+ background: var(--bs-secondary-bg);
21997
+ }
21998
+
21999
+ ._link_u0dz8_1:focus-visible {
22000
+ outline: 2px solid var(--bs-border-color);
22001
+ outline-offset: 1px;
22002
+ }
22003
+
22004
+ /* Pill variant — matches TagChip's outline-only style so the Edit
22005
+ button can sit at the end of a chip strip without competing for
22006
+ attention. Values here mirror TagChip.module.css `.chip`; keep
22007
+ them in sync if either changes. (Height auto-sizes from
22008
+ line-height + padding — no fixed height, so chip and pill stay
22009
+ visually aligned without drift if font-size changes.) */
22010
+ ._pill_u0dz8_1 {
22011
+ color: var(--bs-body-color);
22012
+ border: 1px solid var(--bs-border-color);
22013
+ border-radius: 999px;
22014
+ padding: 0.125rem 0.35rem;
22015
+ font-weight: 400;
22016
+ letter-spacing: 0.01em;
22017
+ }
22018
+
22019
+ ._pill_u0dz8_1:hover {
22020
+ background: var(--bs-secondary-bg);
22021
+ }
22022
+
22023
+ ._pill_u0dz8_1:focus-visible {
22024
+ outline: 2px solid var(--bs-border-color);
22025
+ outline-offset: 1px;
22026
+ }
22027
+ ._modal_8i1ew_1 {
22028
+ margin-left: auto;
22029
+ margin-right: auto;
22030
+ display: flex;
22031
+ flex: 1 1 auto;
22032
+ justify-content: center;
22033
+ max-width: 90vw;
22034
+ margin-top: 3rem;
22035
+ border-radius: var(--bs-border-radius);
22036
+ position: relative;
22037
+ z-index: 1050;
22038
+ }
22039
+
22040
+ /* Even vertical whitespace above and below the title across every
22041
+ Modal consumer (tags, metadata, scoring detail, …). An earlier
22042
+ `height: 2em` rule clamped the header below its natural padding-
22043
+ based height; the title still rendered, but how much of the
22044
+ padding survived varied by CSS load order, so some surfaces ended
22045
+ up visibly tighter than others. Setting padding explicitly removes
22046
+ that dependency. */
22047
+ ._header_8i1ew_21 {
22048
+ padding-top: 1rem;
22049
+ padding-bottom: 1rem;
22050
+ }
22051
+
22052
+ ._modalTitle_8i1ew_26 {
22053
+ font-weight: 600;
22054
+ }
22055
+
22056
+ ._btnClose_8i1ew_30 {
22057
+ height: 0.8em;
22058
+ width: 0.8em;
22059
+ }
22060
+
22061
+ /* Backdrop styling for the glass effect */
22062
+ ._backdrop_8i1ew_36 {
22063
+ position: fixed;
22064
+ top: 0;
22065
+ left: 0;
22066
+ width: 100%;
22067
+ height: 100%;
22068
+ background-color: var(--inspect-glass-color);
22069
+ opacity: var(--inspect-glass-opacity);
22070
+
22071
+ z-index: 1040;
22072
+ }
22073
+
22074
+ ._overflowVisible_8i1ew_48 {
22075
+ overflow: visible;
22076
+ }
22077
+
22078
+ ._overflowHidden_8i1ew_52 {
22079
+ overflow: hidden;
22080
+ }
22081
+
22082
+ ._overflowScroll_8i1ew_56 {
22083
+ overflow: scroll;
22084
+ }
22085
+
22086
+ ._overflowAuto_8i1ew_60 {
22087
+ overflow: auto;
22088
+ }
22089
+
22090
+ ._noPadding_8i1ew_64 {
22091
+ padding: 0;
22092
+ }
22093
+
22094
+ /* Used when a custom footer node is supplied via the `footer` prop —
22095
+ provides the consistent padding for consumer-supplied buttons.
22096
+ Background is left to the modal-content default (white) so this
22097
+ footer matches other modals across the viewer rather than getting
22098
+ the tinted rail look. */
22099
+ ._footerSlot_8i1ew_73 {
22100
+ padding: 0.75rem 1.125rem;
22101
+ }
22102
+ ._textarea_8mbr9_1 {
22103
+ font-family: var(--bs-font-monospace);
22104
+ font-size: 0.75rem;
22105
+ line-height: 1.5;
22106
+ padding: 0.4rem 0.625rem;
22107
+ resize: none;
22108
+ /* No inner scrollbar — the surrounding container (e.g. the metadata
22109
+ table scroll wrapper) handles overflow. The height is matched to
22110
+ scrollHeight, so a scrollbar would only appear from a transient
22111
+ measurement glitch. */
22112
+ overflow: hidden;
22113
+ /* Borderless, transparent flat-cell look so the textarea reads as
22114
+ part of the surrounding grid (and `rowNew` highlights bleed
22115
+ through unbroken). Overrides Bootstrap `form-control`'s border,
22116
+ border-radius, and focus box-shadow. */
22117
+ background: transparent;
22118
+ border: none;
22119
+ border-radius: 0;
22120
+ }
22121
+
22122
+ ._textarea_8mbr9_1:focus {
22123
+ outline: none;
22124
+ box-shadow: none;
22125
+ /* Subtle tinted background as the focus indicator — replaces the
22126
+ form-control blue ring with something that doesn't visually
22127
+ interrupt the grid. */
22128
+ background: var(--bs-tertiary-bg);
22129
+ }
22130
+ ._container_13ofn_1 {
22131
+ display: flex;
22132
+ flex-direction: column;
22133
+ gap: 0.2rem;
22134
+ color: var(--bs-secondary-color);
22135
+ font-style: italic;
22136
+ /* When placed in the dialog footer next to the action buttons, the
22137
+ summary needs to absorb the leftover horizontal space and shrink
22138
+ below its content width so individual lines can ellipsize rather
22139
+ than push the buttons off the right edge. `min-width: 0` is
22140
+ required because a flex item's default `min-width: auto` resolves
22141
+ to the intrinsic min-content width — which would defeat the
22142
+ ellipsis on long add/edit/remove lists. */
22143
+ flex: 1 1 0;
22144
+ min-width: 0;
22145
+ }
22146
+
22147
+ ._line_13ofn_18 {
22148
+ white-space: nowrap;
22149
+ overflow: hidden;
22150
+ text-overflow: ellipsis;
22151
+ }
22152
+
22153
+ ._label_13ofn_24 {
22154
+ font-weight: 600;
22155
+ font-style: normal;
22156
+ }
22157
+
22158
+ ._items_13ofn_29 {
22159
+ color: var(--bs-secondary-color);
22160
+ }
22161
+
22162
+ ._accentAdding_13ofn_33 {
22163
+ color: var(--bs-success-text-emphasis);
22164
+ }
22165
+
22166
+ ._accentEditing_13ofn_37 {
22167
+ color: var(--bs-warning-text-emphasis);
22168
+ }
22169
+
22170
+ ._accentRemoving_13ofn_41 {
22171
+ color: var(--bs-danger);
22172
+ }
22173
+ /* Shared chrome for EditTagsDialog and EditMetadataDialog. */
22174
+
22175
+ ._body_13gwg_3 {
22176
+ display: flex;
22177
+ flex-direction: column;
22178
+ gap: 1rem;
22179
+ }
22180
+
22181
+ ._section_13gwg_9 {
22182
+ display: flex;
22183
+ flex-direction: column;
22184
+ gap: 0.3rem;
22185
+ }
22186
+
22187
+ ._labelRow_13gwg_15 {
22188
+ display: flex;
22189
+ align-items: baseline;
22190
+ gap: 0.4rem;
22191
+ }
22192
+
22193
+ ._label_13gwg_15 {
22194
+ font-weight: 600;
22195
+ color: var(--bs-body-color);
22196
+ margin: 0;
22197
+ }
22198
+
22199
+ ._hint_13gwg_27 {
22200
+ /* `--inspect-hint-foreground` defaults to --bs-secondary-color but
22201
+ resolves to --vscode-descriptionForeground inside VS Code so the
22202
+ italic "optional" stays readable against dark editor themes. */
22203
+ color: var(--inspect-hint-foreground);
22204
+ font-weight: 400;
22205
+ font-style: italic;
22206
+ }
22207
+
22208
+ ._required_13gwg_36 {
22209
+ color: var(--bs-danger);
22210
+ margin-left: 0.15rem;
22211
+ }
22212
+
22213
+ ._divider_13gwg_41 {
22214
+ border: none;
22215
+ border-top: 1px solid var(--bs-border-color);
22216
+ margin: 0.15rem 0;
22217
+ }
22218
+
22219
+ ._provenance_13gwg_47 {
22220
+ display: flex;
22221
+ flex-direction: column;
22222
+ gap: 0.75rem;
22223
+ }
22224
+
22225
+ ._error_13gwg_53 {
22226
+ padding: 0.4rem 0.6rem;
22227
+ background: var(--bs-danger-bg-subtle);
22228
+ color: var(--bs-danger-text-emphasis);
22229
+ border: 1px solid var(--bs-danger-border-subtle);
22230
+ border-radius: var(--bs-border-radius);
22231
+ }
22232
+
22233
+ /* Footer layout: optional change-summary on the left, action buttons
22234
+ pinned to the right via `margin-left: auto` on `.footerActions` so
22235
+ the buttons stay flush right whether or not the summary is showing
22236
+ (it returns null when there are no pending changes). */
22237
+ ._footer_13gwg_62 {
22238
+ display: flex;
22239
+ align-items: center;
22240
+ gap: 0.75rem;
22241
+ width: 100%;
22242
+ }
22243
+
22244
+ ._footerActions_13gwg_62 {
22245
+ display: flex;
22246
+ align-items: center;
22247
+ gap: 0.5rem;
22248
+ margin-left: auto;
22249
+ }
22250
+ /* The scroll wrapper bounds the table's vertical reach so the add-key
22251
+ row, provenance fields, and footer stay on-screen no matter how many
22252
+ keys the user has. The chrome (border, rounded corners) moves to
22253
+ this element since the inner table now overflows scrollwise. */
22254
+ ._tableScroll_1i84k_5 {
22255
+ max-height: 40vh;
22256
+ overflow-y: auto;
22257
+ border: 1px solid var(--bs-border-color);
22258
+ border-radius: 6px;
22259
+ background: var(--bs-body-bg);
22260
+ }
22261
+
22262
+ /* Single grid spanning every row so columns line up uniformly across
22263
+ the whole table. Each row is a subgrid inheriting the parent track
22264
+ layout, which keeps row-level styling (divider, "new" highlight)
22265
+ attached to a single wrapper element rather than every cell. */
22266
+ ._table_1i84k_5 {
22267
+ display: grid;
22268
+ grid-template-columns: minmax(140px, 220px) 1fr auto;
22269
+ column-gap: 0.625rem;
22270
+ }
22271
+
22272
+ ._empty_1i84k_23 {
22273
+ padding: 0.75rem 0.875rem;
22274
+ color: var(--bs-secondary-color);
22275
+ /* Span all columns when the table is otherwise empty. */
22276
+ grid-column: 1 / -1;
22277
+ }
22278
+
22279
+ ._row_1i84k_30 {
22280
+ display: grid;
22281
+ grid-column: 1 / -1;
22282
+ grid-template-columns: subgrid;
22283
+ align-items: flex-start;
22284
+ }
22285
+
22286
+ ._rowDivider_1i84k_37 {
22287
+ border-top: 1px solid var(--bs-border-color);
22288
+ }
22289
+
22290
+ ._rowNew_1i84k_41 {
22291
+ background: var(--bs-success-bg-subtle);
22292
+ }
22293
+
22294
+ /* Padding lives on the individual cells (not the .row wrapper) so the
22295
+ subgrid tracks stay aligned to the parent's column lines — putting
22296
+ padding on the wrapper would shift its content inward and break the
22297
+ subgrid alignment. The first and last cells absorb the horizontal
22298
+ inset that previously came from `.row { padding-inline: 0.75rem }`.
22299
+
22300
+ No vertical padding on `.value`: the textarea's own internal padding
22301
+ (0.4rem top/bottom from AutogrowText) already provides breathing
22302
+ room within the edit box, and an outer pad makes the row feel
22303
+ over-stuffed. `.key` and `.remove` use a top inset that lines them
22304
+ up with the textarea's first text baseline. */
22305
+ ._key_1i84k_54 {
22306
+ font-family: var(--bs-font-monospace);
22307
+ word-break: break-all;
22308
+ padding: 0.4rem 0 0 0.75rem;
22309
+ }
22310
+
22311
+ ._value_1i84k_51 {
22312
+ min-width: 0;
22313
+ padding: 0;
22314
+ }
22315
+
22316
+ ._remove_1i84k_54 {
22317
+ background: transparent;
22318
+ border: none;
22319
+ padding: 0.4rem 0.75rem 0 0.4rem;
22320
+ color: var(--bs-secondary-color);
22321
+ cursor: pointer;
22322
+ border-radius: 4px;
22323
+ line-height: 1;
22324
+ }
22325
+
22326
+ ._remove_1i84k_54:hover {
22327
+ color: var(--bs-danger);
22328
+ background: var(--bs-tertiary-bg);
22329
+ }
22330
+
22331
+ ._remove_1i84k_54:disabled {
22332
+ cursor: default;
22333
+ opacity: 0.5;
22334
+ }
22335
+
22336
+ ._addRow_1i84k_87 {
22337
+ margin-top: 0.625rem;
22338
+ display: grid;
22339
+ grid-template-columns: 1fr 7.5rem auto;
22340
+ gap: 0.5rem;
22341
+ }
22342
+
22343
+ ._addKeyInput_1i84k_94 {
22344
+ min-width: 0;
22345
+ }
22346
+
22347
+ ._typeSelect_1i84k_98 {
22348
+ font-family: var(--bs-font-monospace);
22349
+ }
22350
+
22351
+ ._addButton_1i84k_102 {
22352
+ white-space: nowrap;
22353
+ }
22354
+ ._headerActions_1fn25_1 {
22355
+ /* CardHeader is a flex row (icon → label → children); pushing this
22356
+ wrapper with margin-left:auto sends the Edit affordance to the
22357
+ right edge of the header. */
22358
+ margin-left: auto;
22359
+ display: inline-flex;
22360
+ align-items: center;
22361
+ }
22362
+
22363
+ ._emptyMetadata_1fn25_10 {
22364
+ color: var(--bs-secondary-color);
22365
+ font-style: italic;
22366
+ padding: 0.25rem 0.5rem;
22367
+ }
21853
22368
  ._item_1uzhd_1 {
21854
22369
  margin-bottom: 0em;
21855
22370
  }
@@ -22260,85 +22775,148 @@ pre._value_8citi_25 {
22260
22775
  ._text_1yknn_20 {
22261
22776
  margin-top: -2px;
22262
22777
  }
22263
- ._grid_er9fb_1 {
22264
- display: grid;
22265
- grid-template-columns: fit-content(50%) fit-content(50%);
22266
- column-gap: 3em;
22267
- align-items: flex-start;
22778
+ ._chipBox_yxwie_1 {
22779
+ display: flex;
22780
+ flex-wrap: wrap;
22781
+ gap: 0.375rem;
22782
+ min-height: 2.25rem;
22783
+ padding: 0.375rem;
22784
+ border: 1px solid var(--bs-border-color);
22785
+ border-radius: var(--bs-border-radius);
22786
+ background: var(--bs-body-bg);
22268
22787
  }
22269
- ._button_12472_1 {
22788
+
22789
+ ._empty_yxwie_12 {
22790
+ color: var(--bs-secondary-color);
22791
+ padding: 0.2rem 0.25rem;
22792
+ }
22793
+
22794
+ ._addRow_yxwie_17 {
22270
22795
  display: flex;
22271
- border: none;
22272
- flex-direction: row;
22273
- background-color: unset;
22274
- color: var(--bs-link-color);
22796
+ gap: 0.5rem;
22797
+ margin-top: 0.5rem;
22275
22798
  }
22276
22799
 
22277
- ._button_12472_1:hover {
22278
- color: var(--bs-link-hover-color);
22279
- cursor: pointer;
22800
+ ._input_yxwie_23 {
22801
+ flex: 1;
22280
22802
  }
22281
22803
 
22282
- ._label_12472_14 {
22283
- margin-left: 0.4em;
22804
+ ._addButton_yxwie_27 {
22805
+ white-space: nowrap;
22284
22806
  }
22285
- ._modal_1tj8p_1 {
22286
- margin-left: auto;
22287
- margin-right: auto;
22288
- display: flex;
22289
- flex: 1 1 auto;
22290
- justify-content: center;
22291
- max-width: 90vw;
22292
- margin-top: 3rem;
22293
- border-radius: var(--bs-border-radius);
22294
- position: relative;
22295
- z-index: 1050;
22807
+ ._chip_17zs5_1 {
22808
+ display: inline-flex;
22809
+ align-items: center;
22810
+ gap: 0.25rem;
22811
+ padding: 0.125rem 0.35rem;
22812
+ /* Cap chip width so one giant tag can't push the inline Edit button
22813
+ off the right edge of the header. The label inside ellipsizes. */
22814
+ max-width: 18rem;
22815
+ min-width: 0;
22816
+ /* Outline-only look — transparent fill, body weight text. Keeps
22817
+ the chips from competing with the task title for visual weight. */
22818
+ background: transparent;
22819
+ color: var(--bs-body-color);
22820
+ border-radius: 999px;
22821
+ border: 1px solid var(--bs-border-color);
22822
+ letter-spacing: 0.01em;
22823
+ white-space: nowrap;
22824
+ /* When the chip is rendered as a <button> (clickable header chip),
22825
+ inherit the surrounding font so the user-agent button styling
22826
+ doesn't switch the text to system fonts at the wrong size. */
22827
+ font: inherit;
22828
+ /* line-height > 1 so the label's `overflow: hidden` box (used for
22829
+ ellipsis on long tags) contains the full glyph extent, including
22830
+ descenders on g/p/q/y/j. With line-height: 1 the box was exactly
22831
+ the font size and the bottom of descenders was clipped. The chip
22832
+ auto-sizes from this + padding instead of using a fixed height,
22833
+ so any future font-size change stays in proportion. */
22834
+ line-height: 1.1;
22296
22835
  }
22297
22836
 
22298
- ._header_1tj8p_14 {
22299
- height: 2em;
22837
+ ._chipLabel_17zs5_31 {
22838
+ overflow: hidden;
22839
+ text-overflow: ellipsis;
22840
+ white-space: nowrap;
22841
+ min-width: 0;
22300
22842
  }
22301
22843
 
22302
- ._modalTitle_1tj8p_18 {
22303
- font-weight: 600;
22844
+ /* Pending-add variant inside the editor: keep the green outline so it
22845
+ still reads as "new", but no fill (matches the saved-chip style). */
22846
+ ._chipNew_17zs5_40 {
22847
+ border-color: var(--bs-success-border-subtle);
22848
+ color: var(--bs-success-text-emphasis);
22304
22849
  }
22305
22850
 
22306
- ._btnClose_1tj8p_22 {
22307
- height: 0.8em;
22308
- width: 0.8em;
22851
+ /* Applied when the chip is rendered as a clickable <button> (header
22852
+ context). Mirrors the Edit/overflow pills' hover + focus treatment
22853
+ so the whole strip behaves consistently. */
22854
+ ._chipClickable_17zs5_48 {
22855
+ cursor: pointer;
22309
22856
  }
22310
22857
 
22311
- /* Backdrop styling for the glass effect */
22312
- ._backdrop_1tj8p_28 {
22313
- position: fixed;
22314
- top: 0;
22315
- left: 0;
22316
- width: 100%;
22317
- height: 100%;
22318
- background-color: var(--inspect-glass-color);
22319
- opacity: var(--inspect-glass-opacity);
22858
+ ._chipClickable_17zs5_48:hover {
22859
+ background: var(--bs-secondary-bg);
22860
+ }
22320
22861
 
22321
- z-index: 1040;
22862
+ ._chipClickable_17zs5_48:focus-visible {
22863
+ outline: 2px solid var(--bs-border-color);
22864
+ outline-offset: 1px;
22322
22865
  }
22323
22866
 
22324
- ._overflowVisible_1tj8p_40 {
22325
- overflow: visible;
22867
+ ._chipRemove_17zs5_61 {
22868
+ background: none;
22869
+ border: none;
22870
+ padding: 0;
22871
+ margin-left: 0.125rem;
22872
+ cursor: pointer;
22873
+ color: inherit;
22874
+ opacity: 0.7;
22875
+ display: inline-flex;
22876
+ align-items: center;
22877
+ line-height: 1;
22326
22878
  }
22327
22879
 
22328
- ._overflowHidden_1tj8p_44 {
22329
- overflow: hidden;
22880
+ ._chipRemove_17zs5_61:hover {
22881
+ opacity: 1;
22882
+ color: var(--bs-danger);
22883
+ }
22884
+ /* Base rules for the tag chip strip. Layout primitives only — context
22885
+ (alignment, margins, shrink behavior) is supplied by the consumer via
22886
+ the `className` prop. */
22887
+ ._tagRow_pg3wd_4 {
22888
+ display: inline-flex;
22889
+ flex-wrap: wrap;
22890
+ gap: 0.375rem;
22891
+ }
22892
+ ._grid_q7chi_1 {
22893
+ display: grid;
22894
+ grid-template-columns: fit-content(50%) fit-content(50%);
22895
+ column-gap: 3em;
22896
+ align-items: flex-start;
22330
22897
  }
22331
22898
 
22332
- ._overflowScroll_1tj8p_48 {
22333
- overflow: scroll;
22899
+ /* TaskTab-context override for <TagStrip>. Centers chips vertically
22900
+ inside the MetaDataGrid value cell so they line up with the "tags"
22901
+ label on the left. Base flex rules come from TagStrip.module.css. */
22902
+ ._tagPillAlign_q7chi_11 {
22903
+ align-items: center;
22904
+ }
22905
+ ._button_12472_1 {
22906
+ display: flex;
22907
+ border: none;
22908
+ flex-direction: row;
22909
+ background-color: unset;
22910
+ color: var(--bs-link-color);
22334
22911
  }
22335
22912
 
22336
- ._overflowAuto_1tj8p_52 {
22337
- overflow: auto;
22913
+ ._button_12472_1:hover {
22914
+ color: var(--bs-link-hover-color);
22915
+ cursor: pointer;
22338
22916
  }
22339
22917
 
22340
- ._noPadding_1tj8p_56 {
22341
- padding: 0;
22918
+ ._label_12472_14 {
22919
+ margin-left: 0.4em;
22342
22920
  }
22343
22921
  ._container_w43k4_1 {
22344
22922
  display: grid;
@@ -22636,55 +23214,90 @@ thead th {
22636
23214
  gap: 0.1em;
22637
23215
  padding-right: 1em;
22638
23216
  }
22639
- ._container_17txe_1 {
23217
+ ._container_1x0td_1 {
22640
23218
  display: flex;
22641
23219
  padding-top: 0;
22642
23220
  margin-left: 0.5rem;
22643
23221
  min-width: 250px;
22644
23222
  }
22645
23223
 
22646
- ._wrapper_17txe_8 {
23224
+ /* Body column expands to fill whatever space the right-hand results
23225
+ panel doesn't claim. Previously the right column was a fixed `1fr`
23226
+ share, so even on wide windows the title block was capped at ~half
23227
+ the wrapper — which forced the inline tag strip to wrap chips long
23228
+ before there was any real space pressure (large empty gap between
23229
+ the Edit button and the right column). With `auto` the results
23230
+ panel takes its natural width and the body absorbs the rest. */
23231
+ ._wrapper_1x0td_15 {
22647
23232
  display: grid;
22648
- grid-template-columns: minmax(auto, 1fr) 1fr;
23233
+ grid-template-columns: minmax(0, 1fr) auto;
22649
23234
  width: 100%;
22650
23235
  }
22651
23236
 
22652
- ._toggle_17txe_14 {
23237
+ ._toggle_1x0td_21 {
22653
23238
  margin-top: 0.3em;
22654
23239
  font-size: 1em;
22655
23240
  padding: 0rem 0.1rem 0.1rem 0rem;
22656
23241
  display: flex;
22657
23242
  }
22658
23243
 
22659
- ._body_17txe_21 {
23244
+ ._body_1x0td_28 {
22660
23245
  display: flex;
22661
23246
  flex-direction: column;
22662
23247
  margin-left: 0.2rem;
22663
23248
  }
22664
23249
 
22665
- ._bodyContainer_17txe_27 {
23250
+ /* Single-line flex row: title + model + tag chips. Items align by
23251
+ text baseline so the eval name, model name, and first row of chips
23252
+ all sit on the same line. (Subsequent wrapped chip rows fall below,
23253
+ inside the tag row's own box.) A small bottom margin reserves
23254
+ breathing room between the chip block and the secondary row
23255
+ (filename / copy / download). */
23256
+ ._bodyContainer_1x0td_40 {
22666
23257
  margin-top: 0.1rem;
22667
- display: grid;
22668
- grid-template-columns: minmax(30px, max-content) minmax(100px, max-content);
23258
+ margin-bottom: 0.4rem;
23259
+ display: flex;
23260
+ flex-wrap: nowrap;
23261
+ align-items: baseline;
23262
+ column-gap: 0.5rem;
23263
+ min-width: 0;
23264
+ }
23265
+
23266
+ /* Header-context overrides for <TagStrip>. The base flex rules
23267
+ (display/wrap/gap) live in TagStrip.module.css; this class adds the
23268
+ bits that only make sense inside the title+chips flex contention:
23269
+ - flex-shrink: 1 + min-width: 0 — the chip strip must shrink below
23270
+ its content width so chips wrap instead of pushing the trailing
23271
+ Edit pill past the right edge. (Default `min-width: auto`
23272
+ resolves to the content's intrinsic min and would prevent
23273
+ shrinking even with flex-shrink: 1.)
23274
+ Vertical alignment to the title/model baseline is handled by the
23275
+ parent `.bodyContainer`'s `align-items: baseline` — no margin or
23276
+ internal `align-items` is needed here. */
23277
+ ._tagRowHeader_1x0td_61 {
23278
+ flex-shrink: 1;
23279
+ min-width: 0;
22669
23280
  }
22670
23281
 
22671
- ._taskTitle_17txe_33 {
23282
+ ._taskTitle_1x0td_66 {
22672
23283
  font-weight: 600;
22673
- margin-right: 0.3rem;
23284
+ /* The eval name always renders in full — no ellipsis. The tag row
23285
+ wraps to additional lines instead of squeezing the title. */
23286
+ flex-shrink: 0;
22674
23287
  }
22675
23288
 
22676
- ._taskModel_17txe_38 {
22677
- padding-top: 0.4rem;
23289
+ ._taskModel_1x0td_73 {
23290
+ flex-shrink: 0;
22678
23291
  }
22679
23292
 
22680
- ._taskStatus_17txe_42 {
23293
+ ._taskStatus_1x0td_77 {
22681
23294
  display: flex;
22682
23295
  justify-content: end;
22683
23296
  margin-right: 1em;
22684
23297
  margin-bottom: 0;
22685
23298
  }
22686
23299
 
22687
- ._secondaryContainer_17txe_49 {
23300
+ ._secondaryContainer_1x0td_84 {
22688
23301
  opacity: 0.7;
22689
23302
  margin-top: -0.1rem;
22690
23303
  padding-bottom: 0;
@@ -22693,7 +23306,7 @@ thead th {
22693
23306
  gap: 0.5rem;
22694
23307
  }
22695
23308
 
22696
- ._buttonGroup_17txe_58 {
23309
+ ._buttonGroup_1x0td_93 {
22697
23310
  display: flex;
22698
23311
  gap: 0.15rem;
22699
23312
  align-items: center;