@refineui/react 0.1.2 → 0.2.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.
@@ -5,7 +5,21 @@
5
5
  "kind": "root",
6
6
  "category": "components",
7
7
  "label": "Command",
8
- "props": [],
8
+ "props": [
9
+ {
10
+ "name": "size",
11
+ "label": "size",
12
+ "valueType": "enum",
13
+ "control": "segmented",
14
+ "options": [
15
+ "sm",
16
+ "md",
17
+ "lg"
18
+ ],
19
+ "defaultValue": "sm",
20
+ "section": "variants"
21
+ }
22
+ ],
9
23
  "preview": {
10
24
  "mode": "full"
11
25
  },
@@ -17,6 +17,19 @@
17
17
  ],
18
18
  "defaultValue": "filled",
19
19
  "section": "variants"
20
+ },
21
+ {
22
+ "name": "size",
23
+ "label": "size",
24
+ "valueType": "enum",
25
+ "control": "segmented",
26
+ "options": [
27
+ "sm",
28
+ "md",
29
+ "lg"
30
+ ],
31
+ "defaultValue": "sm",
32
+ "section": "variants"
20
33
  }
21
34
  ],
22
35
  "preview": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": "refineui.authoring/1",
3
3
  "packageName": "@refineui/react",
4
- "packageVersion": "0.1.2",
4
+ "packageVersion": "0.2.0",
5
5
  "css": [
6
6
  "@refineui/react/refineui.css"
7
7
  ],
@@ -332,6 +332,19 @@
332
332
  ],
333
333
  "defaultValue": "filled",
334
334
  "section": "variants"
335
+ },
336
+ {
337
+ "name": "size",
338
+ "label": "size",
339
+ "valueType": "enum",
340
+ "control": "segmented",
341
+ "options": [
342
+ "sm",
343
+ "md",
344
+ "lg"
345
+ ],
346
+ "defaultValue": "sm",
347
+ "section": "variants"
335
348
  }
336
349
  ],
