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.
- package/README.md +5 -5
- package/dist/a2ui/adapter-catalog.json +1 -0
- package/dist/a2ui/catalog.json +632 -145
- package/dist/a2ui/components.js +1 -1
- package/dist/a2ui/index.d.ts +22 -10
- package/dist/a2ui/index.js +1 -1
- package/dist/a2ui/schema.d.ts +8 -6
- package/dist/a2ui/schema.js +1 -1
- package/dist/components/accordion/Accordion.js +1 -1
- package/dist/components/agent-steps/AgentSteps.js +1 -1
- package/dist/components/alert/Alert.js +1 -1
- package/dist/components/anchor/Anchor.d.ts +3 -1
- package/dist/components/anchor/Anchor.js +1 -1
- package/dist/components/animate-counter/AnimateCounter.d.ts +11 -4
- package/dist/components/animate-counter/AnimateCounter.js +1 -1
- package/dist/components/animate-scramble/AnimateScramble.d.ts +6 -3
- package/dist/components/animate-scramble/AnimateScramble.js +1 -1
- package/dist/components/animate-split/AnimateSplit.d.ts +6 -3
- package/dist/components/animate-split/AnimateSplit.js +1 -1
- package/dist/components/animate-typing/AnimateTyping.js +1 -1
- package/dist/components/app-logo/AppLogo.js +1 -1
- package/dist/components/approval/Approval.js +1 -1
- package/dist/components/avatar/Avatar.js +1 -1
- package/dist/components/bar-chart/BarChart.js +1 -1
- package/dist/components/bottom-navigation/BottomNavigation.js +1 -1
- package/dist/components/box/Box.js +1 -1
- package/dist/components/breadcrumb/Breadcrumb.d.ts +3 -3
- package/dist/components/breadcrumb/Breadcrumb.js +1 -1
- package/dist/components/card/Card.js +1 -1
- package/dist/components/chat-bubble/ChatBubble.js +1 -1
- package/dist/components/chip/Chip.d.ts +4 -1
- package/dist/components/chip/Chip.js +1 -1
- package/dist/components/code-block/CodeBlock.js +1 -1
- package/dist/components/collapsible/Collapsible.js +1 -1
- package/dist/components/color-picker/ColorPicker.d.ts +13 -3
- package/dist/components/color-picker/ColorPicker.js +1 -1
- package/dist/components/combobox/Combobox.d.ts +9 -2
- package/dist/components/combobox/Combobox.js +1 -1
- package/dist/components/command-palette/CommandPalette.js +1 -1
- package/dist/components/confirm/Confirm.js +1 -1
- package/dist/components/context-window/ContextWindow.d.ts +4 -1
- package/dist/components/context-window/ContextWindow.js +1 -1
- package/dist/components/data-list/DataList.d.ts +3 -2
- package/dist/components/data-list/DataList.js +1 -1
- package/dist/components/data-table/DataTable.d.ts +11 -5
- package/dist/components/data-table/DataTable.js +1 -1
- package/dist/components/date-picker/DatePicker.js +1 -1
- package/dist/components/date-range-picker/DateRangePicker.d.ts +3 -2
- package/dist/components/date-range-picker/DateRangePicker.js +1 -1
- package/dist/components/date-time-picker/DateTimePicker.js +1 -1
- package/dist/components/dialog/Dialog.js +1 -1
- package/dist/components/drawer/Drawer.js +1 -1
- package/dist/components/fieldset/Fieldset.js +1 -1
- package/dist/components/file-picker/FilePicker.d.ts +4 -0
- package/dist/components/file-picker/FilePicker.js +1 -1
- package/dist/components/footer/Footer.d.ts +4 -2
- package/dist/components/form/Form.d.ts +0 -14
- package/dist/components/form/Form.js +1 -1
- package/dist/components/gallery/Gallery.js +1 -1
- package/dist/components/gallery/GalleryViewer.js +1 -1
- package/dist/components/header/Header.d.ts +4 -3
- package/dist/components/heatmap-chart/HeatmapChart.js +1 -1
- package/dist/components/hover-card/HoverCard.d.ts +1 -1
- package/dist/components/how-to-steps/HowToSteps.d.ts +2 -1
- package/dist/components/how-to-steps/HowToSteps.js +1 -1
- package/dist/components/image/Image.d.ts +4 -1
- package/dist/components/image/Image.js +1 -1
- package/dist/components/inline-citation/InlineCitation.d.ts +4 -2
- package/dist/components/inline-citation/InlineCitation.js +1 -1
- package/dist/components/menu/Menu.d.ts +6 -2
- package/dist/components/menu/Menu.js +1 -1
- package/dist/components/mockup/Mockup.js +1 -1
- package/dist/components/navigation-menu/NavigationMenu.d.ts +1 -1
- package/dist/components/navigation-menu/NavigationMenu.js +1 -1
- package/dist/components/number-field/NumberField.d.ts +9 -4
- package/dist/components/number-field/NumberField.js +1 -1
- package/dist/components/overlay/Overlay.d.ts +1 -1
- package/dist/components/page-layout/PageLayout.js +1 -1
- package/dist/components/pagination/Pagination.d.ts +3 -2
- package/dist/components/panes/Panes.js +1 -1
- package/dist/components/pie-chart/PieChart.js +1 -1
- package/dist/components/pill/Pill.js +1 -1
- package/dist/components/popover/Popover.js +1 -1
- package/dist/components/progress-box/ProgressBox.js +1 -1
- package/dist/components/prompt-input/PromptInput.d.ts +5 -3
- package/dist/components/prompt-input/PromptInput.js +1 -1
- package/dist/components/provider/NebaProvider.d.ts +2 -2
- package/dist/components/provider/NebaProvider.js +1 -1
- package/dist/components/radio-group/RadioGroup.js +1 -1
- package/dist/components/rating/Rating.js +1 -1
- package/dist/components/reasoning/Reasoning.d.ts +7 -4
- package/dist/components/reasoning/Reasoning.js +1 -1
- package/dist/components/scatter-chart/ScatterChart.d.ts +7 -1
- package/dist/components/scatter-chart/ScatterChart.js +1 -1
- package/dist/components/scroll-area/ScrollArea.d.ts +12 -0
- package/dist/components/scroll-area/ScrollArea.js +1 -1
- package/dist/components/scroll-zone/ScrollZone.js +1 -1
- package/dist/components/segmented-button/SegmentedButton.js +1 -1
- package/dist/components/select/Select.d.ts +10 -2
- package/dist/components/select/Select.js +1 -1
- package/dist/components/sidebar/Sidebar.js +1 -1
- package/dist/components/sidebar/SidebarTrigger.js +1 -1
- package/dist/components/skeleton/Skeleton.js +1 -1
- package/dist/components/sources/Sources.d.ts +1 -1
- package/dist/components/sources/Sources.js +1 -1
- package/dist/components/stack/Stack.js +1 -1
- package/dist/components/streaming-text/StreamingText.js +1 -1
- package/dist/components/switch/Switch.d.ts +13 -2
- package/dist/components/switch/Switch.js +1 -1
- package/dist/components/switch/index.d.ts +1 -1
- package/dist/components/table/Table.d.ts +4 -2
- package/dist/components/tabs/Tabs.js +1 -1
- package/dist/components/text-field/TextField.d.ts +13 -5
- package/dist/components/text-field/TextField.js +1 -1
- package/dist/components/text-link/TextLink.js +1 -1
- package/dist/components/time-picker/TimePicker.js +1 -1
- package/dist/components/timeline-chart/TimelineChart.d.ts +6 -1
- package/dist/components/timeline-chart/TimelineChart.js +1 -1
- package/dist/components/toggle/Toggle.js +1 -1
- package/dist/components/tool-call/ToolCall.js +1 -1
- package/dist/components/tour/Tour.js +1 -1
- package/dist/components/transfer/Transfer.js +1 -1
- package/dist/components/tree-select/TreeSelect.js +1 -1
- package/dist/components/tree-view/TreeView.js +1 -1
- package/dist/components/typography/Typography.js +1 -1
- package/dist/components/visually-hidden/VisuallyHidden.d.ts +2 -2
- package/dist/components/window-pane/WindowPane.js +1 -1
- package/dist/hooks/useElementSize.d.ts +6 -2
- package/dist/hooks/useElementSize.js +1 -1
- package/dist/hooks/useMediaQuery.d.ts +3 -2
- package/dist/hooks/useOnScreen.d.ts +2 -2
- package/dist/hooks/useShortcut.d.ts +11 -3
- package/dist/hooks/useShortcut.js +1 -1
- package/dist/internal/animate.d.ts +8 -0
- package/dist/internal/animate.js +1 -1
- package/dist/internal/calendar.js +1 -1
- package/dist/internal/chart-brush.d.ts +3 -1
- package/dist/internal/chart-brush.js +1 -1
- package/dist/internal/chart-frame.d.ts +28 -2
- package/dist/internal/chart-frame.js +1 -1
- package/dist/internal/chart-line.js +1 -1
- package/dist/internal/chart.d.ts +21 -0
- package/dist/internal/chart.js +1 -1
- package/dist/internal/defaults.d.ts +8 -4
- package/dist/internal/drag.d.ts +15 -0
- package/dist/internal/drag.js +1 -1
- package/dist/internal/drop.d.ts +12 -8
- package/dist/internal/drop.js +1 -1
- package/dist/internal/highlight.js +1 -1
- package/dist/internal/i18n.d.ts +40 -4
- package/dist/internal/i18n.js +1 -1
- package/dist/internal/icons.d.ts +3 -0
- package/dist/internal/icons.js +1 -1
- package/dist/internal/link.d.ts +27 -0
- package/dist/internal/link.js +1 -1
- package/dist/internal/new-tab.d.ts +19 -0
- package/dist/internal/new-tab.js +1 -0
- package/dist/internal/notch.d.ts +102 -0
- package/dist/internal/notch.js +1 -0
- package/dist/internal/observe.d.ts +3 -4
- package/dist/internal/picker.d.ts +30 -4
- package/dist/internal/picker.js +1 -1
- package/dist/internal/run.d.ts +7 -5
- package/dist/internal/run.js +1 -1
- package/dist/internal/search.d.ts +3 -3
- package/dist/internal/styles.d.ts +56 -0
- package/dist/internal/styles.js +1 -1
- package/dist/locales/ar.js +1 -1
- package/dist/locales/de.js +1 -1
- package/dist/locales/es.js +1 -1
- package/dist/locales/fr.js +1 -1
- package/dist/locales/hi.js +1 -1
- package/dist/locales/id.js +1 -1
- package/dist/locales/it.js +1 -1
- package/dist/locales/ja.js +1 -1
- package/dist/locales/ko.js +1 -1
- package/dist/locales/nl.js +1 -1
- package/dist/locales/pl.js +1 -1
- package/dist/locales/pt.js +1 -1
- package/dist/locales/ru.js +1 -1
- package/dist/locales/th.js +1 -1
- package/dist/locales/tr.js +1 -1
- package/dist/locales/vi.js +1 -1
- package/dist/locales/zh-hans.js +1 -1
- package/dist/locales/zh-hant.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind.css +287 -3
- package/dist/types.d.ts +18 -0
- 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.
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
163
|
+
"@mdn/browser-compat-data": "^8.1.3",
|
|
158
164
|
"@tailwindcss/postcss": "^4.3.3",
|
|
159
|
-
"@types/node": "^26.
|
|
160
|
-
"@types/react": "^19.
|
|
161
|
-
"@types/react-dom": "^19.
|
|
162
|
-
"@typescript-eslint/parser": "^8.
|
|
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.
|
|
165
|
-
"@vitest/browser-playwright": "^5.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.
|
|
180
|
+
"prettier": "^3.9.9",
|
|
175
181
|
"prettier-plugin-tailwindcss": "^0.8.1",
|
|
176
|
-
"react": "^19.
|
|
177
|
-
"react-dom": "^19.
|
|
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.
|
|
186
|
+
"tsx": "^4.23.15",
|
|
181
187
|
"typescript": "^6.0.3",
|
|
182
|
-
"typescript-eslint": "^8.
|
|
183
|
-
"vite": "^8.
|
|
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.
|
|
193
|
+
"vitest": "^5.0.2",
|
|
188
194
|
"vitest-browser-react": "^2.3.0",
|
|
189
195
|
"zod": "^3.25.76"
|
|
190
196
|
},
|