@botiverse/raft-ui 0.17.0 → 0.18.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/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## [0.18.0](https://github.com/botiverse/raft-design/compare/v0.17.0...v0.18.0) (2026-10-21)
2
+
3
+ ### Design System
4
+
5
+ - **Field frames**: a field's ink frame is 1.5px, the same weight as a button's. It applies to Input, Textarea, InputGroup, Select, Combobox, ComboboxSelect, SearchTrigger, the composer and an option card. Read-only fields keep their light, thin edge. ([#661](https://github.com/botiverse/raft-design/pull/661))
6
+ - Why: a field sits next to its send button, its submit button and the selected row, all 1.5px ink; at 1px it was the one thin control among them and read as a lighter style rather than the same system.
7
+ - Affects: `line-field` width 1px → 1.5px.
8
+ - Docs: https://raft-design.botiverse.build/foundations/shape/
9
+ - **Autofill**: a field the browser filled in looks like any other field, `layer-card` with ink text. ([#661](https://github.com/botiverse/raft-design/pull/661))
10
+ - Why: Chrome's pale blue and Safari's yellow made the filled field the one field on the page that matched nothing else, and the colour tells a person nothing.
11
+ - Docs: https://raft-design.botiverse.build/foundations/states/#autofill
12
+
13
+ ### Fixed
14
+
15
+ - **Input, Textarea, Select and every other field**: browser autofill no longer paints a field pale blue or yellow. raft-ui's `styles.css` handles every `input`, `textarea` and `select` on the page; a disabled autofilled field keeps the disabled ink. ([#661](https://github.com/botiverse/raft-design/pull/661))
16
+ - Why: see Autofill above.
17
+ - Docs: https://raft-design.botiverse.build/foundations/states/#autofill
18
+
1
19
  ## [0.17.0](https://github.com/botiverse/raft-design/compare/v0.16.0...v0.17.0) (2026-10-21)
2
20
 
3
21
  ### Design System
@@ -11,7 +11,7 @@
11
11
  align-items: center;
12
12
  gap: 0.5rem;
13
13
  padding: 0 6px 0 12px;
14
- border: 1px solid var(--line-field);
14
+ border: 1.5px solid var(--line-field);
15
15
  border-radius: 8px;
16
16
  outline: 0;
17
17
  background: var(--layer-card);
package/dist/index.mjs CHANGED
@@ -880,7 +880,7 @@ const card = tv({
880
880
  * in the control plane, and its title drops from the card-title scale
881
881
  * to the field scale so it cannot outrank the field label above it. */
882
882
  option: {
883
- root: ["rounded-control border border-line-field bg-layer-card", "shadow-none"],
883
+ root: ["rounded-control border-[1.5px] border-line-field bg-layer-card", "shadow-none"],
884
884
  header: ["gap-x-3 p-3"],
885
885
  content: ["px-3 pb-3"],
886
886
  title: ["font-sans text-callout font-semibold"],
@@ -3682,7 +3682,7 @@ const Label = Object.assign(LabelRoot, {
3682
3682
  //#region src/components/input/input.recipe.ts
3683
3683
  const input = tv({ slots: { root: [
3684
3684
  "h-control w-full px-3 py-0 font-heading text-field font-field outline-none",
3685
- "rounded-control border border-line-field bg-layer-card",
3685
+ "rounded-control border-[1.5px] border-line-field bg-layer-card",
3686
3686
  "text-foreground placeholder:text-foreground-hint",
3687
3687
  "shadow-none transition-shadow duration-90 ease-out focus-visible:shadow-focus",
3688
3688
  "data-invalid:border-danger-strong",
@@ -3806,7 +3806,7 @@ const inputGroup = tv({
3806
3806
  root: [
3807
3807
  "group/input-group relative flex w-full min-w-0 items-center",
3808
3808
  "has-data-[input-group-trim=inline-end]:[--ig-control-pr:0]",
3809
- "h-control overflow-hidden rounded-control border border-line-field bg-layer-card text-foreground",
3809
+ "h-control overflow-hidden rounded-control border-[1.5px] border-line-field bg-layer-card text-foreground",
3810
3810
  "shadow-none transition-shadow duration-90 ease-out has-focus-visible:shadow-focus",
3811
3811
  "has-[[data-slot=input-group-control][data-invalid]]:border-danger-strong",
3812
3812
  "has-[[data-slot=input-group-control]:disabled]:cursor-not-allowed has-[[data-slot=input-group-control]:disabled]:border-line-hairline has-[[data-slot=input-group-control]:disabled]:bg-fill-muted",
@@ -4002,7 +4002,7 @@ const combobox = tv({
4002
4002
  "[&_[data-slot='combobox-clear']]:size-5 [&_[data-slot='combobox-clear']]:min-w-5 **:data-[slot='combobox-clear']:shrink-0",
4003
4003
  "[&_[data-slot='combobox-trigger-indicator']]:size-4",
4004
4004
  "[&_[data-slot='combobox-trigger-indicator']>svg]:shrink-0",
4005
- "min-h-control rounded-control border border-line-field bg-layer-card px-3 py-0",
4005
+ "min-h-control rounded-control border-[1.5px] border-line-field bg-layer-card px-3 py-0",
4006
4006
  "font-sans text-body text-foreground",
4007
4007
  "transition-shadow duration-90 ease-out has-focus-visible:shadow-focus",
4008
4008
  "[&>svg]:text-foreground-hint [&>svg:not([class*='size-'])]:size-4.5",
@@ -4056,7 +4056,7 @@ const combobox = tv({
4056
4056
  groupLabel: ["py-2", "px-2.5 pt-2 pb-1 text-caption font-bold text-foreground-hint"],
4057
4057
  chips: [
4058
4058
  "flex flex-wrap items-center",
4059
- "min-h-control gap-1.5 rounded-control border border-line-field bg-layer-card py-1.5 pr-3 pl-1.5",
4059
+ "min-h-control gap-1.5 rounded-control border-[1.5px] border-line-field bg-layer-card py-1.5 pr-3 pl-1.5",
4060
4060
  "transition-shadow duration-90 ease-out has-focus-visible:shadow-focus"
4061
4061
  ],
4062
4062
  chip: [
@@ -4433,7 +4433,7 @@ const select = tv({
4433
4433
  "[&>span[data-slot='select-trigger-content']]:min-w-0 [&>span[data-slot='select-trigger-content']]:flex-1",
4434
4434
  "[&_[data-slot='select-trigger-content']_svg]:shrink-0",
4435
4435
  "h-control w-full gap-2 pr-3 pl-3.5",
4436
- "border border-line-field",
4436
+ "border-[1.5px] border-line-field",
4437
4437
  "text-subhead font-semibold text-foreground",
4438
4438
  "data-placeholder:font-medium data-placeholder:text-foreground-hint",
4439
4439
  "data-invalid:border-danger-strong data-invalid:hover:border-danger-strong",
@@ -5029,7 +5029,7 @@ const textarea = tv({ slots: { root: [
5029
5029
  "scroll-pb-(--ta-scroll-pb,0)",
5030
5030
  "font-heading text-field font-field outline-none",
5031
5031
  "py-2.5",
5032
- "rounded-control border border-line-field bg-layer-card",
5032
+ "rounded-control border-[1.5px] border-line-field bg-layer-card",
5033
5033
  "text-foreground placeholder:text-foreground-hint",
5034
5034
  "shadow-none transition-shadow duration-90 ease-out focus-visible:shadow-focus",
5035
5035
  "data-invalid:border-danger-strong",
@@ -8582,7 +8582,7 @@ function FileAction({ variant, size = "icon-sm", ...props }) {
8582
8582
  const composer = tv({ slots: {
8583
8583
  root: [
8584
8584
  "flex w-full flex-col gap-2 p-2",
8585
- "rounded-container border px-3 pt-3 pb-2",
8585
+ "rounded-container border-[1.5px] px-3 pt-3 pb-2",
8586
8586
  "border-line-field bg-layer-card text-foreground shadow-none",
8587
8587
  "has-focus-visible:shadow-focus"
8588
8588
  ],
@@ -16801,7 +16801,7 @@ function SearchThreadResultMessages({ className, render, ...props }) {
16801
16801
  const searchTrigger = tv({ slots: {
16802
16802
  root: [
16803
16803
  "relative inline-flex h-9 w-[clamp(360px,32vw,520px)] max-w-full min-w-0 shrink-0 items-center gap-2 px-3",
16804
- "rounded-control border border-line-field bg-layer-card",
16804
+ "rounded-control border-[1.5px] border-line-field bg-layer-card",
16805
16805
  "text-left font-sans text-body font-normal text-foreground-hint",
16806
16806
  "select-none outline-none transition-colors duration-100",
16807
16807
  "hover:press-overlay active:press-overlay focus-visible:shadow-focus",
package/dist/style.css CHANGED
@@ -1062,7 +1062,7 @@
1062
1062
  box-sizing: border-box;
1063
1063
  min-width: 0;
1064
1064
  min-height: var(--control-height);
1065
- border: 1px solid var(--line-field);
1065
+ border: 1.5px solid var(--line-field);
1066
1066
  background: var(--layer-card);
1067
1067
  color: var(--foreground);
1068
1068
  font-size: var(--field-font-size);
package/dist/styles.css CHANGED
@@ -479,6 +479,30 @@ body {
479
479
  position: relative;
480
480
  }
481
481
 
482
+ /* Browser autofill paints its own fill over a field (Chrome's pale blue,
483
+ Safari's yellow), so a filled-in login form showed fields that matched no
484
+ other field (design/foundations/states.md#autofill). The browser sets that
485
+ fill !important, so it can't be overridden; delaying the transition into it
486
+ keeps the field on its own surface, and the text keeps the field's ink.
487
+ box-shadow keeps the fields' own transition (the focus ring). The delay
488
+ also holds the field's own background while it stays autofilled: switching
489
+ light and dark mode then keeps the old surface until the field is edited. */
490
+ input:-webkit-autofill,
491
+ textarea:-webkit-autofill,
492
+ select:-webkit-autofill {
493
+ -webkit-text-fill-color: var(--foreground);
494
+ caret-color: var(--foreground);
495
+ transition:
496
+ background-color 0s 600000s,
497
+ color 0s 600000s,
498
+ box-shadow 90ms cubic-bezier(0, 0, 0.2, 1);
499
+ }
500
+
501
+ input:-webkit-autofill:disabled,
502
+ textarea:-webkit-autofill:disabled {
503
+ -webkit-text-fill-color: var(--foreground-disabled);
504
+ }
505
+
482
506
  /* The passages comments are on, painted with the CSS Custom Highlight API so
483
507
  the document's DOM is never changed (setCommentHighlights registers the
484
508
  ranges; design/patterns/comments.md). Every commented passage gets the soft
package/dist/tokens.json CHANGED
@@ -1645,7 +1645,7 @@
1645
1645
  },
1646
1646
  "field": {
1647
1647
  "$value": "{line.strong}",
1648
- "$description": "The frame of a field and the composer: the ink of line-strong, drawn 1px.",
1648
+ "$description": "The frame of a field and the composer: the ink and width of line-strong, drawn 1.5px.",
1649
1649
  "$extensions": {
1650
1650
  "build.botiverse.raft": {
1651
1651
  "scope": "every-mode"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botiverse/raft-ui",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "React components and CSS foundations for the Raft Design System.",
5
5
  "keywords": [
6
6
  "agent-skills",