@magicfeedback/popup-sdk 1.9.0 → 1.11.0

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/README.md CHANGED
@@ -215,6 +215,26 @@ const renderer = new ReactNativePopupRenderer({
215
215
  `onReady` is optional: a host that opens its container on `onShow` still never shows the spinner,
216
216
  because the HTML reveals itself; the container just appears a few hundred ms before the card.
217
217
 
218
+ ### Focus on text questions
219
+
220
+ When the first question of a page is a text field (text, long text, email or number), the cursor
221
+ is placed in it so the user can start typing:
222
+
223
+ - **When the popup opens:** only on devices with a mouse or trackpad (`pointer: fine`). On touch
224
+ devices it does nothing, so the keyboard never pops up over a popup the user has not touched.
225
+ - **After Start, Next or Back:** on every device, since the user has just tapped.
226
+
227
+ Only the first question counts: if the page starts with a rating and the text field comes after
228
+ it, nothing is focused. The focus is never taken away from a field of the host page.
229
+
230
+ The focus itself comes from `@magicfeedback/native` (its `autofocus` option, which the popup sets
231
+ to `'navigation'`, and `focusFirstQuestion()` when the popup is revealed). Versions of
232
+ `@magicfeedback/native` without that option simply ignore it.
233
+
234
+ In React Native on iOS, the WebView ignores focus set from JavaScript unless the keyboard is
235
+ allowed to open without a direct tap. `DeepdotsProvider` already does this; if you mount the
236
+ WebView yourself, add `keyboardDisplayRequiresUserAction={false}` to it.
237
+
218
238
  ### `autoLaunch()`
219
239
 
220
240
  Starts the triggers derived from the popup definitions loaded during `init()`.
@@ -237,6 +257,8 @@ Example:
237
257
  popups.triggerEvent('search');
238
258
  ```
239
259
 
260
+ It can be called right after `init()`: if the popup definitions are still loading, the event is kept and evaluated as soon as they arrive (the same applies to `triggerSurvey`).
261
+
240
262
  ### `triggerSurvey(surveyId, popupId?)`
241
263
 
242
264
  Opens a specific survey directly, bypassing trigger evaluation.
@@ -500,7 +522,7 @@ interface DeepdotsEvent {
500
522
  - `action`
501
523
  - `userId`
502
524
 
503
- `popup_clicked` is a general interaction event. Depending on the flow, `data.action` can contain values such as `loaded`, `start_survey`, `manual_send`, `back`, `complete`, or `close_icon`.
525
+ `popup_clicked` means the user did something in the popup. On the web, `data.action` is one of `start_survey`, `manual_send`, `back`, `complete`, `close_icon`, or `partial` (the user answered a page and moved on; this one also marks the popup as `PARTIAL` in the backend). Loading the survey, the start of a submit, and validation or submit errors are not interactions and do not emit it. In React Native the bridge emits it once per popup, with `action: 'partial'`, on the first real interaction (sending an answer or going back).
504
526
 
505
527
  ## Important Behavior Notes
506
528
 
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * NO EDITAR A MANO — generado por scripts/vendor-survey-css.mjs
3
3
  *
4
- * Copia de @magicfeedback/native@2.2.22 → dist/styles/magicfeedback-default.css
4
+ * Copia de @magicfeedback/native@2.2.31 → dist/styles/magicfeedback-default.css
5
5
  * (la hoja canónica del paquete, la que apunta su campo "style"), con estos cambios locales:
6
6
  *
7
7
  * 1. Sin el @import de Google Fonts (Nunito): no queremos una petición externa desde la
@@ -985,6 +985,9 @@ div.magicfeedback-radio {
985
985
  width: 100%;
986
986
  overflow-x: auto;
987
987
  border-radius: var(--mf-radius-md);
988
+ /* the layout follows the space the survey gets (a pop-in, a sidebar),
989
+ not the size of the window */
990
+ container-type: inline-size;
988
991
  }
989
992
 
990
993
  .magicfeedback-multi-question-matrix-table {
@@ -1036,6 +1039,296 @@ div.magicfeedback-radio {
1036
1039
  accent-color: var(--mf-primary);
1037
1040
  }
1038
1041
 
1042
+ .magicfeedback-multi-question-matrix-question {
1043
+ min-width: 200px;
1044
+ padding: 10px;
1045
+ }
1046
+
1047
+ /* the column header names the option in a table; the per-cell label is for
1048
+ screen readers until the rows stack */
1049
+ .magicfeedback-multi-question-matrix-option-label {
1050
+ position: absolute;
1051
+ width: 1px;
1052
+ height: 1px;
1053
+ overflow: hidden;
1054
+ clip: rect(0, 0, 0, 0);
1055
+ white-space: nowrap;
1056
+ }
1057
+
1058
+ /* narrow container: every row becomes its own question with the options
1059
+ stacked underneath, instead of a table cut off at the side */
1060
+ @container (max-width: 599px) {
1061
+ .magicfeedback-multi-question-matrix-table,
1062
+ .magicfeedback-multi-question-matrix-table tbody,
1063
+ .magicfeedback-multi-question-matrix-table tr,
1064
+ .magicfeedback-multi-question-matrix-table td {
1065
+ display: block;
1066
+ width: 100%;
1067
+ }
1068
+
1069
+ .magicfeedback-multi-question-matrix-table thead {
1070
+ display: none;
1071
+ }
1072
+
1073
+ .magicfeedback-multi-question-matrix-row-tr,
1074
+ .magicfeedback-multi-question-matrix-row-tr:nth-child(even) {
1075
+ margin-bottom: var(--mf-space-lg);
1076
+ background: transparent;
1077
+ box-shadow: none;
1078
+ }
1079
+
1080
+ @media (hover: hover) {
1081
+ .magicfeedback-multi-question-matrix-row-tr:hover {
1082
+ margin-bottom: var(--mf-space-lg);
1083
+ background: transparent;
1084
+ box-shadow: none;
1085
+ }
1086
+ }
1087
+
1088
+ .magicfeedback-multi-question-matrix-table td.magicfeedback-multi-question-matrix-question {
1089
+ min-width: 0;
1090
+ padding: 0 0 var(--mf-space-sm);
1091
+ text-align: start;
1092
+ }
1093
+
1094
+ .magicfeedback-multi-question-matrix-question .magicfeedback-multi-question-matrix-label {
1095
+ font-weight: 600;
1096
+ }
1097
+
1098
+ .magicfeedback-multi-question-matrix-table td.magicfeedback-multi-question-matrix-option {
1099
+ display: flex;
1100
+ align-items: center;
1101
+ gap: var(--mf-space-sm);
1102
+ margin-bottom: var(--mf-space-sm);
1103
+ padding: 0 var(--mf-space-md);
1104
+ text-align: start;
1105
+ background: var(--mf-bg-secondary);
1106
+ border: 2px solid var(--mf-border);
1107
+ border-radius: var(--mf-radius-md);
1108
+ cursor: pointer;
1109
+ transition: var(--mf-transition-fast);
1110
+ }
1111
+
1112
+ @media (hover: hover) {
1113
+ .magicfeedback-multi-question-matrix-option:hover {
1114
+ border-color: var(--mf-primary-border);
1115
+ }
1116
+ }
1117
+
1118
+ .magicfeedback-multi-question-matrix-option:has(input:checked) {
1119
+ border-color: var(--mf-primary);
1120
+ background: var(--mf-primary-light);
1121
+ }
1122
+
1123
+ .magicfeedback-multi-question-matrix-table .magicfeedback-multi-question-matrix-option input[type="radio"] {
1124
+ flex-shrink: 0;
1125
+ }
1126
+
1127
+ /* the whole card is the click target */
1128
+ .magicfeedback-multi-question-matrix-option-label {
1129
+ position: static;
1130
+ flex: 1;
1131
+ width: auto;
1132
+ height: auto;
1133
+ padding: var(--mf-space-md) 0;
1134
+ overflow: visible;
1135
+ clip: auto;
1136
+ white-space: normal;
1137
+ font-size: var(--mf-font-size-base);
1138
+ color: var(--mf-text-primary);
1139
+ cursor: pointer;
1140
+ }
1141
+ }
1142
+
1143
+ /* ========================================
1144
+ MAXDIFF (BEST–WORST)
1145
+ ======================================== */
1146
+ .magicfeedback-max-diff {
1147
+ /* "least" gets its own hue, apart from the brand color "most" uses; dark
1148
+ enough to read as header text and to hold the white center dot */
1149
+ --mf-max-diff-worst: #b45309;
1150
+ width: 100%;
1151
+ }
1152
+
1153
+ .magicfeedback-max-diff-container {
1154
+ width: 100%;
1155
+ /* the layout follows the space the survey gets (a pop-in, a sidebar),
1156
+ not the size of the window */
1157
+ container-type: inline-size;
1158
+ }
1159
+
1160
+ .magicfeedback-max-diff-progress {
1161
+ display: flex;
1162
+ align-items: center;
1163
+ gap: var(--mf-space-md);
1164
+ margin-bottom: var(--mf-space-lg);
1165
+ }
1166
+
1167
+ .magicfeedback-max-diff-progress-label {
1168
+ font-size: 0.8125rem;
1169
+ font-weight: var(--mf-font-weight-bold);
1170
+ letter-spacing: 0.04em;
1171
+ text-transform: uppercase;
1172
+ white-space: nowrap;
1173
+ color: var(--mf-text-secondary);
1174
+ }
1175
+
1176
+ .magicfeedback-max-diff-progress-track {
1177
+ flex: 1;
1178
+ height: 6px;
1179
+ overflow: hidden;
1180
+ border-radius: var(--mf-radius-full);
1181
+ background: var(--mf-border);
1182
+ }
1183
+
1184
+ .magicfeedback-max-diff-progress-fill {
1185
+ display: block;
1186
+ height: 100%;
1187
+ border-radius: var(--mf-radius-full);
1188
+ background: var(--mf-primary);
1189
+ }
1190
+
1191
+ .magicfeedback-max-diff-table {
1192
+ width: 100%;
1193
+ border-collapse: collapse;
1194
+ }
1195
+
1196
+ .magicfeedback-max-diff-head,
1197
+ .magicfeedback-max-diff-head-spacer {
1198
+ border-bottom: 1px solid var(--mf-border);
1199
+ }
1200
+
1201
+ .magicfeedback-max-diff-head {
1202
+ width: 11rem;
1203
+ padding: 0 var(--mf-space-sm) var(--mf-space-sm);
1204
+ font-size: 0.8125rem;
1205
+ font-weight: var(--mf-font-weight-extrabold);
1206
+ letter-spacing: 0.04em;
1207
+ text-transform: uppercase;
1208
+ text-align: center;
1209
+ vertical-align: bottom;
1210
+ }
1211
+
1212
+ .magicfeedback-max-diff-head-best {
1213
+ color: var(--mf-primary);
1214
+ }
1215
+
1216
+ .magicfeedback-max-diff-head-worst {
1217
+ color: var(--mf-max-diff-worst);
1218
+ }
1219
+
1220
+ .magicfeedback-max-diff-head-label {
1221
+ display: inline-flex;
1222
+ align-items: center;
1223
+ gap: 6px;
1224
+ }
1225
+
1226
+ .magicfeedback-max-diff-row {
1227
+ transition: background-color 0.15s ease;
1228
+ }
1229
+
1230
+ .magicfeedback-max-diff-row > * {
1231
+ border-bottom: 1px solid var(--mf-border);
1232
+ }
1233
+
1234
+ .magicfeedback-max-diff-row:has(.magicfeedback-max-diff-best:checked) {
1235
+ background-color: color-mix(in srgb, var(--mf-primary) 8%, transparent);
1236
+ }
1237
+
1238
+ .magicfeedback-max-diff-row:has(.magicfeedback-max-diff-worst:checked) {
1239
+ background-color: color-mix(in srgb, var(--mf-max-diff-worst) 8%, transparent);
1240
+ }
1241
+
1242
+ .magicfeedback-max-diff-item {
1243
+ padding: var(--mf-space-md) var(--mf-space-sm);
1244
+ font-size: 1.0625rem;
1245
+ font-weight: var(--mf-font-weight-semibold);
1246
+ line-height: 1.4;
1247
+ text-align: center;
1248
+ color: var(--mf-text-primary);
1249
+ }
1250
+
1251
+ .magicfeedback-max-diff-row:has(input:checked) .magicfeedback-max-diff-item {
1252
+ font-weight: var(--mf-font-weight-extrabold);
1253
+ }
1254
+
1255
+ .magicfeedback-max-diff-cell {
1256
+ padding: 0;
1257
+ }
1258
+
1259
+ /* the whole cell is the click target */
1260
+ .magicfeedback-max-diff-pick {
1261
+ display: flex;
1262
+ align-items: center;
1263
+ justify-content: center;
1264
+ min-height: 64px;
1265
+ cursor: pointer;
1266
+ }
1267
+
1268
+ .magicfeedback-max-diff-input {
1269
+ appearance: none;
1270
+ -webkit-appearance: none;
1271
+ flex-shrink: 0;
1272
+ width: 26px;
1273
+ height: 26px;
1274
+ margin: 0;
1275
+ border: 2px solid color-mix(in srgb, var(--mf-text-secondary) 80%, white);
1276
+ border-radius: var(--mf-radius-full);
1277
+ background: var(--mf-bg-secondary);
1278
+ cursor: pointer;
1279
+ transition: var(--mf-transition-fast);
1280
+ }
1281
+
1282
+ @media (hover: hover) {
1283
+ .magicfeedback-max-diff-pick:hover .magicfeedback-max-diff-input {
1284
+ transform: scale(1.08);
1285
+ }
1286
+ }
1287
+
1288
+ .magicfeedback-max-diff-best:checked {
1289
+ border-color: var(--mf-primary);
1290
+ background: radial-gradient(circle, #FFFFFF 0 4px, var(--mf-primary) 4.5px);
1291
+ }
1292
+
1293
+ .magicfeedback-max-diff-worst:checked {
1294
+ border-color: var(--mf-max-diff-worst);
1295
+ background: radial-gradient(circle, #FFFFFF 0 4px, var(--mf-max-diff-worst) 4.5px);
1296
+ }
1297
+
1298
+ .magicfeedback-max-diff-input:focus-visible {
1299
+ outline: 3px solid var(--mf-primary-border);
1300
+ outline-offset: 3px;
1301
+ }
1302
+
1303
+ /* narrow container: same table, slimmer pick columns and the header icon
1304
+ stacked over its label */
1305
+ @container (max-width: 599px) {
1306
+ .magicfeedback-max-diff-head {
1307
+ width: 4.75rem;
1308
+ padding-inline: 2px;
1309
+ font-size: 0.6875rem;
1310
+ }
1311
+
1312
+ .magicfeedback-max-diff-head-label {
1313
+ flex-direction: column;
1314
+ gap: 2px;
1315
+ }
1316
+
1317
+ .magicfeedback-max-diff-item {
1318
+ padding-inline: 4px;
1319
+ font-size: var(--mf-font-size-base);
1320
+ }
1321
+
1322
+ .magicfeedback-max-diff-pick {
1323
+ min-height: 68px;
1324
+ }
1325
+
1326
+ .magicfeedback-max-diff-input {
1327
+ width: 28px;
1328
+ height: 28px;
1329
+ }
1330
+ }
1331
+
1039
1332
  /* ========================================
1040
1333
  PRIORITY LIST
1041
1334
  ======================================== */
@@ -1226,6 +1519,15 @@ div.magicfeedback-radio {
1226
1519
  }
1227
1520
  }
1228
1521
 
1522
+ /* hidden on the first page; keep the submit button on the right */
1523
+ .magicfeedback-back[hidden] {
1524
+ display: none;
1525
+ }
1526
+
1527
+ .magicfeedback-action-container .magicfeedback-submit {
1528
+ margin-left: auto;
1529
+ }
1530
+
1229
1531
  /* ========================================
1230
1532
  SKIP & COUNTER
1231
1533
  ======================================== */
@@ -524,7 +524,7 @@ function ddSetSurveyBusy(el, busy){
524
524
  var style_default = `/**
525
525
  * NO EDITAR A MANO \u2014 generado por scripts/vendor-survey-css.mjs
526
526
  *
527
- * Copia de @magicfeedback/native@2.2.22 \u2192 dist/styles/magicfeedback-default.css
527
+ * Copia de @magicfeedback/native@2.2.31 \u2192 dist/styles/magicfeedback-default.css
528
528
  * (la hoja can\xF3nica del paquete, la que apunta su campo "style"), con estos cambios locales:
529
529
  *
530
530
  * 1. Sin el @import de Google Fonts (Nunito): no queremos una petici\xF3n externa desde la
@@ -1508,6 +1508,9 @@ div.magicfeedback-radio {
1508
1508
  width: 100%;
1509
1509
  overflow-x: auto;
1510
1510
  border-radius: var(--mf-radius-md);
1511
+ /* the layout follows the space the survey gets (a pop-in, a sidebar),
1512
+ not the size of the window */
1513
+ container-type: inline-size;
1511
1514
  }
1512
1515
 
1513
1516
  .magicfeedback-multi-question-matrix-table {
@@ -1559,6 +1562,296 @@ div.magicfeedback-radio {
1559
1562
  accent-color: var(--mf-primary);
1560
1563
  }
1561
1564
 
1565
+ .magicfeedback-multi-question-matrix-question {
1566
+ min-width: 200px;
1567
+ padding: 10px;
1568
+ }
1569
+
1570
+ /* the column header names the option in a table; the per-cell label is for
1571
+ screen readers until the rows stack */
1572
+ .magicfeedback-multi-question-matrix-option-label {
1573
+ position: absolute;
1574
+ width: 1px;
1575
+ height: 1px;
1576
+ overflow: hidden;
1577
+ clip: rect(0, 0, 0, 0);
1578
+ white-space: nowrap;
1579
+ }
1580
+
1581
+ /* narrow container: every row becomes its own question with the options
1582
+ stacked underneath, instead of a table cut off at the side */
1583
+ @container (max-width: 599px) {
1584
+ .magicfeedback-multi-question-matrix-table,
1585
+ .magicfeedback-multi-question-matrix-table tbody,
1586
+ .magicfeedback-multi-question-matrix-table tr,
1587
+ .magicfeedback-multi-question-matrix-table td {
1588
+ display: block;
1589
+ width: 100%;
1590
+ }
1591
+
1592
+ .magicfeedback-multi-question-matrix-table thead {
1593
+ display: none;
1594
+ }
1595
+
1596
+ .magicfeedback-multi-question-matrix-row-tr,
1597
+ .magicfeedback-multi-question-matrix-row-tr:nth-child(even) {
1598
+ margin-bottom: var(--mf-space-lg);
1599
+ background: transparent;
1600
+ box-shadow: none;
1601
+ }
1602
+
1603
+ @media (hover: hover) {
1604
+ .magicfeedback-multi-question-matrix-row-tr:hover {
1605
+ margin-bottom: var(--mf-space-lg);
1606
+ background: transparent;
1607
+ box-shadow: none;
1608
+ }
1609
+ }
1610
+
1611
+ .magicfeedback-multi-question-matrix-table td.magicfeedback-multi-question-matrix-question {
1612
+ min-width: 0;
1613
+ padding: 0 0 var(--mf-space-sm);
1614
+ text-align: start;
1615
+ }
1616
+
1617
+ .magicfeedback-multi-question-matrix-question .magicfeedback-multi-question-matrix-label {
1618
+ font-weight: 600;
1619
+ }
1620
+
1621
+ .magicfeedback-multi-question-matrix-table td.magicfeedback-multi-question-matrix-option {
1622
+ display: flex;
1623
+ align-items: center;
1624
+ gap: var(--mf-space-sm);
1625
+ margin-bottom: var(--mf-space-sm);
1626
+ padding: 0 var(--mf-space-md);
1627
+ text-align: start;
1628
+ background: var(--mf-bg-secondary);
1629
+ border: 2px solid var(--mf-border);
1630
+ border-radius: var(--mf-radius-md);
1631
+ cursor: pointer;
1632
+ transition: var(--mf-transition-fast);
1633
+ }
1634
+
1635
+ @media (hover: hover) {
1636
+ .magicfeedback-multi-question-matrix-option:hover {
1637
+ border-color: var(--mf-primary-border);
1638
+ }
1639
+ }
1640
+
1641
+ .magicfeedback-multi-question-matrix-option:has(input:checked) {
1642
+ border-color: var(--mf-primary);
1643
+ background: var(--mf-primary-light);
1644
+ }
1645
+
1646
+ .magicfeedback-multi-question-matrix-table .magicfeedback-multi-question-matrix-option input[type="radio"] {
1647
+ flex-shrink: 0;
1648
+ }
1649
+
1650
+ /* the whole card is the click target */
1651
+ .magicfeedback-multi-question-matrix-option-label {
1652
+ position: static;
1653
+ flex: 1;
1654
+ width: auto;
1655
+ height: auto;
1656
+ padding: var(--mf-space-md) 0;
1657
+ overflow: visible;
1658
+ clip: auto;
1659
+ white-space: normal;
1660
+ font-size: var(--mf-font-size-base);
1661
+ color: var(--mf-text-primary);
1662
+ cursor: pointer;
1663
+ }
1664
+ }
1665
+
1666
+ /* ========================================
1667
+ MAXDIFF (BEST\u2013WORST)
1668
+ ======================================== */
1669
+ .magicfeedback-max-diff {
1670
+ /* "least" gets its own hue, apart from the brand color "most" uses; dark
1671
+ enough to read as header text and to hold the white center dot */
1672
+ --mf-max-diff-worst: #b45309;
1673
+ width: 100%;
1674
+ }
1675
+
1676
+ .magicfeedback-max-diff-container {
1677
+ width: 100%;
1678
+ /* the layout follows the space the survey gets (a pop-in, a sidebar),
1679
+ not the size of the window */
1680
+ container-type: inline-size;
1681
+ }
1682
+
1683
+ .magicfeedback-max-diff-progress {
1684
+ display: flex;
1685
+ align-items: center;
1686
+ gap: var(--mf-space-md);
1687
+ margin-bottom: var(--mf-space-lg);
1688
+ }
1689
+
1690
+ .magicfeedback-max-diff-progress-label {
1691
+ font-size: 0.8125rem;
1692
+ font-weight: var(--mf-font-weight-bold);
1693
+ letter-spacing: 0.04em;
1694
+ text-transform: uppercase;
1695
+ white-space: nowrap;
1696
+ color: var(--mf-text-secondary);
1697
+ }
1698
+
1699
+ .magicfeedback-max-diff-progress-track {
1700
+ flex: 1;
1701
+ height: 6px;
1702
+ overflow: hidden;
1703
+ border-radius: var(--mf-radius-full);
1704
+ background: var(--mf-border);
1705
+ }
1706
+
1707
+ .magicfeedback-max-diff-progress-fill {
1708
+ display: block;
1709
+ height: 100%;
1710
+ border-radius: var(--mf-radius-full);
1711
+ background: var(--mf-primary);
1712
+ }
1713
+
1714
+ .magicfeedback-max-diff-table {
1715
+ width: 100%;
1716
+ border-collapse: collapse;
1717
+ }
1718
+
1719
+ .magicfeedback-max-diff-head,
1720
+ .magicfeedback-max-diff-head-spacer {
1721
+ border-bottom: 1px solid var(--mf-border);
1722
+ }
1723
+
1724
+ .magicfeedback-max-diff-head {
1725
+ width: 11rem;
1726
+ padding: 0 var(--mf-space-sm) var(--mf-space-sm);
1727
+ font-size: 0.8125rem;
1728
+ font-weight: var(--mf-font-weight-extrabold);
1729
+ letter-spacing: 0.04em;
1730
+ text-transform: uppercase;
1731
+ text-align: center;
1732
+ vertical-align: bottom;
1733
+ }
1734
+
1735
+ .magicfeedback-max-diff-head-best {
1736
+ color: var(--mf-primary);
1737
+ }
1738
+
1739
+ .magicfeedback-max-diff-head-worst {
1740
+ color: var(--mf-max-diff-worst);
1741
+ }
1742
+
1743
+ .magicfeedback-max-diff-head-label {
1744
+ display: inline-flex;
1745
+ align-items: center;
1746
+ gap: 6px;
1747
+ }
1748
+
1749
+ .magicfeedback-max-diff-row {
1750
+ transition: background-color 0.15s ease;
1751
+ }
1752
+
1753
+ .magicfeedback-max-diff-row > * {
1754
+ border-bottom: 1px solid var(--mf-border);
1755
+ }
1756
+
1757
+ .magicfeedback-max-diff-row:has(.magicfeedback-max-diff-best:checked) {
1758
+ background-color: color-mix(in srgb, var(--mf-primary) 8%, transparent);
1759
+ }
1760
+
1761
+ .magicfeedback-max-diff-row:has(.magicfeedback-max-diff-worst:checked) {
1762
+ background-color: color-mix(in srgb, var(--mf-max-diff-worst) 8%, transparent);
1763
+ }
1764
+
1765
+ .magicfeedback-max-diff-item {
1766
+ padding: var(--mf-space-md) var(--mf-space-sm);
1767
+ font-size: 1.0625rem;
1768
+ font-weight: var(--mf-font-weight-semibold);
1769
+ line-height: 1.4;
1770
+ text-align: center;
1771
+ color: var(--mf-text-primary);
1772
+ }
1773
+
1774
+ .magicfeedback-max-diff-row:has(input:checked) .magicfeedback-max-diff-item {
1775
+ font-weight: var(--mf-font-weight-extrabold);
1776
+ }
1777
+
1778
+ .magicfeedback-max-diff-cell {
1779
+ padding: 0;
1780
+ }
1781
+
1782
+ /* the whole cell is the click target */
1783
+ .magicfeedback-max-diff-pick {
1784
+ display: flex;
1785
+ align-items: center;
1786
+ justify-content: center;
1787
+ min-height: 64px;
1788
+ cursor: pointer;
1789
+ }
1790
+
1791
+ .magicfeedback-max-diff-input {
1792
+ appearance: none;
1793
+ -webkit-appearance: none;
1794
+ flex-shrink: 0;
1795
+ width: 26px;
1796
+ height: 26px;
1797
+ margin: 0;
1798
+ border: 2px solid color-mix(in srgb, var(--mf-text-secondary) 80%, white);
1799
+ border-radius: var(--mf-radius-full);
1800
+ background: var(--mf-bg-secondary);
1801
+ cursor: pointer;
1802
+ transition: var(--mf-transition-fast);
1803
+ }
1804
+
1805
+ @media (hover: hover) {
1806
+ .magicfeedback-max-diff-pick:hover .magicfeedback-max-diff-input {
1807
+ transform: scale(1.08);
1808
+ }
1809
+ }
1810
+
1811
+ .magicfeedback-max-diff-best:checked {
1812
+ border-color: var(--mf-primary);
1813
+ background: radial-gradient(circle, #FFFFFF 0 4px, var(--mf-primary) 4.5px);
1814
+ }
1815
+
1816
+ .magicfeedback-max-diff-worst:checked {
1817
+ border-color: var(--mf-max-diff-worst);
1818
+ background: radial-gradient(circle, #FFFFFF 0 4px, var(--mf-max-diff-worst) 4.5px);
1819
+ }
1820
+
1821
+ .magicfeedback-max-diff-input:focus-visible {
1822
+ outline: 3px solid var(--mf-primary-border);
1823
+ outline-offset: 3px;
1824
+ }
1825
+
1826
+ /* narrow container: same table, slimmer pick columns and the header icon
1827
+ stacked over its label */
1828
+ @container (max-width: 599px) {
1829
+ .magicfeedback-max-diff-head {
1830
+ width: 4.75rem;
1831
+ padding-inline: 2px;
1832
+ font-size: 0.6875rem;
1833
+ }
1834
+
1835
+ .magicfeedback-max-diff-head-label {
1836
+ flex-direction: column;
1837
+ gap: 2px;
1838
+ }
1839
+
1840
+ .magicfeedback-max-diff-item {
1841
+ padding-inline: 4px;
1842
+ font-size: var(--mf-font-size-base);
1843
+ }
1844
+
1845
+ .magicfeedback-max-diff-pick {
1846
+ min-height: 68px;
1847
+ }
1848
+
1849
+ .magicfeedback-max-diff-input {
1850
+ width: 28px;
1851
+ height: 28px;
1852
+ }
1853
+ }
1854
+
1562
1855
  /* ========================================
1563
1856
  PRIORITY LIST
1564
1857
  ======================================== */
@@ -1749,6 +2042,15 @@ div.magicfeedback-radio {
1749
2042
  }
1750
2043
  }
1751
2044
 
2045
+ /* hidden on the first page; keep the submit button on the right */
2046
+ .magicfeedback-back[hidden] {
2047
+ display: none;
2048
+ }
2049
+
2050
+ .magicfeedback-action-container .magicfeedback-submit {
2051
+ margin-left: auto;
2052
+ }
2053
+
1752
2054
  /* ========================================
1753
2055
  SKIP & COUNTER
1754
2056
  ======================================== */
@@ -2439,4 +2741,4 @@ export {
2439
2741
  sdkWarn,
2440
2742
  sdkError
2441
2743
  };
2442
- //# sourceMappingURL=chunk-MTV7T4OW.mjs.map
2744
+ //# sourceMappingURL=chunk-GXEPYT33.mjs.map