337
350
  "preview": {
@@ -1671,7 +1684,21 @@
1671
1684
  "kind": "root",
1672
1685
  "category": "components",
1673
1686
  "label": "Command",
1674
- "props": [],
1687
+ "props": [
1688
+ {
1689
+ "name": "size",
1690
+ "label": "size",
1691
+ "valueType": "enum",
1692
+ "control": "segmented",
1693
+ "options": [
1694
+ "sm",
1695
+ "md",
1696
+ "lg"
1697
+ ],
1698
+ "defaultValue": "sm",
1699
+ "section": "variants"
1700
+ }
1701
+ ],
1675
1702
  "preview": {
1676
1703
  "mode": "full"
1677
1704
  },
@@ -8,6 +8,7 @@
8
8
  "empty": "command-empty",
9
9
  "group": "command-group",
10
10
  "group_heading": "command-group-heading",
11
+ "indicator": "command-indicator",
11
12
  "input": "command-input",
12
13
  "item": "command-item",
13
14
  "list": "command-list",
@@ -17,6 +18,13 @@
17
18
  "attributes": {
18
19
  "data-refineui": "command"
19
20
  },
21
+ "variants": {
22
+ "size": [
23
+ "sm",
24
+ "md",
25
+ "lg"
26
+ ]
27
+ },
20
28
  "states": {
21
29
  "pseudo": [
22
30
  "focus-visible"
@@ -16,6 +16,11 @@
16
16
  "appearance": [
17
17
  "filled",
18
18
  "plain"
19
+ ],
20
+ "size": [
21
+ "sm",
22
+ "md",
23
+ "lg"
19
24
  ]
20
25
  },
21
26
  "states": {
@@ -3,7 +3,7 @@
3
3
  "contractLayer": "component-spec",
4
4
  "contractLayerVersion": "1.1",
5
5
  "status": "catalog",
6
- "generatedAt": "2026-11-02T15:03:08.935Z",
6
+ "generatedAt": "2026-11-04T07:02:13.744Z",
7
7
  "role": "Behavior and DOM contracts — source of truth for Doctor, MCP, and Docs",
8
8
  "files": {
9
9
  "manifest": "./manifest.json",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "generatedAt": "2026-11-02T15:03:08.930Z",
3
+ "generatedAt": "2026-11-04T07:02:13.738Z",
4
4
  "contractLayer": "component-token-trace",
5
5
  "tokens": {
6
6
  "webIcon.primary": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@refineui/react",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "RefineUI React components — Pelagornis RefineUI Web Kit",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/refineui.css CHANGED
@@ -644,21 +644,25 @@
644
644
  background-color: var(--refineui-color-alias-background-primary-active) !important;
645
645
  }
646
646
 
647
- /* Command / Item — Sidebar link plate */
647
+ /*
648
+ * Command / Item — soft surface plate (same family as SearchField / secondary Button).
649
+ * These item fills are the pre-measure fallback; once `command-indicator` is ready the
650
+ * sliding indicator owns the plate and item fills are cleared below.
651
+ */
648
652
  [data-refineui="command-item"][data-state="hover"],
649
653
  [data-refineui="command-item"][data-selected="true"]:not(:disabled):not(:active) {
650
654
  color: var(--refineui-color-alias-foreground-primary-hover) !important;
651
- background-color: var(--refineui-color-alias-background-primary-hover) !important;
655
+ background-color: var(--refineui-color-alias-background-surface-hover) !important;
652
656
  }
653
657
  [data-refineui="command-item"][data-state="pressed"],
654
658
  [data-refineui="command-item"][data-state="active"]:not(:disabled):active,
655
659
  [data-refineui="command-item"][data-selected="true"]:not(:disabled):active {
656
660
  color: var(--refineui-color-alias-foreground-primary) !important;
657
- background-color: var(--refineui-color-alias-background-primary-active) !important;
661
+ background-color: var(--refineui-color-alias-background-surface-active) !important;
658
662
  }
659
663
  [data-refineui="command-item"][data-state="active"]:not(:disabled):not(:active) {
660
664
  color: var(--refineui-color-alias-foreground-primary) !important;
661
- background-color: var(--refineui-color-alias-background-primary-hover) !important;
665
+ background-color: var(--refineui-color-alias-background-surface-hover) !important;
662
666
  }
663
667
  [data-refineui="command-item"][data-state="disabled"],
664
668
  [data-refineui="command-item"]:disabled {
@@ -667,12 +671,53 @@
667
671
  }
668
672
  [data-refineui="command-item"][data-state="default"]:not(:disabled):hover {
669
673
  color: var(--refineui-color-alias-foreground-primary-hover) !important;
670
- background-color: var(--refineui-color-alias-background-primary-hover) !important;
674
+ background-color: var(--refineui-color-alias-background-surface-hover) !important;
671
675
  }
672
676
  [data-refineui="command-item"][data-state="default"]:not(:disabled):active,
673
677
  [data-refineui="command-item"]:not(:disabled):active {
674
678
  color: var(--refineui-color-alias-foreground-primary) !important;
675
- background-color: var(--refineui-color-alias-background-primary-active) !important;
679
+ background-color: var(--refineui-color-alias-background-surface-active) !important;
680
+ }
681
+
682
+ /* Command / Indicator — one plate slides between items instead of each item repainting. */
683
+ [data-refineui="command-indicator"] {
684
+ opacity: 0;
685
+ transition: none;
686
+ }
687
+ [data-refineui="command-indicator"][data-ready="true"] {
688
+ opacity: 1;
689
+ }
690
+ [data-refineui="command-indicator"][data-animate="true"] {
691
+ transition:
692
+ top var(--refineui-motion-duration-medium) var(--refineui-motion-easing-emphasized),
693
+ left var(--refineui-motion-duration-medium) var(--refineui-motion-easing-emphasized),
694
+ height var(--refineui-motion-duration-medium) var(--refineui-motion-easing-emphasized),
695
+ width var(--refineui-motion-duration-medium) var(--refineui-motion-easing-emphasized),
696
+ opacity var(--refineui-motion-duration-fast) var(--refineui-motion-easing-standard),
697
+ background-color var(--refineui-motion-duration-fast);
698
+ }
699
+ [data-refineui="command-list"]:has([data-refineui="command-indicator"][data-ready="true"])
700
+ [data-refineui="command-item"]:not(:disabled) {
701
+ background-color: transparent !important;
702
+ /* The plate does not scale, so the label must not either. */
703
+ transform: none !important;
704
+ }
705
+ [data-refineui="command-list"]:has([data-refineui="command-item"]:not(:disabled):active)
706
+ [data-refineui="command-indicator"] {
707
+ background-color: var(--refineui-color-alias-background-surface-active);
708
+ }
709
+
710
+ [data-refineui="command-empty"] {
711
+ animation: refineui-menu-popover-enter var(--refineui-motion-duration-normal) var(--refineui-motion-easing-standard);
712
+ }
713
+
714
+ @media (prefers-reduced-motion: reduce) {
715
+ [data-refineui="command-indicator"][data-animate="true"] {
716
+ transition: none;
717
+ }
718
+ [data-refineui="command-empty"] {
719
+ animation: none;
720
+ }
676
721
  }
677
722
 
678
723
  /* Opacity-only — parent transform would isolate and break child `backdrop-filter`. */
@@ -1240,7 +1285,8 @@
1240
1285
 
1241
1286
  /* Carousel — stage drag + control focus (nav lives below slides) */
1242
1287
  @media (prefers-reduced-motion: reduce) {
1243
- [data-refineui="carousel-track"][data-animated="true"] {
1288
+ [data-refineui="carousel-track"][data-animated="true"],
1289
+ [data-refineui="carousel-indicator-thumb"][data-animate="true"] {
1244
1290
  transition: none !important;
1245
1291
  }
1246
1292
  }
@@ -1253,7 +1299,8 @@
1253
1299
  [data-refineui="carousel-indicator-thumb"] {
1254
1300
  transition: none;
1255
1301
  }
1256
- [data-refineui="carousel-indicator-thumb"][data-ready="true"] {
1302
+ /* Animate only after first layout (`data-animate`) so mount does not grow from 0 — Segmented Control contract. */
1303
+ [data-refineui="carousel-indicator-thumb"][data-animate="true"] {
1257
1304
  transition: transform var(--refineui-motion-duration-medium) var(--refineui-motion-easing-emphasized),
1258
1305
  width var(--refineui-motion-duration-medium) var(--refineui-motion-easing-emphasized);
1259
1306
  }
@@ -2081,6 +2128,56 @@ a[data-refineui="link"]:focus-visible {
2081
2128
  top: 0;
2082
2129
  height: 100%;
2083
2130
  }
2131
+ /*
2132
+ * ScrollArea edge blur (always on) — rows marked `data-scroll-edge-item` soften progressively
2133
+ * across the outer 25% of the scrollport on each side, like a picker wheel's edge. Size and opacity
2134
+ * stay put, so rows never shift or shrink.
2135
+ *
2136
+ * The scroll-driven animation (`view()` cover range) only tracks *where* a row sits; ScrollArea
2137
+ * scales that by `--refineui-scroll-edge-top` / `-bottom` (0 → 1 as content hides past that edge),
2138
+ * so lists that do not scroll, and the edge you are parked at, stay untouched.
2139
+ * `cover 0%` is the block-end edge (rows entering from below), `cover 100%` the block-start edge.
2140
+ */
2141
+ @supports (animation-timeline: view()) {
2142
+ @property --refineui-scroll-edge-end {
2143
+ syntax: "<number>";
2144
+ inherits: false;
2145
+ initial-value: 0;
2146
+ }
2147
+ @property --refineui-scroll-edge-start {
2148
+ syntax: "<number>";
2149
+ inherits: false;
2150
+ initial-value: 0;
2151
+ }
2152
+ @keyframes refineui-scroll-edge-falloff {
2153
+ cover 0% {
2154
+ --refineui-scroll-edge-end: 1;
2155
+ }
2156
+ cover 25% {
2157
+ --refineui-scroll-edge-end: 0;
2158
+ }
2159
+ cover 75% {
2160
+ --refineui-scroll-edge-start: 0;
2161
+ }
2162
+ cover 100% {
2163
+ --refineui-scroll-edge-start: 1;
2164
+ }
2165
+ }
2166
+ [data-refineui="scroll-area"] [data-scroll-edge-item] {
2167
+ --refineui-scroll-edge-amount: max(
2168
+ calc(var(--refineui-scroll-edge-end) * var(--refineui-scroll-edge-bottom, 0)),
2169
+ calc(var(--refineui-scroll-edge-start) * var(--refineui-scroll-edge-top, 0))
2170
+ );
2171
+ filter: blur(calc(var(--refineui-blur-scroll-edge) * var(--refineui-scroll-edge-amount)));
2172
+ animation: refineui-scroll-edge-falloff linear both;
2173
+ animation-timeline: view();
2174
+ }
2175
+ }
2176
+ @media (prefers-reduced-motion: reduce) {
2177
+ [data-refineui="scroll-area"] [data-scroll-edge-item] {
2178
+ animation: none;
2179
+ }
2180
+ }
2084
2181
  [data-refineui="scroll-area-scrollbar"][data-state="hidden"] {
2085
2182
  pointer-events: none;
2086
2183
  opacity: 0;
@@ -2128,11 +2225,41 @@ a[data-refineui="link"]:focus-visible {
2128
2225
  pointer-events: auto;
2129
2226
  }
2130
2227
 
2131
- /* Command list — fixed height shell so ScrollArea viewport can scroll */
2228
+ /*
2229
+ * Command list — shell height is the measured results height (inline), capped by max-height,
2230
+ * so ScrollArea still gets a real height. Height animates as results filter in and out.
2231
+ */
2232
+ /* Panel radius per size — matches the SearchField radius of the same size; the scrollbar inset reads it too. */
2233
+ [data-refineui="command"] {
2234
+ --refineui-command-list-radius: var(--refineui-radius-rounded-x-large);
2235
+ }
2236
+ [data-refineui="command"][data-size="sm"] {
2237
+ --refineui-command-list-radius: var(--refineui-radius-rounded-large);
2238
+ }
2239
+ [data-refineui="command"][data-size="lg"] {
2240
+ --refineui-command-list-radius: var(--refineui-radius-rounded-xx-large);
2241
+ }
2132
2242
  [data-refineui="command-list"] {
2133
- height: min(60vh, var(--refineui-size-foundation-size-3200));
2134
2243
  max-height: min(60vh, var(--refineui-size-foundation-size-3200));
2135
2244
  overflow: hidden;
2245
+ border-radius: var(--refineui-command-list-radius);
2246
+ }
2247
+ /*
2248
+ * Shorten the default rail at both ends so it clears the panel's rounded corners;
2249
+ * half the radius is enough at the default inline inset. Rail look stays the ScrollArea default.
2250
+ */
2251
+ [data-refineui="command-list"]
2252
+ > [data-refineui="scroll-area"]
2253
+ > [data-refineui="scroll-area-scrollbar"][data-orientation="vertical"] {
2254
+ inset-block: calc(var(--refineui-command-list-radius) / 2);
2255
+ }
2256
+ [data-refineui="command-list"][data-animate="true"] {
2257
+ transition: height var(--refineui-motion-duration-medium) var(--refineui-motion-easing-emphasized);
2258
+ }
2259
+ @media (prefers-reduced-motion: reduce) {
2260
+ [data-refineui="command-list"][data-animate="true"] {
2261
+ transition: none;
2262
+ }
2136
2263
  }
2137
2264
  [data-refineui="command-list"] > [data-refineui="scroll-area"] {
2138
2265
  height: 100%;
@@ -2267,7 +2394,7 @@ a[data-refineui="link"]:focus-visible {
2267
2394
  [data-refineui="menu"],
2268
2395
  [data-refineui="dropdown-menu"],
2269
2396
  [data-refineui="select-menu"],
2270
- [data-refineui="command"],
2397
+ [data-refineui="command-list"],
2271
2398
  [data-refineui="dialog"] {
2272
2399
  border-color: CanvasText;
2273
2400
  }
@@ -2295,6 +2422,19 @@ a[data-refineui="link"]:focus-visible {
2295
2422
  display: none;
2296
2423
  }
2297
2424
 
2425
+ /* Detached layout: the root draws no surface; text follows the system colors (panel border lives on command-list). */
2426
+ [data-refineui="command"] {
2427
+ color: CanvasText;
2428
+ }
2429
+ /* Author fills are dropped in forced colors — mark the selected command with a system outline. */
2430
+ [data-refineui="command-indicator"] {
2431
+ display: none;
2432
+ }
2433
+ [data-refineui="command-item"][data-selected="true"] {
2434
+ outline: 2px solid Highlight;
2435
+ outline-offset: calc(var(--refineui-focus-offset) * -1);
2436
+ }
2437
+
2298
2438
  [data-refineui="dialog"] > [role="presentation"],
2299
2439
  [data-refineui="drawer"] > [role="presentation"] {
2300
2440
  backdrop-filter: none;
@@ -5,7 +5,21 @@
5
5
  "kind": "root",
6
6
  "category": "components",
7
7
  "label": "Command",
8
- "props": [],
8
+ "props": [
9
+ {
10
+ "name": "size",
11
+ "label": "size",
12
+ "valueType": "enum",
13
+ "control": "segmented",
14
+ "options": [
15
+ "sm",
16
+ "md",
17
+ "lg"
18
+ ],
19
+ "defaultValue": "sm",
20
+ "section": "variants"
21
+ }
22
+ ],
9
23
  "preview": {
10
24
  "mode": "full"
11
25
  },
@@ -17,6 +17,19 @@
17
17
  ],
18
18
  "defaultValue": "filled",
19
19
  "section": "variants"
20
+ },
21
+ {
22
+ "name": "size",
23
+ "label": "size",
24
+ "valueType": "enum",
25
+ "control": "segmented",
26
+ "options": [
27
+ "sm",
28
+ "md",
29
+ "lg"
30
+ ],
31
+ "defaultValue": "sm",
32
+ "section": "variants"
20
33
  }
21
34
  ],
22
35
  "preview": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": "refineui.authoring/1",
3
3
  "packageName": "@refineui/react",
4
- "packageVersion": "0.1.2",
4
+ "packageVersion": "0.2.0",
5
5
  "css": [
6
6
  "@refineui/react/refineui.css"
7
7
  ],
@@ -332,6 +332,19 @@
332
332
  ],
333
333
  "defaultValue": "filled",
334
334
  "section": "variants"
335
+ },
336
+ {
337
+ "name": "size",
338
+ "label": "size",
339
+ "valueType": "enum",
340
+ "control": "segmented",
341
+ "options": [
342
+ "sm",
343
+ "md",
344
+ "lg"
345
+ ],
346
+ "defaultValue": "sm",
347
+ "section": "variants"
335
348
  }
336
349
  ],
337
350
  "preview": {
@@ -1671,7 +1684,21 @@
1671
1684
  "kind": "root",
1672
1685
  "category": "components",
1673
1686
  "label": "Command",
1674
- "props": [],
1687
+ "props": [
1688
+ {
1689
+ "name": "size",
1690
+ "label": "size",
1691
+ "valueType": "enum",
1692
+ "control": "segmented",
1693
+ "options": [
1694
+ "sm",
1695
+ "md",
1696
+ "lg"
1697
+ ],
1698
+ "defaultValue": "sm",
1699
+ "section": "variants"
1700
+ }
1701
+ ],
1675
1702
  "preview": {
1676
1703
  "mode": "full"
1677
1704
  },
@@ -8,6 +8,7 @@
8
8
  "empty": "command-empty",
9
9
  "group": "command-group",
10
10
  "group_heading": "command-group-heading",
11
+ "indicator": "command-indicator",
11
12
  "input": "command-input",
12
13
  "item": "command-item",
13
14
  "list": "command-list",
@@ -17,6 +18,13 @@
17
18
  "attributes": {
18
19
  "data-refineui": "command"
19
20
  },
21
+ "variants": {
22
+ "size": [
23
+ "sm",
24
+ "md",
25
+ "lg"
26
+ ]
27
+ },
20
28
  "states": {
21
29
  "pseudo": [
22
30
  "focus-visible"
@@ -16,6 +16,11 @@
16
16
  "appearance": [
17
17
  "filled",
18
18
  "plain"
19
+ ],
20
+ "size": [
21
+ "sm",
22
+ "md",
23
+ "lg"
19
24
  ]
20
25
  },
21
26
  "states": {