@pieai/swimmer-ui-kit 2.9.0 → 2.10.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
@@ -3,6 +3,24 @@
3
3
  All notable changes to `@pieai/swimmer-ui-kit`.
4
4
  Format: [Keep a Changelog](https://keepachangelog.com); versioning: semver.
5
5
 
6
+ ## 2.10.0 — 2026-09-24
7
+
8
+ Minor: publish the reviewed optional liquid interaction surface required by
9
+ NerveKit's human-paced guidance, companion settings and selection comparison.
10
+
11
+ - `LiquidPresence` accepts interactive guide content, an expanded review size,
12
+ explicit ambient motion and bounded material settings. Ordinary controls and
13
+ the omitted-option defaults remain unchanged.
14
+ - Export `LiquidAnchor` and `LiquidReveal` from the existing optional leaf for
15
+ host-positioned surfaces. These are presentation only, not agent, credential,
16
+ microphone, task or persistence implementations.
17
+ - Preserve native-dialog placement, reduced motion, visibility suspension,
18
+ original target hit boxes and shared rendering budgets. Final accepted model
19
+ results and user actions remain owned by the consuming application.
20
+
21
+ This release packages the previously committed and reviewed liquid work; it
22
+ does not replace a product's live-provider or deployment acceptance.
23
+
6
24
  ## 2.9.0 — 2026-09-21
7
25
 
8
26
  Minor: publish the optional liquid presence leaf for products that already own
@@ -1 +1 @@
1
- .game-ui-liquid-presence{--liquid-presence-from:var(--game-ui-secondary);--liquid-presence-to:var(--game-ui-secondary);vertical-align:middle;pointer-events:none;color:var(--game-ui-secondary);flex:none;line-height:0;display:inline-block;position:relative}.game-ui-liquid-presence>svg{width:100%;height:100%;display:block;overflow:visible}.game-ui-liquid-presence[data-activity=disabled]{opacity:.5}.game-ui-liquid-presence[data-activity=error],.game-ui-liquid-presence[data-activity=unknown]{--liquid-presence-from:var(--game-ui-warning);--liquid-presence-to:var(--game-ui-warning)}.game-ui-liquid-presence-overlay{z-index:95;pointer-events:none;color:var(--game-ui-secondary);position:fixed;inset:0;overflow:visible}.game-ui-liquid-presence-overlay>[hidden]{display:none!important}.game-ui-liquid-presence-flight,.game-ui-liquid-presence-seat{transform-origin:50%;position:absolute;top:0;left:0;overflow:visible}.game-ui-liquid-presence-flight{width:96px;height:72px}.game-ui-liquid-presence-seat{width:112px;height:56px}.game-ui-liquid-presence-label{box-sizing:border-box;border-radius:var(--game-ui-radius-control,12px);background:var(--game-ui-panel-strong);width:max-content;max-width:min(260px,100vw - 32px);color:var(--game-ui-text);box-shadow:var(--game-ui-shadow-button);font:500 13px/1.5 var(--game-ui-font-body);overflow-wrap:anywhere;text-wrap:pretty;padding:9px 14px;position:absolute;top:0;left:0}@media (prefers-reduced-motion:reduce){.game-ui-liquid-presence-flight{display:none}}@media (forced-colors:active){.game-ui-liquid-presence svg g,.game-ui-liquid-presence-overlay svg g,.game-ui-liquid-presence-overlay svg path{filter:none;fill:highlight}.game-ui-liquid-presence-label{color:canvastext;box-shadow:none;background:canvas;border:1px solid canvastext}}
1
+ :root{--game-ui-assistance-z:96;--game-ui-liquid-reveal-bg:#050c0df0;--game-ui-liquid-reveal-solid:#101718;--game-ui-liquid-reveal-text:#f2f7f4;--game-ui-liquid-reveal-muted:#b6c7c0;--game-ui-liquid-reveal-shadow:0 22px 70px #00000038;--game-ui-liquid-reveal-backdrop:#0000003d;--game-ui-liquid-action-face:#fff8ec;--game-ui-liquid-action-ink:#403127;--game-ui-liquid-action-lip:#ae9e87;--game-ui-liquid-action-border:#dccdb9;--game-ui-liquid-field-face:#0000003d;--game-ui-liquid-material-ink:#020a08;--game-ui-liquid-material-muted:#020a08;--game-ui-liquid-material-field:#104a41;--game-ui-liquid-field-ink:#f2f7f4}.game-ui-liquid-reveal .game-ui-button--secondary{background:var(--game-ui-liquid-action-face);color:var(--game-ui-liquid-action-ink);border:1px solid var(--game-ui-liquid-action-border);--game-ui-button-lip-ink:var(--game-ui-liquid-action-lip);--game-ui-shadow-button:inset 0 1px 0 color-mix(in srgb, var(--game-ui-liquid-action-face) 90%, transparent)}.game-ui-liquid-reveal .game-ui-button:disabled{opacity:.55}.game-ui-liquid-reveal .game-ui-button--ghost{color:var(--game-ui-liquid-reveal-muted)}.game-ui-liquid-reveal{isolation:isolate;min-width:0;color:var(--game-ui-liquid-reveal-text);font-family:var(--game-ui-font-body);border-radius:32px;position:relative}.game-ui-liquid-reveal:before{content:"";z-index:-1;background:var(--game-ui-liquid-reveal-bg);backdrop-filter:blur(8px);box-shadow:var(--game-ui-liquid-reveal-shadow);pointer-events:none;border-radius:27px;position:absolute;inset:6px}.game-ui-liquid-reveal-content{z-index:1;min-width:0;padding:12px;position:relative}.game-ui-liquid-reveal[data-reveal-surface=material]{--game-ui-liquid-reveal-text:var(--game-ui-liquid-material-ink);--game-ui-liquid-reveal-muted:var(--game-ui-liquid-material-muted);--game-ui-liquid-field-face:var(--game-ui-liquid-material-field)}.game-ui-liquid-reveal[data-reveal-surface=material]:before{backdrop-filter:none;background:0 0}.game-ui-liquid-reveal[data-reveal-surface=material][data-reveal-motion=preparing] .game-ui-liquid-reveal-content,.game-ui-liquid-reveal[data-reveal-surface=material][data-reveal-motion=preparing] .game-ui-liquid-reveal-ink{opacity:0}.game-ui-liquid-reveal[data-reveal-surface=material]:is([data-reveal-motion=preparing],[data-reveal-motion=drawing]):before{box-shadow:none}.game-ui-liquid-reveal[data-reveal-filter=flat]:before{backdrop-filter:none;background:var(--game-ui-liquid-reveal-solid)}.game-ui-liquid-reveal-ink{pointer-events:none;position:absolute;inset:0;overflow:visible}.game-ui-liquid-reveal[data-reveal-variant=input]{border-radius:36px}.game-ui-liquid-reveal[data-reveal-variant=input]:before{border-radius:30px}@media (forced-colors:active){.game-ui-liquid-reveal{color:canvastext;border:2px solid canvastext}.game-ui-liquid-reveal:before{box-shadow:none;backdrop-filter:none;background:canvas}.game-ui-liquid-reveal[data-reveal-surface=material]{--game-ui-liquid-reveal-text:CanvasText;--game-ui-liquid-reveal-muted:CanvasText;--game-ui-liquid-field-ink:CanvasText;--game-ui-liquid-field-face:Canvas}.game-ui-liquid-reveal[data-reveal-surface=material]:before{background:canvas}.game-ui-liquid-reveal-ink{display:none}}.game-ui-liquid-presence{--liquid-presence-from:var(--game-ui-secondary);--liquid-presence-to:var(--game-ui-secondary);vertical-align:middle;pointer-events:none;color:var(--game-ui-secondary);flex:none;line-height:0;display:inline-block;position:relative}.game-ui-liquid-presence>svg{width:100%;height:100%;display:block;overflow:visible}.game-ui-liquid-presence[data-activity=disabled]{opacity:.5}.game-ui-liquid-presence[data-activity=error],.game-ui-liquid-presence[data-activity=unknown]{--liquid-presence-from:var(--game-ui-warning);--liquid-presence-to:var(--game-ui-warning)}.game-ui-liquid-presence-overlay{z-index:95;pointer-events:none;color:var(--game-ui-secondary);position:fixed;inset:0;overflow:visible}.game-ui-liquid-presence-overlay>[hidden]{display:none!important}.game-ui-liquid-presence-flight,.game-ui-liquid-presence-seat{transform-origin:50%;position:absolute;top:0;left:0;overflow:visible}.game-ui-liquid-presence-flight{width:96px;height:72px}.game-ui-liquid-presence-seat{width:112px;height:56px}.game-ui-liquid-presence-label{box-sizing:border-box;border-radius:var(--game-ui-radius-control,12px);background:var(--game-ui-panel-strong);width:max-content;max-width:min(260px,100vw - 32px);color:var(--game-ui-text);box-shadow:var(--game-ui-shadow-button);font:500 13px/1.5 var(--game-ui-font-body);overflow-wrap:anywhere;text-wrap:pretty;padding:9px 14px;position:absolute;top:0;left:0}.game-ui-liquid-presence-label--guide{overscroll-behavior:contain;pointer-events:auto;text-wrap:wrap;border-radius:16px;width:300px;max-width:calc(100vw - 32px);max-height:min(300px,42dvh);padding:16px;overflow:auto}.game-ui-liquid-presence-label--expanded{flex-direction:column;width:420px;max-height:min(560px,65dvh);display:flex}@media (prefers-reduced-motion:reduce){.game-ui-liquid-presence-flight{display:none}}@media (forced-colors:active){.game-ui-liquid-presence svg g,.game-ui-liquid-presence-overlay svg g,.game-ui-liquid-presence-overlay svg path{filter:none;fill:highlight}.game-ui-liquid-presence-label{color:canvastext;box-shadow:none;background:canvas;border:1px solid canvastext}}.game-ui-liquid-anchor{z-index:var(--game-ui-assistance-z,95);width:max-content}
@@ -1,4 +1,19 @@
1
1
  import { JSX } from 'react';
2
+ import { Placement } from '@floating-ui/react';
3
+ import { ReactNode } from 'react';
4
+ import { RefObject } from 'react';
5
+
6
+ /** Positions an outlet beside a host-owned body, never positions the body itself.
7
+ * Reuses Floating UI and the source's native dialog; no second modal manager. */
8
+ export declare function LiquidAnchor({ source, children, placement, onBoundsChange, }: LiquidAnchorProps): JSX.Element | null;
9
+
10
+ export declare interface LiquidAnchorProps {
11
+ source: RefObject<HTMLElement | null>;
12
+ children: ReactNode;
13
+ placement?: Placement;
14
+ /** A layout observation for host scene-label avoidance, never permission. */
15
+ onBoundsChange?(rect: LiquidPresenceRect | null): void;
16
+ }
2
17
 
3
18
  /** A liquid body and its visual gesture. It never creates a model, acquires
4
19
  * media, clicks an app control, or interprets animation as a task receipt. */
@@ -13,6 +28,15 @@ export declare interface LiquidPresenceProps {
13
28
  target?: LiquidPresenceTarget | null;
14
29
  /** True disables travel but never removes the target explanation. */
15
30
  reducedMotion?: boolean;
31
+ /** Explicit host opt-in. A quiet living contour, never an audio observation.
32
+ * The ordinary component stays still when omitted. */
33
+ idleMotion?: 'still' | 'breathe';
34
+ /** Material flow only, not task or guidance duration. Clamped to 0.5..1.5. */
35
+ motionSpeed?: number;
36
+ /** Contour/speech detail, clamped to 0.25..1.25. Hit targets never change. */
37
+ motionIntensity?: number;
38
+ /** Small liquid satellites during observed speech; never during idle. */
39
+ splashes?: boolean;
16
40
  /** Actual amplitude only. Null/invalid values mean unavailable, not mock audio. */
17
41
  levelRef?: {
18
42
  readonly current: number | null;
@@ -20,6 +44,14 @@ export declare interface LiquidPresenceProps {
20
44
  colorFrom?: string;
21
45
  colorTo?: string;
22
46
  className?: string;
47
+ /** Human-paced explanation at the destination. The host owns its controls;
48
+ * this stays until explicit dismissal/target loss, not a reading deadline. */
49
+ guideContent?: ReactNode;
50
+ /** Expanded for review/editing content; still bounded to the visible viewport. */
51
+ guideSize?: 'compact' | 'expanded';
52
+ /** Pointing at a button dismisses by default. Editor-attached assistance may
53
+ * opt out so selecting/typing never discards the user's comparison draft. */
54
+ dismissOnTargetClick?: boolean;
23
55
  /** Visual dismissal only; never wire this to task cancellation. */
24
56
  onDismiss?(reason: 'dismissed' | 'unavailable' | 'expired'): void;
25
57
  }
@@ -41,4 +73,29 @@ export declare interface LiquidPresenceTarget {
41
73
  contextElement?: Element | null;
42
74
  }
43
75
 
76
+ /** One finite material gesture, not a window, microphone, state machine or
77
+ * another orb. The real HTML stays still and usable while the perimeter draws.
78
+ * Uses the SAME opaque fill, goo/gloss and budget as LiquidPresence. */
79
+ export declare function LiquidReveal({ children, source, revealKey, variant, surface, reducedMotion, idleMotion, colorFrom, colorTo, motionIntensity, motionSpeed, className, }: LiquidRevealProps): JSX.Element;
80
+
81
+ export declare interface LiquidRevealProps {
82
+ children: ReactNode;
83
+ /** Real launcher geometry. Omit for a static inline resource surface. */
84
+ source?: RefObject<HTMLElement | null>;
85
+ /** A new explicitly requested presentation, never a token/stream revision. */
86
+ revealKey?: string;
87
+ variant?: 'content' | 'input';
88
+ /** Same liquid colour through the whole face. Dark retains the earlier style. */
89
+ surface?: 'material' | 'dark';
90
+ reducedMotion?: boolean;
91
+ /** Optional slow perimeter flow. Caller must offer a persistent pause control. */
92
+ idleMotion?: 'still' | 'breathe';
93
+ /** Same palette as the source; appearance only, never provider state. */
94
+ colorFrom?: string;
95
+ colorTo?: string;
96
+ motionIntensity?: number;
97
+ motionSpeed?: number;
98
+ className?: string;
99
+ }
100
+
44
101
  export { }