@floegence/floe-webapp-core 0.86.60 → 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.
Files changed (122) hide show
  1. package/dist/app/FloeRegistryContributions.js +0 -3
  2. package/dist/components/chat/blocks/BlockRenderer.js +1 -1
  3. package/dist/components/chat/blocks/CodeDiffBlock.js +56 -56
  4. package/dist/components/chat/blocks/ImageBlock.js +1 -1
  5. package/dist/components/chat/blocks/ToolCallBlock.js +57 -57
  6. package/dist/components/chat/status/ConnectionStatus.js +10 -10
  7. package/dist/components/deck/DeckCell.js +25 -25
  8. package/dist/components/deck/DeckContextMenu.js +20 -20
  9. package/dist/components/deck/DeckGrid.js +1 -1
  10. package/dist/components/deck/DeckTopBar.js +42 -42
  11. package/dist/components/deck/DropZonePreview.js +6 -6
  12. package/dist/components/deck/LayoutSelector.js +53 -53
  13. package/dist/components/deck/WidgetFrame.js +28 -28
  14. package/dist/components/deck/WidgetPalette.js +31 -31
  15. package/dist/components/deck/WidgetTypeSwitcher.js +31 -31
  16. package/dist/components/file-browser/Breadcrumb.js +27 -27
  17. package/dist/components/file-browser/DirectoryTree.js +15 -15
  18. package/dist/components/file-browser/DragPreview.js +58 -58
  19. package/dist/components/file-browser/FileBrowser.js +17 -17
  20. package/dist/components/file-browser/FileBrowserStatusBar.js +18 -18
  21. package/dist/components/file-browser/FileBrowserToolbar.js +27 -27
  22. package/dist/components/file-browser/FileContextMenu.js +47 -47
  23. package/dist/components/file-browser/FileGridView.js +53 -51
  24. package/dist/components/file-browser/FileItemDecorations.js +30 -27
  25. package/dist/components/file-browser/FileListView.js +114 -114
  26. package/dist/components/icons/ActivityRailIcons.d.ts +30 -0
  27. package/dist/components/icons/ActivityRailIcons.js +68 -0
  28. package/dist/components/icons/index.d.ts +1 -0
  29. package/dist/components/icons/index.js +1357 -1357
  30. package/dist/components/launchpad/Launchpad.js +14 -14
  31. package/dist/components/launchpad/LaunchpadGrid.js +7 -7
  32. package/dist/components/launchpad/LaunchpadItem.js +11 -11
  33. package/dist/components/launchpad/LaunchpadPagination.js +16 -16
  34. package/dist/components/launchpad/LaunchpadSearch.js +9 -9
  35. package/dist/components/layout/ActivityBar.js +61 -63
  36. package/dist/components/layout/DisplayModeSwitcher.d.ts +10 -0
  37. package/dist/components/layout/DisplayModeSwitcher.js +102 -33
  38. package/dist/components/layout/MobileNavigationPanel.js +36 -36
  39. package/dist/components/layout/MobileTabBar.js +39 -39
  40. package/dist/components/layout/Panel.js +16 -16
  41. package/dist/components/layout/ResizeHandle.js +19 -19
  42. package/dist/components/layout/Shell.d.ts +0 -6
  43. package/dist/components/layout/Shell.js +208 -254
  44. package/dist/components/layout/Sidebar.js +37 -36
  45. package/dist/components/layout/SidebarPane.js +19 -19
  46. package/dist/components/layout/ThemeToggle.d.ts +19 -0
  47. package/dist/components/layout/ThemeToggle.js +39 -0
  48. package/dist/components/layout/TopBar.js +16 -16
  49. package/dist/components/layout/TopBarIconButton.js +15 -15
  50. package/dist/components/layout/index.d.ts +1 -1
  51. package/dist/components/loading/LoadingOverlay.js +9 -9
  52. package/dist/components/loading/Skeleton.js +11 -11
  53. package/dist/components/ui/Button.js +44 -36
  54. package/dist/components/ui/Card.d.ts +11 -62
  55. package/dist/components/ui/Card.js +64 -237
  56. package/dist/components/ui/Checkbox.js +79 -79
  57. package/dist/components/ui/CommandPalette.js +56 -55
  58. package/dist/components/ui/Dialog.js +91 -93
  59. package/dist/components/ui/DirectoryInput.js +22 -22
  60. package/dist/components/ui/DirectoryPicker.js +8 -8
  61. package/dist/components/ui/Dropdown.js +89 -87
  62. package/dist/components/ui/FeedbackIndicator.js +57 -57
  63. package/dist/components/ui/FileOpenPicker.js +37 -37
  64. package/dist/components/ui/FileSavePicker.js +41 -41
  65. package/dist/components/ui/FloatingWindow.js +213 -205
  66. package/dist/components/ui/Form.js +76 -76
  67. package/dist/components/ui/HighlightBlock.js +14 -14
  68. package/dist/components/ui/Input.js +106 -109
  69. package/dist/components/ui/Pagination.js +86 -86
  70. package/dist/components/ui/Popover.d.ts +33 -0
  71. package/dist/components/ui/Popover.js +133 -0
  72. package/dist/components/ui/ProcessingIndicator.js +344 -345
  73. package/dist/components/ui/Progress.js +94 -97
  74. package/dist/components/ui/QuoteBlock.js +25 -25
  75. package/dist/components/ui/Radio.js +91 -91
  76. package/dist/components/ui/SegmentedControl.js +24 -24
  77. package/dist/components/ui/Stepper.js +68 -60
  78. package/dist/components/ui/Switch.js +25 -25
  79. package/dist/components/ui/Tabs.js +188 -163
  80. package/dist/components/ui/Tag.js +12 -9
  81. package/dist/components/ui/Tooltip.js +30 -30
  82. package/dist/components/ui/floatingPresence.d.ts +7 -0
  83. package/dist/components/ui/floatingPresence.js +80 -39
  84. package/dist/components/ui/index.d.ts +2 -1
  85. package/dist/components/ui/picker/DirectoryFavorites.js +27 -27
  86. package/dist/components/ui/picker/PickerBase.js +107 -107
  87. package/dist/context/ComponentRegistry.d.ts +0 -8
  88. package/dist/context/ComponentRegistry.js +61 -67
  89. package/dist/context/FloeConfigContext.d.ts +0 -6
  90. package/dist/context/FloeConfigContext.js +9 -15
  91. package/dist/context/NotificationContext.js +4 -4
  92. package/dist/context/ThemeContext.js +71 -70
  93. package/dist/context/index.d.ts +1 -1
  94. package/dist/display-mode.css +2 -45
  95. package/dist/floe.css +205 -43
  96. package/dist/full.js +701 -695
  97. package/dist/icons.js +112 -102
  98. package/dist/language.css +320 -0
  99. package/dist/layout.js +33 -35
  100. package/dist/primitives.css +23 -17
  101. package/dist/standalone.css +1 -0
  102. package/dist/styles/themes/classicSemanticTokens.d.ts +122 -122
  103. package/dist/styles/themes/classicSemanticTokens.js +140 -138
  104. package/dist/styles/themes/index.d.ts +3 -1
  105. package/dist/styles/themes/index.js +10 -10
  106. package/dist/styles/themes/presets.d.ts +2 -2
  107. package/dist/styles/themes/presets.js +34 -34
  108. package/dist/styles/tokens.d.ts +152 -68
  109. package/dist/styles/tokens.js +87 -49
  110. package/dist/styles.css +1 -1
  111. package/dist/surface.css +214 -117
  112. package/dist/themes/dark.css +64 -64
  113. package/dist/themes/light.css +64 -64
  114. package/dist/ui.css +171 -255
  115. package/dist/ui.js +176 -178
  116. package/dist/utils/hotInteraction.d.ts +7 -0
  117. package/dist/utils/hotInteraction.js +12 -12
  118. package/dist/widgets/TerminalWidget.js +28 -28
  119. package/dist/workbench-composition.css +15 -15
  120. package/package.json +1 -1
  121. package/dist/components/layout/BottomBar.d.ts +0 -29
  122. package/dist/components/layout/BottomBar.js +0 -70
