@floegence/floe-webapp-core 0.86.62 → 0.86.63

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/dist/surface.css CHANGED
@@ -121,7 +121,12 @@
121
121
  .floe-floating-presence,
122
122
  [data-floe-surface-part='switch-thumb'],
123
123
  [data-floe-surface-part='radio-dot'],
124
- [data-floe-surface-part='progress-fill']
124
+ [data-floe-surface-part='progress-fill'],
125
+ /* The travelling pill's transition is a motion timeline, not a palette
126
+ * fade. This rule sits after the segment-pill rule and shares its
127
+ * specificity, so without this exemption it would win and freeze the
128
+ * pill's transform. */
129
+ [data-floe-surface-part='segment-pill']
125
130
  )
126
131
  ) {
127
132
  transition-property: color, background-color, border-color, opacity;
@@ -171,6 +176,45 @@
171
176
  transition: none;
172
177
  }
173
178
 
179
+ /* A tab strip that continues past its box fades toward that edge. The fade is
180
+ * part of the rail, not a decoration on the tabs, so it follows the scroll
181
+ * state instead of any one item's position. */
182
+ [data-floe-surface-part='tab-rail'] {
183
+ --floe-rail-fade: 20px;
184
+ mask-image: none;
185
+ }
186
+ [data-floe-surface-part='tab-rail'][data-floe-overflow-start][data-floe-overflow-end] {
187
+ mask-image: linear-gradient(
188
+ to right,
189
+ transparent 0,
190
+ #000 var(--floe-rail-fade),
191
+ #000 calc(100% - var(--floe-rail-fade)),
192
+ transparent 100%
193
+ );
194
+ }
195
+ [data-floe-surface-part='tab-rail'][data-floe-overflow-start]:not([data-floe-overflow-end]) {
196
+ mask-image: linear-gradient(to right, transparent 0, #000 var(--floe-rail-fade));
197
+ }
198
+ [data-floe-surface-part='tab-rail'][data-floe-overflow-end]:not([data-floe-overflow-start]) {
199
+ mask-image: linear-gradient(to right, #000 calc(100% - var(--floe-rail-fade)), transparent 100%);
200
+ }
201
+
202
+ /* A travelling pill is the selection, not a second copy of it: the faces under
203
+ * it stay flat so the only thing that moves is the material. It keeps the
204
+ * language's one motion family, and a reduced-motion request lands it in place
205
+ * without the sweep. */
206
+ [data-floe-surface-part='segment-pill'] {
207
+ transition:
208
+ transform var(--floe-duration-base) var(--floe-ease-out),
209
+ width var(--floe-duration-base) var(--floe-ease-out);
210
+ will-change: transform, width;
211
+ }
212
+ @media (prefers-reduced-motion: reduce) {
213
+ [data-floe-surface-part='segment-pill'] {
214
+ transition: none;
215
+ }
216
+ }
217
+
174
218
  /* A compound input has one decorative boundary, including host compositions
175
219
  * that contain an Input component. Dense nested actions stay flat. */
176
220
  [data-floe-input-surface] [data-floe-surface],
@@ -334,6 +378,14 @@
334
378
  border-color: var(--floe-line);
335
379
  --floe-surface-decoration: var(--floe-elevation-raised);
336
380
  }
381
+ /* The travelling pill is a selected tab at rest: same fill, same hairline,
382
+ * same first elevation step. It carries them by itself because it has no
383
+ * per-option state to inherit from. */
384
+ & [data-floe-surface-part='segment-pill'] {
385
+ background-color: var(--card);
386
+ border: 1px solid var(--floe-line);
387
+ --floe-surface-decoration: var(--floe-elevation-raised);
388
+ }
337
389
  & [data-floe-surface-part='segment'][aria-checked='false'] {
338
390
  background-color: transparent;
339
391
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floegence/floe-webapp-core",
3
- "version": "0.86.62",
3
+ "version": "0.86.63",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,29 +0,0 @@
1
- import { type JSX } from 'solid-js';
2
- export interface BottomBarProps {
3
- children?: JSX.Element;
4
- class?: string;
5
- /** Height class, defaults to 'h-5' (20px). Use Tailwind height classes like 'h-7' (28px). */
6
- height?: string;
7
- }
8
- /**
9
- * Status bar at the bottom of the application
10
- */
11
- export declare function BottomBar(props: BottomBarProps): JSX.Element;
12
- /**
13
- * Bottom bar item
14
- */
15
- export interface BottomBarItemProps {
16
- children: JSX.Element;
17
- icon?: JSX.Element;
18
- onClick?: () => void;
19
- class?: string;
20
- }
21
- export declare function BottomBarItem(props: BottomBarItemProps): JSX.Element;
22
- /**
23
- * Status indicator dot
24
- */
25
- export interface StatusIndicatorProps {
26
- status: 'connected' | 'disconnected' | 'connecting' | 'error';
27
- label?: string;
28
- }
29
- export declare function StatusIndicator(props: StatusIndicatorProps): JSX.Element;
@@ -1,70 +0,0 @@
1
- import { insert as n, effect as c, className as i, createComponent as a, template as s, delegateEvents as m } from "solid-js/web";
2
- import { Show as u } from "solid-js";
3
- import { cn as f } from "../../utils/cn.js";
4
- import { useResolvedFloeConfig as b } from "../../context/FloeConfigContext.js";
5
- var h = /* @__PURE__ */ s("<footer data-floe-shell-slot=bottom-bar style=background-color:var(--activity-bar);border-top-color:var(--bottom-bar-border)>"), g = /* @__PURE__ */ s('<span class="w-2.5 h-2.5">'), v = /* @__PURE__ */ s("<button type=button>"), d = /* @__PURE__ */ s("<span>");
6
- function C(t) {
7
- return (() => {
8
- var r = h();
9
- return n(r, () => t.children), c(() => i(r, f(t.height ?? "h-5", "shrink-0 flex items-center justify-between px-1.5", "bg-background border-t border-[var(--floe-line)]", "text-caption text-[var(--floe-ink-soft)] font-mono", t.class))), r;
10
- })();
11
- }
12
- function $(t) {
13
- const r = () => f("flex items-center gap-1 px-1 py-0.5 rounded-sm", t.onClick && "hover:bg-[var(--floe-state-hover)] cursor-pointer", "transition-colors duration-[var(--floe-duration-instant)]", t.class);
14
- return a(u, {
15
- get when() {
16
- return t.onClick;
17
- },
18
- get fallback() {
19
- return (() => {
20
- var e = d();
21
- return n(e, a(u, {
22
- get when() {
23
- return t.icon;
24
- },
25
- get children() {
26
- var o = g();
27
- return n(o, () => t.icon), o;
28
- }
29
- }), null), n(e, () => t.children, null), c(() => i(e, r())), e;
30
- })();
31
- },
32
- get children() {
33
- var e = v();
34
- return e.$$click = () => t.onClick?.(), n(e, a(u, {
35
- get when() {
36
- return t.icon;
37
- },
38
- get children() {
39
- var o = g();
40
- return n(o, () => t.icon), o;
41
- }
42
- }), null), n(e, () => t.children, null), c(() => i(e, r())), e;
43
- }
44
- });
45
- }
46
- function y(t) {
47
- const r = b(), e = {
48
- connected: "bg-success",
49
- disconnected: "bg-[var(--floe-ink-ghost)]",
50
- connecting: "bg-warning animate-pulse",
51
- error: "bg-error"
52
- }, o = () => r.config.strings.statusIndicator;
53
- return a($, {
54
- get children() {
55
- return [(() => {
56
- var l = d();
57
- return c(() => i(l, f("w-1.5 h-1.5 rounded-full", e[t.status]))), l;
58
- })(), (() => {
59
- var l = d();
60
- return n(l, () => t.label ?? o()[t.status]), l;
61
- })()];
62
- }
63
- });
64
- }
65
- m(["click"]);
66
- export {
67
- C as BottomBar,
68
- $ as BottomBarItem,
69
- y as StatusIndicator
70
- };