symbiote-ui 0.3.0-alpha.64 → 0.3.0-alpha.65

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,13 @@ All notable changes to `symbiote-ui` will be documented in this file.
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## [0.3.0-alpha.65] - 2026-07-18
8
+
9
+ ### Fixed
10
+
11
+ - Kept compact composer parameters on the same action row at narrow widths.
12
+ - Preserved full native select hit areas and explicit accessible names when footer controls collapse to icon-only presentation.
13
+
7
14
  ## [0.3.0-alpha.64] - 2026-07-18
8
15
 
9
16
  ### Added
@@ -417,6 +417,7 @@ sn-button.btn-send[variant="icon"].btn-stop::after {
417
417
 
418
418
  .composer-footer-select-control {
419
419
  padding-right: var(--sn-step-2);
420
+ position: relative;
420
421
  }
421
422
 
422
423
  .composer-footer-checkbox-control {
@@ -464,20 +465,27 @@ sn-button.btn-send[variant="icon"].btn-stop::after {
464
465
  text-overflow: ellipsis;
465
466
  }
466
467
 
467
- .composer-param-collapsed .composer-footer-select,
468
- .composer-param-collapsed .composer-footer-label,
469
- .composer-param-collapsed .composer-footer-value,
470
- .composer-param-collapsed .composer-footer-suffix {
471
- width: var(--sn-composer-collapsed-control-width);
472
- max-width: var(--sn-composer-collapsed-control-width);
473
- padding-right: var(--sn-composer-collapsed-control-padding);
474
- color: transparent !important;
468
+ .composer-param-collapsed {
469
+ --sn-is-collapsed: 1;
475
470
  }
476
471
 
477
- .composer-param-collapsed .composer-footer-label,
478
- .composer-param-collapsed .composer-footer-value,
479
- .composer-param-collapsed .composer-footer-suffix {
480
- display: none;
472
+ @container style(--sn-is-collapsed: 1) {
473
+ .composer-footer-select {
474
+ position: absolute;
475
+ inset: 0;
476
+ width: 100%;
477
+ min-width: var(--sn-composer-collapsed-control-width);
478
+ height: 100%;
479
+ box-sizing: border-box;
480
+ padding-right: var(--sn-composer-collapsed-control-padding);
481
+ opacity: 0;
482
+ z-index: 1;
483
+ cursor: pointer;
484
+ }
485
+
486
+ :is(.composer-footer-label, .composer-footer-value, .composer-footer-suffix) {
487
+ display: none;
488
+ }
481
489
  }
482
490
 
483
491
  .composer-footer-details-popover {
@@ -786,108 +794,33 @@ sn-button.btn-send[variant="icon"].btn-stop::after {
786
794
  }
787
795
 
788
796
  @container composer-footer (width <= 560px) {
789
- .composer-priority-1 .composer-footer-select,
790
- .composer-priority-1 .composer-footer-label,
791
- .composer-priority-1 .composer-footer-value,
792
- .composer-priority-1 .composer-footer-suffix {
793
- width: var(--sn-composer-collapsed-control-width);
794
- max-width: var(--sn-composer-collapsed-control-width);
795
- padding-right: var(--sn-composer-collapsed-control-padding);
796
- color: transparent !important;
797
- }
798
-
799
- .composer-priority-1 .composer-footer-label,
800
- .composer-priority-1 .composer-footer-value,
801
- .composer-priority-1 .composer-footer-suffix {
802
- display: none;
797
+ .composer-priority-1 {
798
+ --sn-is-collapsed: 1;
803
799
  }
804
800
  }
805
801
 
806
802
  @container composer-footer (width <= 500px) {
807
- .composer-param-model.composer-long-value .composer-footer-select,
808
- .composer-param-model.composer-long-value .composer-footer-label,
809
- .composer-param-model.composer-long-value .composer-footer-value,
810
- .composer-param-model.composer-long-value .composer-footer-suffix {
811
- width: var(--sn-composer-collapsed-control-width);
812
- max-width: var(--sn-composer-collapsed-control-width);
813
- padding-right: var(--sn-composer-collapsed-control-padding);
814
- color: transparent !important;
815
- }
816
-
817
- .composer-param-model.composer-long-value .composer-footer-label,
818
- .composer-param-model.composer-long-value .composer-footer-value,
819
- .composer-param-model.composer-long-value .composer-footer-suffix {
820
- display: none;
821
- }
822
-
823
- .composer-priority-2 .composer-footer-select,
824
- .composer-priority-2 .composer-footer-label,
825
- .composer-priority-2 .composer-footer-value,
826
- .composer-priority-2 .composer-footer-suffix {
827
- width: var(--sn-composer-collapsed-control-width);
828
- max-width: var(--sn-composer-collapsed-control-width);
829
- padding-right: var(--sn-composer-collapsed-control-padding);
830
- color: transparent !important;
831
- }
832
-
833
- .composer-priority-2 .composer-footer-label,
834
- .composer-priority-2 .composer-footer-value,
835
- .composer-priority-2 .composer-footer-suffix {
836
- display: none;
803
+ .composer-param-model.composer-long-value,
804
+ .composer-priority-2 {
805
+ --sn-is-collapsed: 1;
837
806
  }
838
807
  }
839
808
 
840
809
  @container composer-footer (width <= 440px) {
841
- .composer-priority-3 .composer-footer-select,
842
- .composer-priority-3 .composer-footer-label,
843
- .composer-priority-3 .composer-footer-value,
844
- .composer-priority-3 .composer-footer-suffix {
845
- width: var(--sn-composer-collapsed-control-width);
846
- max-width: var(--sn-composer-collapsed-control-width);
847
- padding-right: var(--sn-composer-collapsed-control-padding);
848
- color: transparent !important;
849
- }
850
-
851
- .composer-priority-3 .composer-footer-label,
852
- .composer-priority-3 .composer-footer-value,
853
- .composer-priority-3 .composer-footer-suffix {
854
- display: none;
810
+ .composer-priority-3 {
811
+ --sn-is-collapsed: 1;
855
812
  }
856
813
  }
857
814
 
858
815
  @container composer-footer (width <= 380px) {
859
- .composer-priority-4 .composer-footer-select,
860
- .composer-priority-4 .composer-footer-label,
861
- .composer-priority-4 .composer-footer-value,
862
- .composer-priority-4 .composer-footer-suffix {
863
- width: var(--sn-composer-collapsed-control-width);
864
- max-width: var(--sn-composer-collapsed-control-width);
865
- padding-right: var(--sn-composer-collapsed-control-padding);
866
- color: transparent !important;
867
- }
868
-
869
- .composer-priority-4 .composer-footer-label,
870
- .composer-priority-4 .composer-footer-value,
871
- .composer-priority-4 .composer-footer-suffix {
872
- display: none;
816
+ .composer-priority-4 {
817
+ --sn-is-collapsed: 1;
873
818
  }
874
819
  }
875
820
 
876
821
  @container composer-footer (width <= 320px) {
877
- .composer-priority-5 .composer-footer-select,
878
- .composer-priority-5 .composer-footer-label,
879
- .composer-priority-5 .composer-footer-value,
880
- .composer-priority-5 .composer-footer-suffix {
881
- width: var(--sn-composer-collapsed-control-width);
882
- max-width: var(--sn-composer-collapsed-control-width);
883
- padding-right: var(--sn-composer-collapsed-control-padding);
884
- color: transparent !important;
885
- }
886
-
887
- .composer-priority-5 .composer-footer-label,
888
- .composer-priority-5 .composer-footer-value,
889
- .composer-priority-5 .composer-footer-suffix {
890
- display: none;
822
+ .composer-priority-5 {
823
+ --sn-is-collapsed: 1;
891
824
  }
892
825
  }
893
826
 
@@ -1231,67 +1164,6 @@ chat-composer.drag-over .composer-body {
1231
1164
  }
1232
1165
 
1233
1166
  @container chat-composer (width <= 480px) {
1234
- .composer-body {
1235
- grid-template-columns: auto minmax(0, 1fr) auto auto;
1236
- grid-template-rows: minmax(var(--sn-composer-input-min-height), auto) auto auto;
1237
- }
1238
-
1239
- :host([leading-controls]) .composer-body,
1240
- chat-composer[leading-controls] .composer-body {
1241
- grid-template-columns: auto minmax(0, 1fr) auto auto;
1242
- }
1243
-
1244
- :host([leading-controls]) .composer-leading-controls,
1245
- chat-composer[leading-controls] .composer-leading-controls {
1246
- grid-column: 1;
1247
- grid-row: 3;
1248
- }
1249
-
1250
- :host([leading-controls]) .composer-body textarea,
1251
- chat-composer[leading-controls] .composer-body textarea {
1252
- grid-column: 1 / -1;
1253
- }
1254
-
1255
- .composer-footer {
1256
- grid-column: 1 / -1;
1257
- grid-row: 2;
1258
- }
1259
-
1260
- .composer-actions {
1261
- grid-column: 2;
1262
- grid-row: 3;
1263
- width: auto;
1264
- max-width: min(54cqi, var(--sn-composer-actions-max-inline-size, 460px));
1265
- flex-wrap: nowrap;
1266
- overflow: hidden;
1267
- }
1268
-
1269
- .btn-mic {
1270
- grid-column: 3;
1271
- grid-row: 3;
1272
- align-self: end;
1273
- }
1274
-
1275
- .composer-body > sn-button.btn-send {
1276
- grid-column: 4;
1277
- grid-row: 3;
1278
- }
1279
-
1280
- :host([leading-controls]) .composer-actions,
1281
- chat-composer[leading-controls] .composer-actions {
1282
- grid-column: 2;
1283
- }
1284
-
1285
- :host([leading-controls]) .btn-mic,
1286
- chat-composer[leading-controls] .btn-mic {
1287
- grid-column: 3;
1288
- }
1289
-
1290
- :host([leading-controls]) .composer-body > sn-button.btn-send,
1291
- chat-composer[leading-controls] .composer-body > sn-button.btn-send {
1292
- grid-column: 4;
1293
- }
1294
-
1295
1167
  .btn-voice-language {
1296
1168
  min-width: calc(var(--sn-composer-send-size) * 2.2);
1297
1169
  max-width: calc(var(--sn-composer-send-size) * 2.6);
@@ -168,6 +168,7 @@ function decorateFooterControl(item) {
168
168
  let meterValue = normalizeProgress(meterSource.value ?? meterSource.progress ?? details?.progress ?? item.progress ?? 0);
169
169
  let meterLabel = String(meterSource.label || '');
170
170
  let meterTitle = String(meterSource.title || details?.title || item.title || item.label || item.id || '');
171
+ let accessibleName = String(item.title || item.label || item.id || '');
171
172
  let hasMeter = Boolean(item.meter || details);
172
173
  let baseClass = [
173
174
  'composer-footer-btn',
@@ -220,6 +221,7 @@ function decorateFooterControl(item) {
220
221
  hasMeter,
221
222
  hasMeterLabel: Boolean(meterLabel),
222
223
  meterStyle: progressStyle(meterValue),
224
+ accessibleName,
223
225
  options,
224
226
  };
225
227
  }
@@ -1732,7 +1734,7 @@ ChatComposer.template = html`
1732
1734
  <label ${{ '@class': 'selectClass', '@data-footer-control-id': 'id', '@data-footer-control-kind': 'kind', '@title': 'title', '@hidden': '!isSelect' }}>
1733
1735
  <span class="material-symbols-outlined" ${{ '@hidden': '!hasIcon' }}>{{icon}}</span>
1734
1736
  <span class="composer-footer-label" ${{ '@hidden': '!hasLabel' }}>{{label}}</span>
1735
- <select class="composer-footer-select" ${{ '@data-footer-control-id': 'id', '@data-footer-control-kind': 'kind', '@disabled': 'disabled' }} itemize="options">
1737
+ <select class="composer-footer-select" ${{ '@data-footer-control-id': 'id', '@data-footer-control-kind': 'kind', '@disabled': 'disabled', '@aria-label': 'accessibleName' }} itemize="options">
1736
1738
  <template>
1737
1739
  <option ${{ '@value': 'value', '@selected': 'selected' }}>{{label}}</option>
1738
1740
  </template>
@@ -1741,7 +1743,7 @@ ChatComposer.template = html`
1741
1743
  </label>
1742
1744
  <label ${{ '@class': 'checkboxClass', '@data-footer-control-id': 'id', '@data-footer-control-kind': 'kind', '@title': 'title', '@hidden': '!isCheckbox' }}>
1743
1745
  <span class="material-symbols-outlined" ${{ '@hidden': '!hasIcon' }}>{{icon}}</span>
1744
- <input class="composer-footer-checkbox" type="checkbox" ${{ '@data-footer-control-id': 'id', '@data-footer-control-kind': 'kind', checked: 'checked', '@disabled': 'disabled' }}>
1746
+ <input class="composer-footer-checkbox" type="checkbox" ${{ '@data-footer-control-id': 'id', '@data-footer-control-kind': 'kind', checked: 'checked', '@disabled': 'disabled', '@aria-label': 'accessibleName' }}>
1745
1747
  <span class="composer-footer-label" ${{ '@hidden': '!hasLabel' }}>{{label}}</span>
1746
1748
  </label>
1747
1749
  <button type="button" ${{ '@class': 'buttonClass', '@data-footer-control-id': 'id', '@data-footer-control-kind': 'kind', '@title': 'title', '@disabled': 'disabled', '@hidden': '!isButton' }}>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "symbiote-ui",
3
- "version": "0.3.0-alpha.64",
3
+ "version": "0.3.0-alpha.65",
4
4
  "type": "module",
5
5
  "description": "Agent-ready Web Components, layouts, themes, manifests, and UI contracts for Symbiote systems.",
6
6
  "main": "index.js",