@@ -1,14 +1,14 @@
1
- import { insert as l, effect as s, setAttribute as f, className as c, setStyleProperty as u, memo as w, template as d, delegateEvents as S } from "solid-js/web";
1
+ import { insert as n, effect as d, setAttribute as f, className as s, setStyleProperty as u, memo as $, template as c, delegateEvents as _ } from "solid-js/web";
2
2
  import "solid-js";
3
3
  import { cn as v } from "../../utils/cn.js";
4
- var k = /* @__PURE__ */ d('<aside data-floe-shell-slot=sidebar data-floe-geometry-surface=shell-sidebar><div class="flex-1 overflow-auto overscroll-contain">'), _ = /* @__PURE__ */ d("<div>"), C = /* @__PURE__ */ d("<section><div class=flex-1>"), I = /* @__PURE__ */ d('<div class="flex items-center justify-between px-2.5 py-2 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60"><span>'), L = /* @__PURE__ */ d('<button type=button><span class="flex-1 truncate text-left">'), M = /* @__PURE__ */ d('<span class="flex-shrink-0 w-4 h-4 opacity-60">');
5
- function E(e) {
6
- const t = () => e.collapsed ?? !1, a = () => e.width ?? 350, n = () => e.visibilityMotion ?? "animated";
4
+ var S = /* @__PURE__ */ c('<aside data-floe-shell-slot=sidebar data-floe-geometry-surface=shell-sidebar><div class="flex-1 overflow-auto overscroll-contain">'), k = /* @__PURE__ */ c("<div>"), C = /* @__PURE__ */ c("<section><div class=flex-1>"), q = /* @__PURE__ */ c('<div class="flex items-center justify-between px-2.5 py-2 text-caption font-semibold uppercase tracking-wider text-[var(--floe-ink-quiet)]"><span>'), I = /* @__PURE__ */ c('<button type=button data-floe-interactive=row><span class="flex-1 truncate text-left">'), L = /* @__PURE__ */ c("<span>");
5
+ function A(e) {
6
+ const t = () => e.collapsed ?? !1, a = () => e.width ?? 350, l = () => e.visibilityMotion ?? "animated";
7
7
  return (() => {
8
- var i = k(), o = i.firstChild;
9
- return l(o, () => e.children), l(i, () => e.resizer, null), s((r) => {
10
- var b = n(), h = v("relative h-full flex flex-col shrink-0 min-h-0", "bg-sidebar text-sidebar-foreground", "border-r border-sidebar-border", "overflow-hidden", n() === "animated" && "transition-[width] duration-150 ease-out", e.class), m = t() ? "0px" : `${a()}px`, x = t() ? "hidden" : "visible", g = t() ? "0px" : void 0, y = e.ariaLabel, $ = t() ? "true" : void 0;
11
- return b !== r.e && f(i, "data-floe-sidebar-visibility-motion", r.e = b), h !== r.t && c(i, r.t = h), m !== r.a && u(i, "width", r.a = m), x !== r.o && u(i, "visibility", r.o = x), g !== r.i && u(i, "border-right-width", r.i = g), y !== r.n && f(i, "aria-label", r.n = y), $ !== r.s && f(i, "aria-hidden", r.s = $), r;
8
+ var i = S(), o = i.firstChild;
9
+ return n(o, () => e.children), n(i, () => e.resizer, null), d((r) => {
10
+ var b = l(), h = v("relative h-full flex flex-col shrink-0 min-h-0", "bg-sidebar text-sidebar-foreground", "border-r border-sidebar-border", "overflow-hidden", l() === "animated" && "transition-[width] duration-[var(--floe-duration-fast)] ease-out", e.class), m = t() ? "0px" : `${a()}px`, x = t() ? "hidden" : "visible", g = t() ? "0px" : void 0, w = e.ariaLabel, y = t() ? "true" : void 0;
11
+ return b !== r.e && f(i, "data-floe-sidebar-visibility-motion", r.e = b), h !== r.t && s(i, r.t = h), m !== r.a && u(i, "width", r.a = m), x !== r.o && u(i, "visibility", r.o = x), g !== r.i && u(i, "border-right-width", r.i = g), w !== r.n && f(i, "aria-label", r.n = w), y !== r.s && f(i, "aria-hidden", r.s = y), r;
12
12
  }, {
13
13
  e: void 0,
14
14
  t: void 0,
@@ -20,53 +20,54 @@ function E(e) {
20
20
  }), i;
21
21
  })();
22
22
  }
23
- function N(e) {
23
+ function E(e) {
24
24
  return (() => {
25
- var t = _();
26
- return l(t, () => e.children), s(() => c(t, v("p-2.5 space-y-3", e.class))), t;
25
+ var t = k();
26
+ return n(t, () => e.children), d(() => s(t, v("p-2.5 space-y-3", e.class))), t;
27
27
  })();
28
28
  }
29
- function P(e) {
29
+ function N(e) {
30
30
  return (() => {
31
- var t = _();
32
- return l(t, () => e.children), s(() => c(t, v("space-y-0.5", e.class))), t;
31
+ var t = k();
32
+ return n(t, () => e.children), d(() => s(t, v("space-y-0.5", e.class))), t;
33
33
  })();
34
34
  }
35
- function q(e) {
35
+ function P(e) {
36
36
  return (() => {
37
37
  var t = C(), a = t.firstChild;
38
- return l(t, (() => {
39
- var n = w(() => !!e.title);
40
- return () => n() && (() => {
41
- var i = I(), o = i.firstChild;
42
- return l(o, () => e.title), l(i, () => e.actions, null), i;
38
+ return n(t, (() => {
39
+ var l = $(() => !!e.title);
40
+ return () => l() && (() => {
41
+ var i = q(), o = i.firstChild;
42
+ return n(o, () => e.title), n(i, () => e.actions, null), i;
43
43
  })();
44
- })(), a), l(a, () => e.children), s(() => c(t, v("flex flex-col", e.class))), t;
44
+ })(), a), n(a, () => e.children), d(() => s(t, v("flex flex-col", e.class))), t;
45
45
  })();
46
46
  }
47
47
  function B(e) {
48
48
  return (() => {
49
- var t = L(), a = t.firstChild;
50
- return t.$$click = () => e.onClick?.(), l(t, (() => {
51
- var n = w(() => !!e.icon);
52
- return () => n() && (() => {
53
- var i = M();
54
- return l(i, () => e.icon), i;
49
+ var t = I(), a = t.firstChild;
50
+ return t.$$click = () => e.onClick?.(), n(t, (() => {
51
+ var l = $(() => !!e.icon);
52
+ return () => l() && (() => {
53
+ var i = L();
54
+ return n(i, () => e.icon), d(() => s(i, v("flex-shrink-0 w-4 h-4 transition-colors duration-[var(--floe-duration-fast)] ease-[var(--floe-ease-out)]", e.active ? "text-[var(--floe-ink-soft)]" : "text-[var(--floe-ink-quiet)] group-hover:text-[var(--floe-ink)]"))), i;
55
55
  })();
56
- })(), a), l(a, () => e.children), s((n) => {
57
- var i = v("w-full min-h-[var(--floe-row-height)] flex items-center gap-2 px-2.5 py-1 text-[length:var(--floe-type-control)] leading-[var(--floe-line-control)] cursor-pointer", "transition-colors duration-75", "hover:bg-sidebar-accent/80 hover:text-sidebar-accent-foreground", "focus:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-sidebar-ring", e.active && "bg-sidebar-accent text-sidebar-accent-foreground font-medium", e.class), o = e.indent ? `${10 + e.indent * 10}px` : void 0;
58
- return i !== n.e && c(t, n.e = i), o !== n.t && u(t, "padding-left", n.t = o), n;
56
+ })(), a), n(a, () => e.children), d((l) => {
57
+ var i = e.active ? "true" : void 0, o = v("group w-full min-h-[var(--floe-row-height)] flex items-center gap-2 pl-2.5 pr-2 mx-1 rounded-sm", "text-[length:var(--floe-type-control)] leading-[var(--floe-line-control)] cursor-pointer", "text-[var(--floe-ink-soft)]", "focus:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-ring", e.active && "text-foreground font-medium", e.class), r = e.indent ? `${10 + e.indent * 10}px` : void 0;
58
+ return i !== l.e && f(t, "data-selected", l.e = i), o !== l.t && s(t, l.t = o), r !== l.a && u(t, "padding-left", l.a = r), l;
59
59
  }, {
60
60
  e: void 0,
61
- t: void 0
61
+ t: void 0,
62
+ a: void 0
62
63
  }), t;
63
64
  })();
64
65
  }
65
- S(["click"]);
66
+ _(["click"]);
66
67
  export {
67
- E as Sidebar,
68
- N as SidebarContent,
68
+ A as Sidebar,
69
+ E as SidebarContent,
69
70
  B as SidebarItem,
70
- P as SidebarItemList,
71
- q as SidebarSection
71
+ N as SidebarItemList,
72
+ P as SidebarSection
72
73
  };
@@ -1,43 +1,43 @@
1
- import { insert as r, createComponent as o, use as E, effect as S, className as d, setStyleProperty as _, setAttribute as f, template as a, delegateEvents as L } from "solid-js/web";
2
- import { Show as s } from "solid-js";
1
+ import { insert as o, createComponent as r, use as E, effect as S, className as d, setStyleProperty as _, setAttribute as b, template as s, delegateEvents as L } from "solid-js/web";
2
+ import { Show as a } from "solid-js";
3
3
  import { useLayout as O } from "../../context/LayoutContext.js";
4
4
  import { cn as c } from "../../utils/cn.js";
5
5
  import { ResizeHandle as P } from "./ResizeHandle.js";
6
- var H = /* @__PURE__ */ a('<div class="min-w-0 flex items-center gap-1.5">'), N = /* @__PURE__ */ a('<button type=button class="flex items-center justify-center w-5 h-5 rounded cursor-pointer hover:bg-sidebar-accent/80 transition-colors focus:outline-none focus-visible:ring-1 focus-visible:ring-sidebar-ring focus-visible:ring-inset"aria-label="Close sidebar"><svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="w-3.5 h-3.5"><path d="M18 6 6 18"></path><path d="m6 6 12 12">'), q = /* @__PURE__ */ a('<div class="flex min-w-0 items-center gap-1.5">'), D = /* @__PURE__ */ a('<aside data-floe-geometry-surface=sidebar-pane><div><div class="flex items-center justify-between px-3 py-2 border-b border-sidebar-border"><span class="text-[11px] font-semibold uppercase tracking-wider text-muted-foreground/60"></span></div><div>'), F = /* @__PURE__ */ a("<div>");
6
+ var q = /* @__PURE__ */ s('<div class="min-w-0 flex items-center gap-1.5">'), H = /* @__PURE__ */ s('<button type=button class="flex items-center justify-center w-5 h-5 rounded-xs cursor-pointer hover:bg-[var(--floe-state-hover)] focus:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-inset"aria-label="Close sidebar"><svg xmlns=http://www.w3.org/2000/svg viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round class="w-3.5 h-3.5"><path d="M18 6 6 18"></path><path d="m6 6 12 12">'), N = /* @__PURE__ */ s('<div class="flex min-w-0 items-center gap-1.5">'), D = /* @__PURE__ */ s('<aside data-floe-geometry-surface=sidebar-pane><div><div class="flex items-center justify-between px-3 py-2 border-b border-sidebar-border"><span class="text-caption font-semibold uppercase tracking-wider text-[var(--floe-ink-quiet)]"></span></div><div>'), F = /* @__PURE__ */ s("<div>");
7
7
  function T(t) {
8
- const A = O(), m = () => A.isMobile(), g = () => t.width ?? 240, u = () => t.open ?? !0, l = () => m() && t.mobileOverlay !== !1 && u(), w = () => l() && typeof t.onClose == "function", B = () => l() && t.mobileBackdrop !== !1 && typeof t.onClose == "function", M = () => t.resizable && u() && !m() && typeof t.onResize == "function";
8
+ const A = O(), m = () => A.isMobile(), w = () => t.width ?? 240, u = () => t.open ?? !0, l = () => m() && t.mobileOverlay !== !1 && u(), g = () => l() && typeof t.onClose == "function", B = () => l() && t.mobileBackdrop !== !1 && typeof t.onClose == "function", M = () => t.resizable && u() && !m() && typeof t.onResize == "function";
9
9
  return [(() => {
10
- var i = D(), h = i.firstChild, v = h.firstChild, j = v.firstChild, b = v.nextSibling;
11
- return r(j, () => t.title), r(v, o(s, {
10
+ var i = D(), v = i.firstChild, f = v.firstChild, j = f.firstChild, h = f.nextSibling;
11
+ return o(j, () => t.title), o(f, r(a, {
12
12
  get when() {
13
- return t.headerActions || w();
13
+ return t.headerActions || g();
14
14
  },
15
15
  get children() {
16
- var e = q();
17
- return r(e, o(s, {
16
+ var e = N();
17
+ return o(e, r(a, {
18
18
  get when() {
19
19
  return t.headerActions;
20
20
  },
21
21
  get children() {
22
- var n = H();
23
- return r(n, () => t.headerActions), n;
22
+ var n = q();
23
+ return o(n, () => t.headerActions), n;
24
24
  }
25
- }), null), r(e, o(s, {
25
+ }), null), o(e, r(a, {
26
26
  get when() {
27
- return w();
27
+ return g();
28
28
  },
29
29
  get children() {
30
- var n = N();
30
+ var n = H();
31
31
  return n.$$click = () => t.onClose?.(), n;
32
32
  }
33
33
  }), null), e;
34
34
  }
35
- }), null), E((e) => t.bodyRef?.(e), b), r(b, () => t.children), r(i, o(s, {
35
+ }), null), E((e) => t.bodyRef?.(e), h), o(h, () => t.children), o(i, r(a, {
36
36
  get when() {
37
37
  return M();
38
38
  },
39
39
  get children() {
40
- return o(P, {
40
+ return r(P, {
41
41
  direction: "horizontal",
42
42
  onResize: (e) => t.onResize?.(e),
43
43
  get onResizeStart() {
@@ -49,8 +49,8 @@ function T(t) {
49
49
  });
50
50
  }
51
51
  }), null), S((e) => {
52
- var n = c("flex-shrink-0 border-r border-border bg-sidebar relative", "transition-[width,transform,box-shadow] duration-200 ease-out", "overflow-hidden", l() && "absolute inset-y-0 left-0 z-10 shadow-lg", t.class), x = u() ? `${g()}px` : "0px", y = l() ? "dialog" : void 0, k = l() ? "true" : void 0, C = t.ariaLabel, z = c("h-full flex flex-col", t.innerClass), $ = `${g()}px`, R = c("flex-1 min-h-0 overflow-auto", t.bodyClass);
53
- return n !== e.e && d(i, e.e = n), x !== e.t && _(i, "width", e.t = x), y !== e.a && f(i, "role", e.a = y), k !== e.o && f(i, "aria-modal", e.o = k), C !== e.i && f(i, "aria-label", e.i = C), z !== e.n && d(h, e.n = z), $ !== e.s && _(h, "width", e.s = $), R !== e.h && d(b, e.h = R), e;
52
+ var n = c("flex-shrink-0 border-r border-[var(--floe-line)] bg-sidebar relative", "transition-[width,transform,box-shadow] duration-[var(--floe-duration-base)] ease-out", "overflow-hidden", l() && "absolute inset-y-0 left-0 z-10 shadow-[var(--floe-elevation-float)]", t.class), x = u() ? `${w()}px` : "0px", y = l() ? "dialog" : void 0, k = l() ? "true" : void 0, C = t.ariaLabel, z = c("h-full flex flex-col", t.innerClass), $ = `${w()}px`, R = c("flex-1 min-h-0 overflow-auto", t.bodyClass);
53
+ return n !== e.e && d(i, e.e = n), x !== e.t && _(i, "width", e.t = x), y !== e.a && b(i, "role", e.a = y), k !== e.o && b(i, "aria-modal", e.o = k), C !== e.i && b(i, "aria-label", e.i = C), z !== e.n && d(v, e.n = z), $ !== e.s && _(v, "width", e.s = $), R !== e.h && d(h, e.h = R), e;
54
54
  }, {
55
55
  e: void 0,
56
56
  t: void 0,
@@ -61,7 +61,7 @@ function T(t) {
61
61
  s: void 0,
62
62
  h: void 0
63
63
  }), i;
64
- })(), o(s, {
64
+ })(), r(a, {
65
65
  get when() {
66
66
  return B();
67
67
  },
@@ -0,0 +1,19 @@
1
+ export interface ThemeToggleProps {
2
+ /** Box class for the button; defaults to the 32px icon control. */
3
+ class?: string;
4
+ /** Box class for the 16px icon frame. */
5
+ glyphClass?: string;
6
+ /** Overrides the accessible name. Defaults to the action the click performs. */
7
+ label?: string;
8
+ disabled?: boolean;
9
+ }
10
+ /**
11
+ * Light/dark toggle.
12
+ *
13
+ * The two states are one control, so the icon performs the change rather than
14
+ * being swapped between frames: the outgoing glyph rotates a quarter turn and
15
+ * leaves upward while the incoming one arrives from below. Both live in the
16
+ * same 16px frame, so the button never changes size and nothing else on the
17
+ * bar moves. Reduced-motion users get the instant swap.
18
+ */
19
+ export declare function ThemeToggle(props: ThemeToggleProps): import("solid-js").JSX.Element;
@@ -0,0 +1,39 @@
1
+ import { insert as k, createComponent as w, effect as T, setAttribute as x, className as a, template as p, delegateEvents as C } from "solid-js/web";
2
+ import { cn as r } from "../../utils/cn.js";
3
+ import { useTheme as S } from "../../context/ThemeContext.js";
4
+ import { Sun as j, Moon as A } from "../icons/index.js";
5
+ var D = /* @__PURE__ */ p("<button type=button data-floe-interactive=icon><span aria-hidden=true><span></span><span>");
6
+ function q(o) {
7
+ const s = S(), n = () => s.resolvedTheme() === "dark", c = () => o.label ?? (n() ? "Switch to light theme" : "Switch to dark theme"), f = (t, i) => r(
8
+ "absolute inset-0 flex items-center justify-center",
9
+ /* Tailwind's rotate/translate utilities write the individual properties,
10
+ * so the transition list has to name them; `transform` alone would leave
11
+ * the glyphs swapping instead of gliding. */
12
+ "transition-[opacity,rotate,translate] duration-[var(--floe-duration-base)] ease-[var(--floe-ease-out)]",
13
+ "motion-reduce:transition-none",
14
+ t ? "opacity-100 rotate-0 translate-y-0" : r("opacity-0", i === "up" ? "-translate-y-2 rotate-90" : "translate-y-2 -rotate-90")
15
+ );
16
+ return (() => {
17
+ var t = D(), i = t.firstChild, l = i.firstChild, v = l.nextSibling;
18
+ return t.$$click = () => s.toggleTheme(), k(l, w(j, {
19
+ class: "h-full w-full"
20
+ })), k(v, w(A, {
21
+ class: "h-full w-full"
22
+ })), T((e) => {
23
+ var d = o.disabled, u = c(), h = c(), m = r("inline-flex h-[var(--floe-control-height-md)] w-[var(--floe-control-height-md)] shrink-0 items-center justify-center rounded-control cursor-pointer", "text-[var(--floe-ink-soft)] hover:bg-[var(--floe-state-hover)] hover:text-foreground", "transition-colors duration-[var(--floe-duration-fast)] ease-[var(--floe-ease-out)]", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-[var(--floe-plane)]", "disabled:pointer-events-none disabled:opacity-50", o.class), b = r("relative block h-4 w-4 overflow-hidden", o.glyphClass), g = f(!n(), "up"), y = f(n(), "down");
24
+ return d !== e.e && (t.disabled = e.e = d), u !== e.t && x(t, "aria-label", e.t = u), h !== e.a && x(t, "title", e.a = h), m !== e.o && a(t, e.o = m), b !== e.i && a(i, e.i = b), g !== e.n && a(l, e.n = g), y !== e.s && a(v, e.s = y), e;
25
+ }, {
26
+ e: void 0,
27
+ t: void 0,
28
+ a: void 0,
29
+ o: void 0,
30
+ i: void 0,
31
+ n: void 0,
32
+ s: void 0
33
+ }), t;
34
+ })();
35
+ }
36
+ C(["click"]);
37
+ export {
38
+ q as ThemeToggle
39
+ };
@@ -1,15 +1,15 @@
1
- import { insert as t, createComponent as s, effect as y, className as h, setAttribute as $, template as l, delegateEvents as _ } from "solid-js/web";
2
- import { Show as v } from "solid-js";
3
- import { cn as x } from "../../utils/cn.js";
4
- import { useCommand as w } from "../../context/CommandContext.js";
1
+ import { insert as t, createComponent as d, effect as y, className as v, setAttribute as $, template as i, delegateEvents as w } from "solid-js/web";
2
+ import { Show as h } from "solid-js";
3
+ import { cn as p } from "../../utils/cn.js";
4
+ import { useCommand as _ } from "../../context/CommandContext.js";
5
5
  import { Search as C } from "../icons/index.js";
6
6
  import { useResolvedFloeConfig as S } from "../../context/FloeConfigContext.js";
7
- var B = /* @__PURE__ */ l('<span class="font-medium text-[11px] tracking-tight hidden sm:inline">'), E = /* @__PURE__ */ l('<kbd class="hidden md:inline text-[10px] px-1 py-0.5 rounded bg-background/60 border border-border/40 font-mono shrink-0 leading-none">'), F = /* @__PURE__ */ l('<header data-floe-shell-slot=top-bar style=background-color:var(--activity-bar);border-bottom-color:var(--top-bar-border)><div class="h-10 flex items-center gap-2 px-3"><div class="flex items-center gap-2 flex-shrink-0"></div><button type=button><span class="flex-1 text-left hidden sm:inline truncate"></span></button><div class="flex items-center gap-0.5">'), j = /* @__PURE__ */ l('<div class="w-6 h-6 rounded bg-primary flex items-center justify-center text-primary-foreground text-xs font-bold">F');
7
+ var B = /* @__PURE__ */ i('<span class="font-medium text-caption tracking-tight hidden sm:inline">'), E = /* @__PURE__ */ i('<kbd class="hidden md:inline text-caption px-1 py-0.5 rounded-xs bg-background/60 border border-[var(--floe-line)] font-mono shrink-0 leading-none">'), F = /* @__PURE__ */ i('<header data-floe-shell-slot=top-bar style=background-color:var(--activity-bar);border-bottom-color:var(--top-bar-border)><div class="h-10 flex items-center gap-2 px-3"><div class="flex items-center gap-2 flex-shrink-0"></div><button type=button><span class="flex-1 text-left hidden sm:inline truncate"></span></button><div class="flex items-center gap-0.5">'), j = /* @__PURE__ */ i('<div class="w-6 h-6 rounded-xs bg-primary flex items-center justify-center text-primary-foreground text-xs font-bold">F');
8
8
  function R(o) {
9
- const c = w(), a = S(), n = () => a.config.commands.palette.enabled;
9
+ const c = _(), a = S(), n = () => a.config.commands.palette.enabled;
10
10
  return (() => {
11
- var i = F(), p = i.firstChild, d = p.firstChild, r = d.nextSibling, m = r.firstChild, k = r.nextSibling;
12
- return t(d, () => o.logo || j(), null), t(d, s(v, {
11
+ var l = F(), x = l.firstChild, s = x.firstChild, r = s.nextSibling, f = r.firstChild, k = r.nextSibling;
12
+ return t(s, () => o.logo || j(), null), t(s, d(h, {
13
13
  get when() {
14
14
  return o.title;
15
15
  },
@@ -17,9 +17,9 @@ function R(o) {
17
17
  var e = B();
18
18
  return t(e, () => o.title), e;
19
19
  }
20
- }), null), r.$$click = () => n() && c.open(), t(r, s(C, {
20
+ }), null), r.$$click = () => n() && c.open(), t(r, d(C, {
21
21
  class: "w-3 h-3 shrink-0"
22
- }), m), t(m, () => a.config.strings.topBar.searchPlaceholder), t(r, s(v, {
22
+ }), f), t(f, () => a.config.strings.topBar.searchPlaceholder), t(r, d(h, {
23
23
  get when() {
24
24
  return n();
25
25
  },
@@ -28,22 +28,22 @@ function R(o) {
28
28
  return t(e, () => c.getKeybindDisplay(a.config.commands.palette.keybind)), e;
29
29
  }
30
30
  }), null), t(k, () => o.actions), y((e) => {
31
- var b = x(
31
+ var m = p(
32
32
  // Safe-area padding must not be applied on a fixed-height element (border-box),
33
33
  // otherwise the content gets squeezed on iOS notch devices.
34
- "shrink-0 bg-background border-b border-border safe-top safe-left safe-right",
34
+ "shrink-0 bg-background border-b border-[var(--floe-line)] safe-top safe-left safe-right",
35
35
  o.class
36
- ), f = o.ariaLabel, u = !n(), g = x("flex-1 max-w-sm flex items-center gap-2 h-[26px] px-2.5", n() ? "cursor-pointer" : "cursor-not-allowed", "text-[11px] text-muted-foreground tracking-tight", "bg-muted/30 hover:bg-muted/60 rounded-md", "border border-border/40 hover:border-border/70", "transition-colors duration-100", "focus:outline-none focus-visible:ring-1 focus-visible:ring-ring", !n() && "opacity-50 hover:bg-muted/30");
37
- return b !== e.e && h(i, e.e = b), f !== e.t && $(i, "aria-label", e.t = f), u !== e.a && (r.disabled = e.a = u), g !== e.o && h(r, e.o = g), e;
36
+ ), b = o.ariaLabel, g = !n(), u = p("flex-1 max-w-sm flex items-center gap-2 h-[26px] px-2.5", n() ? "cursor-pointer" : "cursor-not-allowed", "text-caption text-[var(--floe-ink-soft)] tracking-tight", "bg-[var(--floe-well)] hover:bg-[var(--floe-well-strong)] rounded-control", "border border-[var(--floe-line)]", "transition-[background-color,border-color,color] duration-[var(--floe-duration-fast)] ease-[var(--floe-ease-in-out)]", "focus:outline-none focus-visible:ring-1 focus-visible:ring-ring", !n() && "opacity-50 hover:bg-transparent");
37
+ return m !== e.e && v(l, e.e = m), b !== e.t && $(l, "aria-label", e.t = b), g !== e.a && (r.disabled = e.a = g), u !== e.o && v(r, e.o = u), e;
38
38
  }, {
39
39
  e: void 0,
40
40
  t: void 0,
41
41
  a: void 0,
42
42
  o: void 0
43
- }), i;
43
+ }), l;
44
44
  })();
45
45
  }
46
- _(["click"]);
46
+ w(["click"]);
47
47
  export {
48
48
  R as TopBar
49
49
  };
@@ -1,14 +1,14 @@
1
- import { createComponent as o, spread as i, mergeProps as s, insert as a, template as c } from "solid-js/web";
2
- import { splitProps as u, Show as p } from "solid-js";
3
- import { cn as d } from "../../utils/cn.js";
4
- import { Tooltip as b } from "../ui/Tooltip.js";
5
- var m = /* @__PURE__ */ c("<button type=button>");
6
- function y(n) {
7
- const [e, l] = u(n, ["label", "children", "tooltip", "tooltipPlacement", "tooltipDelay", "class", "disabled"]), r = () => (() => {
8
- var t = m();
9
- return i(t, s({
1
+ import { createComponent as r, spread as i, mergeProps as a, insert as s, template as c } from "solid-js/web";
2
+ import { splitProps as u, Show as d } from "solid-js";
3
+ import { cn as p } from "../../utils/cn.js";
4
+ import { Tooltip as f } from "../ui/Tooltip.js";
5
+ var b = /* @__PURE__ */ c("<button type=button>");
6
+ function y(l) {
7
+ const [e, n] = u(l, ["label", "children", "tooltip", "tooltipPlacement", "tooltipDelay", "class", "disabled"]), o = () => (() => {
8
+ var t = b();
9
+ return i(t, a({
10
10
  get class() {
11
- return d("inline-flex items-center justify-center", "w-8 h-8 rounded cursor-pointer", "hover:bg-muted/60 active:bg-muted/80 transition-colors", "focus:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-inset", "disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed", e.class);
11
+ return p("inline-flex items-center justify-center", "w-[var(--floe-control-height-md)] h-[var(--floe-control-height-md)]", "rounded-control cursor-pointer", "text-[var(--floe-ink-soft)] hover:bg-[var(--floe-state-hover)]", "active:bg-[var(--floe-state-press)]", "transition-[background-color,color] duration-[var(--floe-duration-fast)] ease-[var(--floe-ease-out)]", "focus:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-inset", "disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed", e.class);
12
12
  },
13
13
  get "aria-label"() {
14
14
  return e.label;
@@ -16,17 +16,17 @@ function y(n) {
16
16
  get disabled() {
17
17
  return e.disabled;
18
18
  }
19
- }, l), !1, !0), a(t, () => e.children), t;
19
+ }, n), !1, !0), s(t, () => e.children), t;
20
20
  })();
21
- return o(p, {
21
+ return r(d, {
22
22
  get when() {
23
23
  return e.tooltip !== !1;
24
24
  },
25
25
  get fallback() {
26
- return r();
26
+ return o();
27
27
  },
28
28
  get children() {
29
- return o(b, {
29
+ return r(f, {
30
30
  get content() {
31
31
  return e.tooltip ?? e.label;
32
32
  },
@@ -37,7 +37,7 @@ function y(n) {
37
37
  return e.tooltipDelay ?? 0;
38
38
  },
39
39
  get children() {
40
- return r();
40
+ return o();
41
41
  }
42
42
  });
43
43
  }
@@ -5,7 +5,6 @@ export type { BarItemContextMenuHandler, BarItemContextMenuRequest, BarItemConte
5
5
  export { Sidebar, SidebarContent, SidebarItemList, SidebarSection, SidebarItem, type SidebarProps, type SidebarContentProps, type SidebarItemListProps, type SidebarSectionProps, type SidebarItemProps, } from './Sidebar';
6
6
  export { TopBar, type TopBarProps } from './TopBar';
7
7
  export { TopBarIconButton, type TopBarIconButtonProps } from './TopBarIconButton';
8
- export { BottomBar, BottomBarItem, StatusIndicator, type BottomBarProps, type BottomBarItemProps, type StatusIndicatorProps, } from './BottomBar';
9
8
  export { BottomBarCompanion, type BottomBarCompanionDismissReason, type BottomBarCompanionPhase, type BottomBarCompanionProps, } from './BottomBarCompanion';
10
9
  export { MobileTabBar, type MobileTabBarItem, type MobileTabBarProps } from './MobileTabBar';
11
10
  export { ResizeHandle, type ResizeHandleProps } from './ResizeHandle';
@@ -14,4 +13,5 @@ export { Panel, PanelHeader, PanelContent, type PanelProps, type PanelHeaderProp
14
13
  export { KeepAliveStack, type KeepAliveStackProps, type KeepAliveView } from './KeepAliveStack';
15
14
  export { DisplayModeSwitcher, sanitizeDisplayMode, type DisplayMode, type DisplayModeSwitcherProps, } from './DisplayModeSwitcher';
16
15
  export { DisplayModePageShell, type DisplayModePageShellProps } from './DisplayModePageShell';
16
+ export { ThemeToggle, type ThemeToggleProps } from './ThemeToggle';
17
17
  export { AppViewport, type AppViewportProps } from './AppViewport';
@@ -1,12 +1,12 @@
1
- import { insert as n, createComponent as r, effect as o, className as d, Portal as m, template as c } from "solid-js/web";
1
+ import { insert as n, createComponent as r, effect as o, className as m, Portal as d, template as c } from "solid-js/web";
2
2
  import { Show as l } from "solid-js";
3
- import { cn as u } from "../../utils/cn.js";
4
- import { SnakeLoader as f } from "./SnakeLoader.js";
5
- var g = /* @__PURE__ */ c('<p class="text-sm text-muted-foreground processing-text-glow">'), b = /* @__PURE__ */ c('<div><div class=relative><div class="absolute -inset-8 rounded-full floe-loader-ambient"style="background:radial-gradient(circle, color-mix(in srgb, var(--primary) 12%, transparent) 0%, transparent 70%)">');
6
- function k(e) {
3
+ import { cn as f } from "../../utils/cn.js";
4
+ import { SnakeLoader as u } from "./SnakeLoader.js";
5
+ var g = /* @__PURE__ */ c('<p class="text-sm text-[var(--floe-ink-soft)] processing-text-glow">'), b = /* @__PURE__ */ c('<div><div class=relative><div class="absolute -inset-8 rounded-full floe-loader-ambient"style="background:radial-gradient(circle, color-mix(in srgb, var(--primary) 12%, transparent) 0%, transparent 70%)">');
6
+ function p(e) {
7
7
  const a = (() => {
8
8
  var t = b(), i = t.firstChild;
9
- return i.firstChild, n(i, r(f, {
9
+ return i.firstChild, n(i, r(u, {
10
10
  size: "lg"
11
11
  }), null), n(t, r(l, {
12
12
  get when() {
@@ -16,7 +16,7 @@ function k(e) {
16
16
  var s = g();
17
17
  return n(s, () => e.message), s;
18
18
  }
19
- }), null), o(() => d(t, u("flex flex-col items-center justify-center gap-4", "bg-background/80 backdrop-blur-sm", e.fullscreen ? "fixed inset-0 z-50" : "absolute inset-0", "animate-in fade-in", e.class))), t;
19
+ }), null), o(() => m(t, f("flex flex-col items-center justify-center gap-4", "bg-background/80 backdrop-blur-sm", e.fullscreen ? "fixed inset-0 z-50" : "absolute inset-0", "animate-in fade-in", e.class))), t;
20
20
  })();
21
21
  return r(l, {
22
22
  get when() {
@@ -29,7 +29,7 @@ function k(e) {
29
29
  },
30
30
  fallback: a,
31
31
  get children() {
32
- return r(m, {
32
+ return r(d, {
33
33
  children: a
34
34
  });
35
35
  }
@@ -38,5 +38,5 @@ function k(e) {
38
38
  });
39
39
  }
40
40
  export {
41
- k as LoadingOverlay
41
+ p as LoadingOverlay
42
42
  };
@@ -1,14 +1,14 @@
1
1
  import { effect as i, className as u, insert as s, createComponent as r, template as f } from "solid-js/web";
2
2
  import { For as h } from "solid-js";
3
3
  import { cn as o } from "../../utils/cn.js";
4
- var m = /* @__PURE__ */ f("<div>"), p = /* @__PURE__ */ f('<div><div class="flex items-center gap-3"><div class="space-y-2 flex-1">'), _ = /* @__PURE__ */ f('<div class="flex items-center gap-3"><div class="flex-1 space-y-1">');
4
+ var m = /* @__PURE__ */ f("<div>"), p = /* @__PURE__ */ f('<div><div class="flex items-center gap-3"><div class="space-y-2 flex-1">'), v = /* @__PURE__ */ f('<div class="flex items-center gap-3"><div class="flex-1 space-y-1">');
5
5
  function c(n) {
6
6
  return (() => {
7
7
  var l = m();
8
8
  return i(() => u(l, o("rounded-md floe-skeleton", n.class))), l;
9
9
  })();
10
10
  }
11
- function v(n) {
11
+ function _(n) {
12
12
  const l = () => n.lines ?? 3, a = () => Array.from({
13
13
  length: l()
14
14
  }, (e, t) => t);
@@ -26,7 +26,7 @@ function v(n) {
26
26
  })), i(() => u(e, o("space-y-2", n.class))), e;
27
27
  })();
28
28
  }
29
- function y(n) {
29
+ function x(n) {
30
30
  return (() => {
31
31
  var l = p(), a = l.firstChild, e = a.firstChild;
32
32
  return s(a, r(c, {
@@ -35,12 +35,12 @@ function y(n) {
35
35
  class: "h-4 w-1/3"
36
36
  }), null), s(e, r(c, {
37
37
  class: "h-3 w-1/4"
38
- }), null), s(l, r(v, {
38
+ }), null), s(l, r(_, {
39
39
  lines: 2
40
- }), null), i(() => u(l, o("rounded-lg border border-border p-4 space-y-4", n.class))), l;
40
+ }), null), i(() => u(l, o("rounded-control border border-[var(--floe-line)] p-4 space-y-4", n.class))), l;
41
41
  })();
42
42
  }
43
- function x(n) {
43
+ function y(n) {
44
44
  const l = () => n.count ?? 5, a = () => Array.from({
45
45
  length: l()
46
46
  }, (e, t) => t);
@@ -51,9 +51,9 @@ function x(n) {
51
51
  return a();
52
52
  },
53
53
  children: () => (() => {
54
- var t = _(), d = t.firstChild;
54
+ var t = v(), d = t.firstChild;
55
55
  return s(t, r(c, {
56
- class: "h-8 w-8 rounded"
56
+ class: "h-8 w-8 rounded-xs"
57
57
  }), d), s(d, r(c, {
58
58
  class: "h-4 w-2/3"
59
59
  }), null), s(d, r(c, {
@@ -65,7 +65,7 @@ function x(n) {
65
65
  }
66
66
  export {
67
67
  c as Skeleton,
68
- y as SkeletonCard,
69
- x as SkeletonList,
70
- v as SkeletonText
68
+ x as SkeletonCard,
69
+ y as SkeletonList,
70
+ _ as SkeletonText
71
71
  };