neba 1.16.1 → 1.17.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.
Files changed (189) hide show
  1. package/README.md +5 -5
  2. package/dist/a2ui/adapter-catalog.json +1 -0
  3. package/dist/a2ui/catalog.json +632 -145
  4. package/dist/a2ui/components.js +1 -1
  5. package/dist/a2ui/index.d.ts +22 -10
  6. package/dist/a2ui/index.js +1 -1
  7. package/dist/a2ui/schema.d.ts +8 -6
  8. package/dist/a2ui/schema.js +1 -1
  9. package/dist/components/accordion/Accordion.js +1 -1
  10. package/dist/components/agent-steps/AgentSteps.js +1 -1
  11. package/dist/components/alert/Alert.js +1 -1
  12. package/dist/components/anchor/Anchor.d.ts +3 -1
  13. package/dist/components/anchor/Anchor.js +1 -1
  14. package/dist/components/animate-counter/AnimateCounter.d.ts +11 -4
  15. package/dist/components/animate-counter/AnimateCounter.js +1 -1
  16. package/dist/components/animate-scramble/AnimateScramble.d.ts +6 -3
  17. package/dist/components/animate-scramble/AnimateScramble.js +1 -1
  18. package/dist/components/animate-split/AnimateSplit.d.ts +6 -3
  19. package/dist/components/animate-split/AnimateSplit.js +1 -1
  20. package/dist/components/animate-typing/AnimateTyping.js +1 -1
  21. package/dist/components/app-logo/AppLogo.js +1 -1
  22. package/dist/components/approval/Approval.js +1 -1
  23. package/dist/components/avatar/Avatar.js +1 -1
  24. package/dist/components/bar-chart/BarChart.js +1 -1
  25. package/dist/components/bottom-navigation/BottomNavigation.js +1 -1
  26. package/dist/components/box/Box.js +1 -1
  27. package/dist/components/breadcrumb/Breadcrumb.d.ts +3 -3
  28. package/dist/components/breadcrumb/Breadcrumb.js +1 -1
  29. package/dist/components/card/Card.js +1 -1
  30. package/dist/components/chat-bubble/ChatBubble.js +1 -1
  31. package/dist/components/chip/Chip.d.ts +4 -1
  32. package/dist/components/chip/Chip.js +1 -1
  33. package/dist/components/code-block/CodeBlock.js +1 -1
  34. package/dist/components/collapsible/Collapsible.js +1 -1
  35. package/dist/components/color-picker/ColorPicker.d.ts +13 -3
  36. package/dist/components/color-picker/ColorPicker.js +1 -1
  37. package/dist/components/combobox/Combobox.d.ts +9 -2
  38. package/dist/components/combobox/Combobox.js +1 -1
  39. package/dist/components/command-palette/CommandPalette.js +1 -1
  40. package/dist/components/confirm/Confirm.js +1 -1
  41. package/dist/components/context-window/ContextWindow.d.ts +4 -1
  42. package/dist/components/context-window/ContextWindow.js +1 -1
  43. package/dist/components/data-list/DataList.d.ts +3 -2
  44. package/dist/components/data-list/DataList.js +1 -1
  45. package/dist/components/data-table/DataTable.d.ts +11 -5
  46. package/dist/components/data-table/DataTable.js +1 -1
  47. package/dist/components/date-picker/DatePicker.js +1 -1
  48. package/dist/components/date-range-picker/DateRangePicker.d.ts +3 -2
  49. package/dist/components/date-range-picker/DateRangePicker.js +1 -1
  50. package/dist/components/date-time-picker/DateTimePicker.js +1 -1
  51. package/dist/components/dialog/Dialog.js +1 -1
  52. package/dist/components/drawer/Drawer.js +1 -1
  53. package/dist/components/fieldset/Fieldset.js +1 -1
  54. package/dist/components/file-picker/FilePicker.d.ts +4 -0
  55. package/dist/components/file-picker/FilePicker.js +1 -1
  56. package/dist/components/footer/Footer.d.ts +4 -2
  57. package/dist/components/form/Form.d.ts +0 -14
  58. package/dist/components/form/Form.js +1 -1
  59. package/dist/components/gallery/Gallery.js +1 -1
  60. package/dist/components/gallery/GalleryViewer.js +1 -1
  61. package/dist/components/header/Header.d.ts +4 -3
  62. package/dist/components/heatmap-chart/HeatmapChart.js +1 -1
  63. package/dist/components/hover-card/HoverCard.d.ts +1 -1
  64. package/dist/components/how-to-steps/HowToSteps.d.ts +2 -1
  65. package/dist/components/how-to-steps/HowToSteps.js +1 -1
  66. package/dist/components/image/Image.d.ts +4 -1
  67. package/dist/components/image/Image.js +1 -1
  68. package/dist/components/inline-citation/InlineCitation.d.ts +4 -2
  69. package/dist/components/inline-citation/InlineCitation.js +1 -1
  70. package/dist/components/menu/Menu.d.ts +6 -2
  71. package/dist/components/menu/Menu.js +1 -1
  72. package/dist/components/mockup/Mockup.js +1 -1
  73. package/dist/components/navigation-menu/NavigationMenu.d.ts +1 -1
  74. package/dist/components/navigation-menu/NavigationMenu.js +1 -1
  75. package/dist/components/number-field/NumberField.d.ts +9 -4
  76. package/dist/components/number-field/NumberField.js +1 -1
  77. package/dist/components/overlay/Overlay.d.ts +1 -1
  78. package/dist/components/page-layout/PageLayout.js +1 -1
  79. package/dist/components/pagination/Pagination.d.ts +3 -2
  80. package/dist/components/panes/Panes.js +1 -1
  81. package/dist/components/pie-chart/PieChart.js +1 -1
  82. package/dist/components/pill/Pill.js +1 -1
  83. package/dist/components/popover/Popover.js +1 -1
  84. package/dist/components/progress-box/ProgressBox.js +1 -1
  85. package/dist/components/prompt-input/PromptInput.d.ts +5 -3
  86. package/dist/components/prompt-input/PromptInput.js +1 -1
  87. package/dist/components/provider/NebaProvider.d.ts +2 -2
  88. package/dist/components/provider/NebaProvider.js +1 -1
  89. package/dist/components/radio-group/RadioGroup.js +1 -1
  90. package/dist/components/rating/Rating.js +1 -1
  91. package/dist/components/reasoning/Reasoning.d.ts +7 -4
  92. package/dist/components/reasoning/Reasoning.js +1 -1
  93. package/dist/components/scatter-chart/ScatterChart.d.ts +7 -1
  94. package/dist/components/scatter-chart/ScatterChart.js +1 -1
  95. package/dist/components/scroll-area/ScrollArea.d.ts +12 -0
  96. package/dist/components/scroll-area/ScrollArea.js +1 -1
  97. package/dist/components/scroll-zone/ScrollZone.js +1 -1
  98. package/dist/components/segmented-button/SegmentedButton.js +1 -1
  99. package/dist/components/select/Select.d.ts +10 -2
  100. package/dist/components/select/Select.js +1 -1
  101. package/dist/components/sidebar/Sidebar.js +1 -1
  102. package/dist/components/sidebar/SidebarTrigger.js +1 -1
  103. package/dist/components/skeleton/Skeleton.js +1 -1
  104. package/dist/components/sources/Sources.d.ts +1 -1
  105. package/dist/components/sources/Sources.js +1 -1
  106. package/dist/components/stack/Stack.js +1 -1
  107. package/dist/components/streaming-text/StreamingText.js +1 -1
  108. package/dist/components/switch/Switch.d.ts +13 -2
  109. package/dist/components/switch/Switch.js +1 -1
  110. package/dist/components/switch/index.d.ts +1 -1
  111. package/dist/components/table/Table.d.ts +4 -2
  112. package/dist/components/tabs/Tabs.js +1 -1
  113. package/dist/components/text-field/TextField.d.ts +13 -5
  114. package/dist/components/text-field/TextField.js +1 -1
  115. package/dist/components/text-link/TextLink.js +1 -1
  116. package/dist/components/time-picker/TimePicker.js +1 -1
  117. package/dist/components/timeline-chart/TimelineChart.d.ts +6 -1
  118. package/dist/components/timeline-chart/TimelineChart.js +1 -1
  119. package/dist/components/toggle/Toggle.js +1 -1
  120. package/dist/components/tool-call/ToolCall.js +1 -1
  121. package/dist/components/tour/Tour.js +1 -1
  122. package/dist/components/transfer/Transfer.js +1 -1
  123. package/dist/components/tree-select/TreeSelect.js +1 -1
  124. package/dist/components/tree-view/TreeView.js +1 -1
  125. package/dist/components/typography/Typography.js +1 -1
  126. package/dist/components/visually-hidden/VisuallyHidden.d.ts +2 -2
  127. package/dist/components/window-pane/WindowPane.js +1 -1
  128. package/dist/hooks/useElementSize.d.ts +6 -2
  129. package/dist/hooks/useElementSize.js +1 -1
  130. package/dist/hooks/useMediaQuery.d.ts +3 -2
  131. package/dist/hooks/useOnScreen.d.ts +2 -2
  132. package/dist/hooks/useShortcut.d.ts +11 -3
  133. package/dist/hooks/useShortcut.js +1 -1
  134. package/dist/internal/animate.d.ts +8 -0
  135. package/dist/internal/animate.js +1 -1
  136. package/dist/internal/calendar.js +1 -1
  137. package/dist/internal/chart-brush.d.ts +3 -1
  138. package/dist/internal/chart-brush.js +1 -1
  139. package/dist/internal/chart-frame.d.ts +28 -2
  140. package/dist/internal/chart-frame.js +1 -1
  141. package/dist/internal/chart-line.js +1 -1
  142. package/dist/internal/chart.d.ts +21 -0
  143. package/dist/internal/chart.js +1 -1
  144. package/dist/internal/defaults.d.ts +8 -4
  145. package/dist/internal/drag.d.ts +15 -0
  146. package/dist/internal/drag.js +1 -1
  147. package/dist/internal/drop.d.ts +12 -8
  148. package/dist/internal/drop.js +1 -1
  149. package/dist/internal/highlight.js +1 -1
  150. package/dist/internal/i18n.d.ts +40 -4
  151. package/dist/internal/i18n.js +1 -1
  152. package/dist/internal/icons.d.ts +3 -0
  153. package/dist/internal/icons.js +1 -1
  154. package/dist/internal/link.d.ts +27 -0
  155. package/dist/internal/link.js +1 -1
  156. package/dist/internal/new-tab.d.ts +19 -0
  157. package/dist/internal/new-tab.js +1 -0
  158. package/dist/internal/notch.d.ts +102 -0
  159. package/dist/internal/notch.js +1 -0
  160. package/dist/internal/observe.d.ts +3 -4
  161. package/dist/internal/picker.d.ts +30 -4
  162. package/dist/internal/picker.js +1 -1
  163. package/dist/internal/run.d.ts +7 -5
  164. package/dist/internal/run.js +1 -1
  165. package/dist/internal/search.d.ts +3 -3
  166. package/dist/internal/styles.d.ts +56 -0
  167. package/dist/internal/styles.js +1 -1
  168. package/dist/locales/ar.js +1 -1
  169. package/dist/locales/de.js +1 -1
  170. package/dist/locales/es.js +1 -1
  171. package/dist/locales/fr.js +1 -1
  172. package/dist/locales/hi.js +1 -1
  173. package/dist/locales/id.js +1 -1
  174. package/dist/locales/it.js +1 -1
  175. package/dist/locales/ja.js +1 -1
  176. package/dist/locales/ko.js +1 -1
  177. package/dist/locales/nl.js +1 -1
  178. package/dist/locales/pl.js +1 -1
  179. package/dist/locales/pt.js +1 -1
  180. package/dist/locales/ru.js +1 -1
  181. package/dist/locales/th.js +1 -1
  182. package/dist/locales/tr.js +1 -1
  183. package/dist/locales/vi.js +1 -1
  184. package/dist/locales/zh-hans.js +1 -1
  185. package/dist/locales/zh-hant.js +1 -1
  186. package/dist/styles.css +1 -1
  187. package/dist/tailwind.css +287 -3
  188. package/dist/types.d.ts +18 -0
  189. package/package.json +23 -17
package/dist/tailwind.css CHANGED
@@ -1177,6 +1177,267 @@
1177
1177
  }
1178
1178
  }
1179
1179
 
1180
+ /* ---------------------------------------------------------------------------
1181
+ * The notch
1182
+ *
1183
+ * A field whose label stands on its top edge: `labelPlacement` `notch` or
1184
+ * `float`. The shell drops its own edge, and `internal/notch.tsx` draws one in
1185
+ * three pieces on a grid: the start, as wide as the corner's radius; the gap,
1186
+ * as wide as the label because the label sits in its column; and the end, which
1187
+ * takes the rest. The gap has no top line, and that missing line is the notch.
1188
+ *
1189
+ * Every piece reads its colour out of `--n-notch-line` and its top light out of
1190
+ * `--n-notch-top`, which the rules below set from the variant and from the state
1191
+ * of the element the notch sits in: the shell, or for a Select the frame that
1192
+ * holds the notch beside its trigger. The ring
1193
+ * is each piece's `::before`, two pixels outside it, and like every ring in the
1194
+ * library it is declared at no width and arrives in colour.
1195
+ *
1196
+ * It is CSS rather than Tailwind because the conditions are relations between
1197
+ * three elements — the holder's hover and focus, the control's emptiness and
1198
+ * the notch itself — and the Tailwind spelling of "a later sibling of an empty
1199
+ * input whose parent has no focus" is not something anybody should have to read.
1200
+ * ------------------------------------------------------------------------- */
1201
+
1202
+ /* The shell, and the label's width under it at no height, in one cell. */
1203
+ .neba-notch-frame {
1204
+ position: relative;
1205
+ display: grid;
1206
+ }
1207
+
1208
+ .neba-notch-frame > * {
1209
+ grid-area: 1 / 1;
1210
+ }
1211
+
1212
+ .neba-notch-sizer {
1213
+ height: 0;
1214
+ overflow: hidden;
1215
+ visibility: hidden;
1216
+ white-space: nowrap;
1217
+ padding-inline: calc(var(--n-notch-r) + var(--n-notch-gap));
1218
+ font-size: var(--n-float-size);
1219
+ }
1220
+
1221
+ .neba-notch-sizer[data-sample]::before {
1222
+ content: attr(data-sample);
1223
+ }
1224
+
1225
+ /* The same label at the size it rests at, where it starts where the text
1226
+ would and stops short of what is drawn at the end. */
1227
+ .neba-notch-sizer.neba-notch-sizer-rest {
1228
+ font-size: var(--n-rest-size);
1229
+ padding-inline: calc(var(--n-notch-r) + var(--n-notch-gap) + var(--n-rest-x))
1230
+ calc(var(--n-notch-r) + var(--n-notch-gap) + var(--n-rest-end, 0px));
1231
+ }
1232
+
1233
+ .neba-notch {
1234
+ position: absolute;
1235
+ inset: var(--n-notch-inset, 0);
1236
+ display: grid;
1237
+ grid-template-columns:
1238
+ var(--n-notch-r)
1239
+ fit-content(calc(100% - 2 * var(--n-notch-r) - var(--n-label-less, 0px)))
1240
+ minmax(var(--n-notch-r), 1fr);
1241
+ grid-template-rows: 100%;
1242
+ border-radius: inherit;
1243
+ pointer-events: none;
1244
+
1245
+ /* The label on the edge, and the gap open under it. A resting label swaps
1246
+ every one of these below. */
1247
+ --n-label-top: calc(0.5px - var(--n-float-leading) / 2);
1248
+ --n-label-x: 0px;
1249
+ --n-label-size: var(--n-float-size);
1250
+ --n-label-leading: var(--n-float-leading);
1251
+ --n-gap-line: transparent;
1252
+ --n-gap-top: transparent;
1253
+ }
1254
+
1255
+ .neba-notch[data-variant='outline'] {
1256
+ --n-notch-line: var(--n-line);
1257
+ --n-notch-top: var(--neba-plate-top);
1258
+ }
1259
+
1260
+ .neba-notch[data-variant='solid'] {
1261
+ --n-notch-line: var(--neba-plate-edge);
1262
+ --n-notch-top: var(--neba-plate-top);
1263
+ }
1264
+
1265
+ @media (hover: hover) {
1266
+ :hover > .neba-notch[data-variant='outline']:not([data-state]) {
1267
+ --n-notch-line: var(--n-line-hover);
1268
+ }
1269
+ }
1270
+
1271
+ /* After the hover rule and at its specificity, so a pointer resting on a
1272
+ focused field leaves the edge the colour of the ring it is flush against. */
1273
+ :focus-within > .neba-notch[data-variant='outline']:not([data-state]) {
1274
+ --n-notch-line: var(--n-ring);
1275
+ }
1276
+
1277
+ .neba-notch[data-state='disabled'] {
1278
+ --n-notch-top: transparent;
1279
+ }
1280
+
1281
+ .neba-notch[data-state='disabled'][data-variant='outline'] {
1282
+ --n-notch-line: var(--neba-disabled-border);
1283
+ }
1284
+
1285
+ .neba-notch[data-state='disabled'][data-variant='solid'] {
1286
+ --n-notch-line: transparent;
1287
+ }
1288
+
1289
+ .neba-notch-start,
1290
+ .neba-notch-gap,
1291
+ .neba-notch-end {
1292
+ position: relative;
1293
+ grid-row: 1;
1294
+ border: 0 solid var(--n-notch-line, transparent);
1295
+ border-block-width: 1px;
1296
+ box-shadow: inset 0 1px 0 var(--n-notch-top, transparent);
1297
+ transition:
1298
+ border-color var(--neba-duration) var(--neba-ease),
1299
+ box-shadow var(--neba-duration) var(--neba-ease);
1300
+ }
1301
+
1302
+ .neba-notch-start {
1303
+ grid-column: 1;
1304
+ border-inline-start-width: 1px;
1305
+ border-start-start-radius: inherit;
1306
+ border-end-start-radius: inherit;
1307
+ }
1308
+
1309
+ .neba-notch-gap {
1310
+ grid-column: 2;
1311
+ border-top-color: var(--n-gap-line);
1312
+ box-shadow: inset 0 1px 0 var(--n-gap-top);
1313
+ }
1314
+
1315
+ .neba-notch-end {
1316
+ grid-column: 3;
1317
+ border-inline-end-width: 1px;
1318
+ border-start-end-radius: inherit;
1319
+ border-end-end-radius: inherit;
1320
+ }
1321
+
1322
+ /* The ring, drawn over the two pixels outside each piece. The radius is the
1323
+ corner's plus the ring's own width, so its inner edge meets the hairline. */
1324
+ .neba-notch-start::before,
1325
+ .neba-notch-gap::before,
1326
+ .neba-notch-end::before {
1327
+ content: '';
1328
+ position: absolute;
1329
+ inset-block: -3px;
1330
+ border: 0 solid transparent;
1331
+ transition: border-color var(--neba-duration) var(--neba-ease);
1332
+ }
1333
+
1334
+ .neba-notch-start::before {
1335
+ inset-inline: -3px 0;
1336
+ border-start-start-radius: calc(var(--n-notch-r) + 2px);
1337
+ border-end-start-radius: calc(var(--n-notch-r) + 2px);
1338
+ }
1339
+
1340
+ .neba-notch-gap::before {
1341
+ inset-inline: 0;
1342
+ }
1343
+
1344
+ .neba-notch-end::before {
1345
+ inset-inline: 0 -3px;
1346
+ border-start-end-radius: calc(var(--n-notch-r) + 2px);
1347
+ border-end-end-radius: calc(var(--n-notch-r) + 2px);
1348
+ }
1349
+
1350
+ /* Only the bottom of the gap: a field with the focus in it has its label on
1351
+ the edge, so the top of the gap is always open when the ring is drawn. */
1352
+ :has(:focus-visible) > .neba-notch > .neba-notch-start::before {
1353
+ border-color: var(--n-ring);
1354
+ border-block-width: 2px;
1355
+ border-inline-start-width: 2px;
1356
+ }
1357
+
1358
+ :has(:focus-visible) > .neba-notch > .neba-notch-gap::before {
1359
+ border-color: var(--n-ring);
1360
+ border-block-end-width: 2px;
1361
+ }
1362
+
1363
+ :has(:focus-visible) > .neba-notch > .neba-notch-end::before {
1364
+ border-color: var(--n-ring);
1365
+ border-block-width: 2px;
1366
+ border-inline-end-width: 2px;
1367
+ }
1368
+
1369
+ /*
1370
+ * The label, centred on the edge line. It moves on `top` and
1371
+ * `inset-inline-start` and changes size on `font-size`, never on a transform:
1372
+ * it is set again at every size on the way rather than scaled, so no frame of
1373
+ * it is a resampled picture of the word.
1374
+ *
1375
+ * A press goes straight through it to what is underneath. A resting label
1376
+ * covers most of the control, and a Select opens on the pointer going down on
1377
+ * its trigger, which a `<label>` in front of it would swallow; the input
1378
+ * under a field's label is where the caret belongs anyway.
1379
+ */
1380
+ .neba-notch-label {
1381
+ grid-area: 1 / 2;
1382
+ align-self: start;
1383
+ position: relative;
1384
+ top: var(--n-label-top);
1385
+ inset-inline-start: var(--n-label-x);
1386
+ min-width: 0;
1387
+ padding-inline: var(--n-notch-gap);
1388
+ overflow: hidden;
1389
+ white-space: nowrap;
1390
+ text-overflow: ellipsis;
1391
+ font-size: var(--n-label-size);
1392
+ line-height: var(--n-label-leading);
1393
+ transition-property: top, inset-inline-start, font-size, line-height, color;
1394
+ transition-duration: var(--neba-duration);
1395
+ transition-timing-function: var(--neba-ease);
1396
+ }
1397
+
1398
+ /*
1399
+ * A `float` label at rest: set in the control's own text, where the text would
1400
+ * start, with the gap closed over it. Three ways to know the field is empty,
1401
+ * one per kind of control — an input's `:placeholder-shown`, a trigger's
1402
+ * `data-placeholder`, and `data-empty` from a component that has no control to
1403
+ * ask — and the same rule for all three: nothing inside the holder has the
1404
+ * focus and nothing is open. Autofill counts as a value before the reader has
1405
+ * accepted it, because the text is already drawn where the label would be.
1406
+ */
1407
+ :not(:focus-within) > .neba-float-control:placeholder-shown:not(:autofill) ~ .neba-notch-float,
1408
+ :not(:focus-within)
1409
+ > .neba-float-control[data-placeholder]:not([data-popup-open])
1410
+ ~ .neba-notch-float,
1411
+ :not(:focus-within) > .neba-notch-float[data-empty] {
1412
+ --n-label-top: var(--n-rest-top);
1413
+ --n-label-x: var(--n-rest-x);
1414
+ --n-label-size: var(--n-rest-size);
1415
+ --n-label-leading: var(--n-rest-leading);
1416
+ --n-label-ink: var(--neba-muted-fg);
1417
+ /* The label is moved along by where the text starts, and must stop where
1418
+ the end adornments begin, so its column gives up both. */
1419
+ --n-label-less: calc(var(--n-rest-x) + var(--n-rest-end, 0px));
1420
+ --n-gap-line: var(--n-notch-line, transparent);
1421
+ --n-gap-top: var(--n-notch-top, transparent);
1422
+ }
1423
+
1424
+ /* And the placeholder it is standing in for, which comes back with the focus.
1425
+ Everything inside a trigger's placeholder as well as the placeholder itself:
1426
+ a DateRangePicker's is two words and an arrow, each with an ink of its own.
1427
+ Spelled out rather than as `:is([data-placeholder] *)`, which would also match
1428
+ the chevron — a Select's trigger carries `data-placeholder` itself. */
1429
+ .neba-float-control::placeholder,
1430
+ .neba-float-control [data-placeholder],
1431
+ .neba-float-control [data-placeholder] * {
1432
+ transition: color var(--neba-duration) var(--neba-ease);
1433
+ }
1434
+
1435
+ .neba-float-control:not(:focus)::placeholder,
1436
+ .neba-float-control:not(:focus):not([data-popup-open]) [data-placeholder],
1437
+ .neba-float-control:not(:focus):not([data-popup-open]) [data-placeholder] * {
1438
+ color: transparent;
1439
+ }
1440
+
1180
1441
  /* ---------------------------------------------------------------------------
1181
1442
  * Forced colours
1182
1443
  *
@@ -1200,6 +1461,13 @@
1200
1461
  outline-offset: -1px;
1201
1462
  }
1202
1463
 
1464
+ /* A forced palette paints a transparent line too, so a notched shell's own
1465
+ border and the closed top of the gap are both drawn through the label.
1466
+ The page under a forced palette is opaque, and so is this. */
1467
+ .neba-notch-label.neba-notch-label {
1468
+ background-color: Canvas;
1469
+ }
1470
+
1203
1471
  /* Behind `@supports` as well, which every browser that can be in a forced
1204
1472
  palette passes: a colour that cannot opt out of the palette would be
1205
1473
  replaced by it, and a fill the same colour as its track says nothing. */
@@ -1228,6 +1496,22 @@
1228
1496
  .neba-switch.neba-switch[data-checked] .neba-switch-thumb {
1229
1497
  background-color: HighlightText;
1230
1498
  }
1499
+
1500
+ /* The chosen option of a set, which said so only in a fill. A radio's dot
1501
+ is mounted only while its option is chosen. */
1502
+ .neba-radio-dot.neba-radio-dot {
1503
+ forced-color-adjust: none;
1504
+ background-color: Highlight;
1505
+ }
1506
+
1507
+ .neba-segment.neba-segment[data-checked]:not([data-disabled]),
1508
+ .neba-toggle.neba-toggle[data-pressed]:not([data-disabled]),
1509
+ .neba-calendar-cell.neba-calendar-cell[aria-selected='true']:not([aria-disabled]),
1510
+ .neba-nav-item.neba-nav-item[aria-current='page'] {
1511
+ forced-color-adjust: none;
1512
+ background-color: Highlight;
1513
+ color: HighlightText;
1514
+ }
1231
1515
  }
1232
1516
  }
1233
1517
 
@@ -2457,10 +2741,10 @@
2457
2741
  *
2458
2742
  * The whole set is built on one idea. An effect is a single `@keyframes` that
2459
2743
  * runs from a state written entirely in `--n-anim-*` custom properties to the
2460
- * element's natural one — so `src/internal/animate.ts` never generates CSS, it
2744
+ * element's natural one — so `src/internal/animate.tsx` never generates CSS, it
2461
2745
  * only fills slots, and running an effect backwards is `animation-direction:
2462
2746
  * reverse` rather than a second keyframe. That is what makes `mode="out"` cost
2463
- * nothing on all six.
2747
+ * nothing on any of them.
2464
2748
  *
2465
2749
  * `fill-mode` is `both` throughout, which is what lets an animation that has
2466
2750
  * not been triggered yet simply sit paused on its own first frame. Without it,
@@ -2504,7 +2788,7 @@
2504
2788
  }
2505
2789
 
2506
2790
  /*
2507
- * The same eleven effects, driven by where the element is rather than by when.
2791
+ * The same effects, driven by where the element is rather than by when.
2508
2792
  *
2509
2793
  * Two declarations and nothing else, which is the whole reason this is a prop
2510
2794
  * and not a component: every keyframe already runs from a start state to the
package/dist/types.d.ts CHANGED
@@ -179,6 +179,24 @@ export type NebaVariant = 'solid' | 'outline' | 'text';
179
179
  * pressing removes one, so a flat control still answers a press without moving.
180
180
  */
181
181
  export type NebaElevation = 0 | 1 | 2 | 3;
182
+ /**
183
+ * Where a field-shaped component draws its label.
184
+ *
185
+ * - `top` — above the field, in a line of its own. The default.
186
+ * - `notch` — on the field's top edge, in a gap cut out of the border.
187
+ * - `float` — inside the field, where the placeholder would be, while the field
188
+ * is empty and nothing in it has the focus; it rises into the notch the
189
+ * moment either stops being true.
190
+ *
191
+ * `notch` and `float` take no height of their own. The label stands half a
192
+ * line above the field's top edge instead of a line above it, so a column of
193
+ * notched fields is shorter than the same column with their labels on top.
194
+ *
195
+ * A field that draws something at its start — a `startIcon`, the split
196
+ * steppers of a NumberField — keeps a `float` label in the notch, because the
197
+ * place it would rest is taken.
198
+ */
199
+ export type NebaLabelPlacement = 'top' | 'notch' | 'float';
182
200
  /**
183
201
  * The seven effects the `transition` prop takes, which is the **entrance**
184
202
  * vocabulary: everything a component can be given to arrive on.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neba",
3
- "version": "1.16.1",
3
+ "version": "1.17.0",
4
4
  "description": "A comprehensive React UI component library — buttons, fields, menus, dialogs, tables and much more — accessible and themeable, sharing one prop vocabulary and a translucent acrylic design language. ESM only, types included, dark mode built in.",
5
5
  "type": "module",
6
6
  "types": "dist/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  "scripts": {
21
21
  "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
22
22
  "build": "npm run clean && npm run format:fix && tsc --project tsconfig.prod.json && node scripts/annotate-pure.mjs && npm run minify && node scripts/build-styles.mjs && node scripts/build-catalog.mjs",
23
- "lint": "eslint . --report-unused-disable-directives",
23
+ "lint": "eslint . --report-unused-disable-directives --max-warnings 0",
24
24
  "lint:fix": "eslint . --report-unused-disable-directives --fix",
25
25
  "minify": "node scripts/minify.mjs",
26
26
  "size": "node scripts/measure-bundle.mjs",
@@ -39,7 +39,13 @@
39
39
  "docs:catalog": "node scripts/build-catalog.mjs --docs"
40
40
  },
41
41
  "engines": {
42
- "node": ">=18.0.0"
42
+ "node": ">=18.20.0"
43
+ },
44
+ "devEngines": {
45
+ "runtime": {
46
+ "name": "node",
47
+ "version": ">=22.12.0"
48
+ }
43
49
  },
44
50
  "main": "dist/index.js",
45
51
  "exports": {
@@ -154,15 +160,15 @@
154
160
  "@a2ui/react": "^0.11.1",
155
161
  "@a2ui/web_core": "^0.11.0",
156
162
  "@eslint/js": "^9.39.1",
157
- "@mdn/browser-compat-data": "^8.1.1",
163
+ "@mdn/browser-compat-data": "^8.1.3",
158
164
  "@tailwindcss/postcss": "^4.3.3",
159
- "@types/node": "^26.4.1",
160
- "@types/react": "^19.2.18",
161
- "@types/react-dom": "^19.2.7",
162
- "@typescript-eslint/parser": "^8.69.0",
165
+ "@types/node": "^26.6.3",
166
+ "@types/react": "^19.3.0",
167
+ "@types/react-dom": "^19.3.0",
168
+ "@typescript-eslint/parser": "^8.70.1",
163
169
  "@vitejs/plugin-react": "^6.1.1",
164
- "@vitest/browser": "^5.0.0",
165
- "@vitest/browser-playwright": "^5.0.0",
170
+ "@vitest/browser": "^5.0.2",
171
+ "@vitest/browser-playwright": "^5.0.2",
166
172
  "eslint": "^9.39.1",
167
173
  "eslint-config-prettier": "^10.1.8",
168
174
  "eslint-plugin-n": "^18.3.0",
@@ -171,20 +177,20 @@
171
177
  "jiti": "^2.7.0",
172
178
  "playwright": "^1.63.0",
173
179
  "postcss": "^8.5.28",
174
- "prettier": "^3.9.6",
180
+ "prettier": "^3.9.9",
175
181
  "prettier-plugin-tailwindcss": "^0.8.1",
176
- "react": "^19.2.8",
177
- "react-dom": "^19.2.8",
182
+ "react": "^19.3.0",
183
+ "react-dom": "^19.3.0",
178
184
  "tailwindcss": "^4.3.3",
179
185
  "terser": "^5.51.2",
180
- "tsx": "^4.23.13",
186
+ "tsx": "^4.23.15",
181
187
  "typescript": "^6.0.3",
182
- "typescript-eslint": "^8.69.0",
183
- "vite": "^8.2.2",
188
+ "typescript-eslint": "^8.70.1",
189
+ "vite": "^8.3.1",
184
190
  "vitepress": "^1.6.4",
185
191
  "vitepress-i18n": "^1.4.0",
186
192
  "vitepress-sidebar": "^1.40.0",
187
- "vitest": "^5.0.0",
193
+ "vitest": "^5.0.2",
188
194
  "vitest-browser-react": "^2.3.0",
189
195
  "zod": "^3.25.76"
190
196
  },