@columenlabs/lumen-ui 0.1.0 → 0.1.2

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 (66) hide show
  1. package/README.md +1 -1
  2. package/dist/assistant-panel.js +1 -1
  3. package/dist/coverage-calendar-map.js +1 -1
  4. package/dist/coverage-cells.d.ts +2 -2
  5. package/dist/coverage-map.js +4 -10
  6. package/dist/details-table.js +1 -5
  7. package/dist/form-issues.js +1 -1
  8. package/dist/frame-script.js +1 -1
  9. package/dist/growth-chart.d.ts +9 -9
  10. package/dist/joins.d.ts +4 -3
  11. package/dist/joins.js +1 -1
  12. package/dist/lumen-code.js +1 -5
  13. package/dist/lumen-drawer.js +1 -3
  14. package/dist/lumen-filter.js +5 -13
  15. package/dist/lumen-geo-map.js +15 -1
  16. package/dist/lumen-grid.js +2 -4
  17. package/dist/lumen-layout.js +1 -1
  18. package/dist/lumen-links.d.ts +1 -1
  19. package/dist/lumen-selector.js +1 -1
  20. package/dist/lumen-source.js +2 -4
  21. package/dist/lumen-tab-drawer.js +1 -1
  22. package/dist/lumen-toast.d.ts +4 -4
  23. package/dist/lumen-view-card.js +1 -1
  24. package/dist/lumen-view.js +2 -4
  25. package/dist/lumen-widget.d.ts +170 -170
  26. package/dist/lumen-widget.js +4 -8
  27. package/dist/market/indicator-picker.js +1 -1
  28. package/dist/market/live.d.ts +1 -1
  29. package/dist/market/lumen-chart.js +1 -1
  30. package/dist/market/price-chart.d.ts +10 -10
  31. package/dist/nav.js +1 -1
  32. package/dist/notifications.js +1 -3
  33. package/dist/overview.js +1 -1
  34. package/dist/page.js +1 -1
  35. package/dist/pager.js +1 -1
  36. package/dist/prefs.d.ts +25 -25
  37. package/dist/schedules.js +1 -1
  38. package/dist/settings.js +1 -3
  39. package/dist/shell.js +1 -1
  40. package/dist/summary-cards.js +2 -6
  41. package/dist/symbol-sheet.js +1 -1
  42. package/dist/tasks.d.ts +1 -1
  43. package/dist/tasks.js +1 -1
  44. package/dist/tile.js +2 -4
  45. package/dist/ui/badge.d.ts +1 -1
  46. package/dist/ui/button.d.ts +2 -2
  47. package/dist/ui/chart.d.ts +2 -2
  48. package/dist/ui/chart.js +2 -5
  49. package/dist/ui/field.d.ts +1 -1
  50. package/dist/ui/input-group.d.ts +2 -2
  51. package/dist/ui/item.d.ts +3 -3
  52. package/dist/ui/sidebar.d.ts +1 -1
  53. package/dist/ui/sidebar.js +1 -1
  54. package/dist/ui/toggle.d.ts +1 -1
  55. package/dist/view-edit-cell.js +1 -4
  56. package/dist/view-editor.js +1 -1
  57. package/dist/view-formulas.d.ts +1 -1
  58. package/dist/view-model.d.ts +15 -15
  59. package/dist/whats-new.js +1 -1
  60. package/dist/widget-settings.d.ts +139 -139
  61. package/dist/widget-settings.js +4 -4
  62. package/dist/widget-thumbs.d.ts +1 -1
  63. package/dist/widget-thumbs.js +1 -1
  64. package/dist/workspace-keys.d.ts +1 -1
  65. package/dist/workspaces.js +1 -1
  66. package/package.json +5 -5
@@ -1,5 +1,5 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { OUTLOOK_INDEXES, marketWindows } from '@columenlabs/lumen-ui-types/market';
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { OUTLOOK_INDEXES, marketWindows, } from '@columenlabs/lumen-ui-types/market';
3
3
  // LumenSavedWidget (as blocks; renamed): a page (LumenLayout) is an ordered list of cards, each a third, half, two thirds or the full width.
4
4
  // A card is the view (LumenView) or a widget. Chart and top-N widgets read every row of the view
5
5
  // (the table's filter is the table's), narrowed by their own tokens, and work their chart out here in the browser:
@@ -367,9 +367,7 @@ export function LumenWidget({ id, kind, icon, title, note, controls, tools, filt
367
367
  "relative after:pointer-events-none after:absolute after:inset-0 after:z-30 after:rounded-[inherit] after:border-2 after:border-primary/40 after:border-dashed after:content-['']", flat && 'border-0 bg-transparent shadow-none', className), children: [!headless && (_jsxs("div", { ref: head, className: cn('flex shrink-0 items-center gap-2 px-3', compact ? 'h-8' : 'h-10 border-b', (folded || below) && 'border-b-0', pinned && 'sticky left-0 w-(--view-w) max-w-full'), children: [layout && (_jsx(Button, { variant: "ghost", size: "icon-xs", className: "lumen-drag -ml-1 cursor-grab touch-none text-muted-foreground active:cursor-grabbing", "aria-label": `Drag ${title}`, children: _jsx(GripVerticalIcon, {}) })), link && !bare && (_jsx(LinkPicker, { color: link.color, onPick: link.onPick, label: title, className: "-mr-1" })), !compact && _jsx(Icon, { className: "size-4 shrink-0 text-muted-foreground" }), _jsx("span", { className: cn('truncate', compact ? 'text-xs text-muted-foreground' : 'text-sm font-semibold'), children: title }), link?.color && link.follows && !folded && (_jsxs("span", { className: "min-w-0 shrink truncate text-xs", style: { color: linkVar(link.color) }, title: `Follows ${link.follows}`, children: ["\u00B7 ", link.follows] })), layout && headerOff && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs(Badge, { variant: "secondary", className: "shrink-0 gap-1 text-muted-foreground", children: [_jsx(EyeOffIcon, {}), " Header off"] }) }), _jsx(TooltipContent, { children: "Shown only in Edit layout. Change it in Edit widget \u25B8 Controls." })] })), !layout && !bare && (_jsx(FoldChevron, { folded: folded, label: title, onToggle: toggle, className: "-ml-1" })), folded && rows != null && (_jsxs("span", { className: "shrink-0 text-xs text-muted-foreground num", children: [rows.toLocaleString(), " ", rows === 1 ? 'row' : 'rows'] })), inline && (_jsx("div", { "data-card-filter": true, className: "flex min-w-40 max-w-xl flex-1 items-center gap-2", children: filter })), note && !layout && !folded && (_jsx("span", { className: "hidden truncate text-xs text-muted-foreground sm:inline", children: note })), _jsxs("span", { className: cn('ml-auto flex shrink-0 items-center gap-1', bare && 'hidden'), children: [!layout && load?.updated && _jsx(LumenFreshness, { load: load }), !layout && !folded && tools, showFilter && mobile && link?.color && !!link.linked && (_jsxs("span", { className: "num flex items-center gap-1 text-xs text-muted-foreground", title: `${link.linked} linked`, children: [_jsx(LinkDot, { color: link.color, className: "size-2" }), link.linked] })), showFilter && mobile && (_jsxs("span", { className: "relative", children: [_jsx(IconButton, { icon: FunnelIcon, label: filterOpen ? 'Hide filter' : 'Filter', "aria-expanded": filterOpen, className: cn(filterOpen && 'text-primary'), onClick: () => setFilterOpen(!filterOpen) }), filterCount > 0 && (_jsx(Badge, { className: "num pointer-events-none absolute -top-1 -right-1 h-4 min-w-4 px-1 text-[10px]", children: filterCount }))] })), !layout && !folded && help && _jsx(CardHelp, { title: title, children: help }), !layout && load && on('refresh') && (_jsx(LumenRefresh, { load: load, label: `Refresh ${title}` })), (controls?.editable || (!layout && (ask || load?.editScript))) && (_jsxs(DropdownMenu, { modal: false, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(IconButton, { icon: MoreHorizontalIcon, label: `${title} menu` }) }), _jsxs(DropdownMenuContent, { align: "end", className: "w-44", children: [ask && !layout && (_jsxs(DropdownMenuItem, { onSelect: ask, children: [_jsx(SparklesIcon, {}), " Ask ", assistantName] })), load?.editScript && !layout && (_jsxs(DropdownMenuItem, { onSelect: load.editScript, children: [_jsx(CodeIcon, {}), " Script"] })), (ask || load?.editScript) && !layout && controls?.editable && (_jsx(DropdownMenuSeparator, {})), controls?.editable && (_jsxs(_Fragment, { children: [!controls.fixed && (_jsxs(_Fragment, { children: [_jsxs(DropdownMenuItem, { onSelect: () => controls.onAction('edit'), children: [_jsx(PencilIcon, {}), " Edit widget"] }), _jsxs(DropdownMenuItem, { disabled: !own, onSelect: () => controls.onAction('duplicate'), children: [_jsx(CopyIcon, {}), " Duplicate"] })] })), _jsxs(DropdownMenuItem, { disabled: controls.first, onSelect: () => controls.onAction('up'), children: [_jsx(ArrowUpIcon, {}), " Move up"] }), _jsxs(DropdownMenuItem, { disabled: controls.last, onSelect: () => controls.onAction('down'), children: [_jsx(ArrowDownIcon, {}), " Move down"] }), controls.onFit && (_jsxs(DropdownMenuItem, { onSelect: controls.onFit, children: [_jsx(FoldVerticalIcon, {}), " Fit height"] })), !controls.fixed && (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { className: "text-muted-foreground focus:text-destructive", onSelect: () => setRemoving(true), children: [_jsx(Trash2Icon, {}), " Remove"] })] }))] }))] })] }))] })] })), below && !headless && (_jsx("div", { "data-card-filter": true, className: cn('flex items-center gap-2 border-b px-3 pb-2', pinned && 'sticky left-0 w-(--view-w) max-w-full'), children: filter })), strip && !layout && !folded && !headless ? (_jsx("div", { "data-card-strip": true, className: cn('flex min-w-0 items-center gap-2 border-b px-3 py-1.5 empty:hidden', pinned && 'sticky left-0 w-(--view-w) max-w-full'), children: strip })) : null, _jsx("div", { hidden: folded, className: cn('relative min-w-0',
368
368
  // On the grid a card fills its cell: with a height of its own its body scrolls; one as
369
369
  // tall as it draws keeps its body's height, so the grid can measure it.
370
- !cell ? 'flex-1' : cell.fixed && 'min-h-0 flex-1 overflow-auto', pad && !table && !flat && (compact ? 'px-3 pb-3' : 'p-3')), children: _jsx(LumenBoundary, { where: id, children: children }) }), !layout && !folded && load && on('footer') && (
371
- // The load line sits at the card's foot, whatever the body's height.
372
- _jsx("div", { className: cn('mt-auto shrink-0', pinned && 'sticky left-0 w-(--view-w) max-w-full'), children: _jsx(LumenLoadFooter, { load: load, rows: rows, note: loadNote }) })), controls && (_jsx(LumenConfirm, { open: removing, onOpenChange: setRemoving, title: `Remove ${title}?`, description: table ? 'Add widget brings a table back.' : 'Add widget brings it back.', action: "Remove", onConfirm: () => controls.onAction('remove') }))] }) }));
370
+ !cell ? 'flex-1' : cell.fixed && 'min-h-0 flex-1 overflow-auto', pad && !table && !flat && (compact ? 'px-3 pb-3' : 'p-3')), children: _jsx(LumenBoundary, { where: id, children: children }) }), !layout && !folded && load && on('footer') && (_jsx("div", { className: cn('mt-auto shrink-0', pinned && 'sticky left-0 w-(--view-w) max-w-full'), children: _jsx(LumenLoadFooter, { load: load, rows: rows, note: loadNote }) })), controls && (_jsx(LumenConfirm, { open: removing, onOpenChange: setRemoving, title: `Remove ${title}?`, description: table ? 'Add widget brings a table back.' : 'Add widget brings it back.', action: "Remove", onConfirm: () => controls.onAction('remove') }))] }) }));
373
371
  }
374
372
  /**
375
373
  * One widget in its card. Widgets over the view's rows (tiles,
@@ -403,9 +401,7 @@ export function LumenSavedWidget({ widget, title, domain, rows, fields, merge, o
403
401
  if (widget.kind === 'chart' && widget.style === 'market')
404
402
  return (_jsx(LumenWidget, { ...frame, children: _jsx(LumenLazy, { children: _jsx(MarketWidget, { symbols: widget.symbols, style: widget.layout }) }) }));
405
403
  const body = row || number ? (tiles) : (_jsx(WidgetBody, { card: widget, domain: domain, rows: rows, fields: fields, merge: merge, onDetails: onDetails }));
406
- return (_jsx(LumenWidget, { ...frame, pad: widgetStyleId(widget) !== 'table:top_n', load: load, loadNote: "from the view's rows", children: load ? (
407
- // A failed view says so once, in its table; its widgets just wait for its rows.
408
- _jsx(LumenStates, { load: { ...load, error: null }, empty: load.error ? _jsx(Empty, { children: "Shows once the view's rows load." }) : undefined, kind: "widget", skeleton: row || number ? body : _jsx(Skeleton, { className: "h-40 w-full" }), children: body })) : (body) }));
404
+ return (_jsx(LumenWidget, { ...frame, pad: widgetStyleId(widget) !== 'table:top_n', load: load, loadNote: "from the view's rows", children: load ? (_jsx(LumenStates, { load: { ...load, error: null }, empty: load.error ? _jsx(Empty, { children: "Shows once the view's rows load." }) : undefined, kind: "widget", skeleton: row || number ? body : _jsx(Skeleton, { className: "h-40 w-full" }), children: body })) : (body) }));
409
405
  }
410
406
  /** Growth of $1: the domain's lines for the shown rows, its bands and markers. */
411
407
  function GrowthCard({ widget, frame, domain, rows, load, }) {
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { parseChartFormula } from '@columenlabs/lumen-ui-types/chart-formula';
3
3
  import { PlusIcon, SaveIcon, Trash2Icon } from 'lucide-react';
4
4
  import { useState } from 'react';
@@ -108,10 +108,10 @@ export declare function useMarket(symbols: string[]): {
108
108
  };
109
109
  /** Daily breadth and macro series of `keys` (never live); `error` when they could not be read. */
110
110
  export declare function useMarketDaily(keys: string[]): {
111
- retry: () => void;
112
111
  series: Record<string, MarketSeries>;
113
112
  loading: boolean;
114
113
  error: string | null;
114
+ retry: () => void;
115
115
  };
116
116
  /** True where a market provider is mounted (an app, suite or not). */
117
117
  export declare const useHasMarket: () => boolean;
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { MARKET_SYMBOLS, isDailyMarketKey, marketWindows, } from '@columenlabs/lumen-ui-types/market';
3
3
  import { queryOptions, useQueries, useQuery, useQueryClient } from '@tanstack/react-query';
4
4
  import { XIcon } from 'lucide-react';
@@ -18,20 +18,20 @@ export interface ChartBar {
18
18
  }
19
19
  /** How the price is drawn: the basics every charting tool offers. */
20
20
  export declare const CHART_TYPES: readonly [{
21
- readonly id: "candles";
22
- readonly label: "Candles";
21
+ readonly id: 'candles';
22
+ readonly label: 'Candles';
23
23
  }, {
24
- readonly id: "ohlc";
25
- readonly label: "OHLC bars";
24
+ readonly id: 'ohlc';
25
+ readonly label: 'OHLC bars';
26
26
  }, {
27
- readonly id: "line";
28
- readonly label: "Line";
27
+ readonly id: 'line';
28
+ readonly label: 'Line';
29
29
  }, {
30
- readonly id: "area";
31
- readonly label: "Area";
30
+ readonly id: 'area';
31
+ readonly label: 'Area';
32
32
  }, {
33
- readonly id: "heikin";
34
- readonly label: "Heikin-Ashi";
33
+ readonly id: 'heikin';
34
+ readonly label: 'Heikin-Ashi';
35
35
  }];
36
36
  export type ChartType = (typeof CHART_TYPES)[number]['id'];
37
37
  /** Heikin-Ashi candles: each bar averages itself with the one before, which smooths the trend. */
package/dist/nav.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // Sidebar building blocks an app composes its nav from (shadcn NavMain pattern): a group of links
3
3
  // that may nest one level (chevron on the right, hidden in icon mode), and a section whose items a
4
4
  // person adds with `+` and removes with the trash icon. Every item carries an icon; section headers are bold caps without one.
@@ -128,9 +128,7 @@ function Webhooks({ hooks, api }) {
128
128
  e.preventDefault();
129
129
  if (name.trim() && url.trim())
130
130
  add.mutate();
131
- }, children: [_jsx(Field, { id: "wh-name", label: "Name", children: _jsx(Input, { id: "wh-name", placeholder: "Discord", value: name, onChange: (e) => setName(e.target.value) }) }), _jsx(Field, { id: "wh-url", label: "Address (https)", children: _jsx(Input, { id: "wh-url", className: "num", autoComplete: "off", placeholder: "https://", value: url, onChange: (e) => setUrl(e.target.value) }) }), headers.length ? (_jsx(Field, { id: "wh-header-0", label: "Headers (sent with each post; hidden once saved)", children: _jsx("div", { className: "grid grid-cols-1 gap-2", children: headers.map((h, i) => (
132
- // biome-ignore lint/suspicious/noArrayIndexKey: rows have no id until saved
133
- _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { id: `wh-header-${i}`, className: "num w-2/5", autoComplete: "off", placeholder: "Authorization", "aria-label": "Header name", value: h.name, onChange: (e) => setHeader(i, 'name', e.target.value) }), _jsx(Input, { className: "num min-w-0 flex-1", type: "password", autoComplete: "off", placeholder: "Value", "aria-label": "Header value", value: h.value, onChange: (e) => setHeader(i, 'value', e.target.value) }), _jsx(IconButton, { type: "button", icon: XIcon, label: "Remove header", onClick: () => setHeaders((hs) => hs.filter((_, j) => j !== i)) })] }, i))) }) })) : null, _jsx(ErrorLine, { error: add.error }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [headers.length < 5 ? (_jsx(IconButton, { type: "button", icon: PlusIcon, label: "Add header", variant: "outline", onClick: () => setHeaders((hs) => [...hs, { name: '', value: '' }]) })) : null, _jsx("span", { className: "flex-1" }), _jsxs(Button, { type: "submit", size: "sm", disabled: !name.trim() || !url.trim() || add.isPending, children: [add.isPending ? _jsx(RefreshCwIcon, { className: "animate-spin" }) : _jsx(PlusIcon, {}), "Add"] })] })] }) }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Each post is ", _jsx("span", { className: "num", children: '{ event, title, message, click, at }' }), ". Messages name no account, holding or amount. For a Cloudflare Access service token, add the headers CF-Access-Client-Id and CF-Access-Client-Secret."] })] }));
131
+ }, children: [_jsx(Field, { id: "wh-name", label: "Name", children: _jsx(Input, { id: "wh-name", placeholder: "Discord", value: name, onChange: (e) => setName(e.target.value) }) }), _jsx(Field, { id: "wh-url", label: "Address (https)", children: _jsx(Input, { id: "wh-url", className: "num", autoComplete: "off", placeholder: "https://", value: url, onChange: (e) => setUrl(e.target.value) }) }), headers.length ? (_jsx(Field, { id: "wh-header-0", label: "Headers (sent with each post; hidden once saved)", children: _jsx("div", { className: "grid grid-cols-1 gap-2", children: headers.map((h, i) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { id: `wh-header-${i}`, className: "num w-2/5", autoComplete: "off", placeholder: "Authorization", "aria-label": "Header name", value: h.name, onChange: (e) => setHeader(i, 'name', e.target.value) }), _jsx(Input, { className: "num min-w-0 flex-1", type: "password", autoComplete: "off", placeholder: "Value", "aria-label": "Header value", value: h.value, onChange: (e) => setHeader(i, 'value', e.target.value) }), _jsx(IconButton, { type: "button", icon: XIcon, label: "Remove header", onClick: () => setHeaders((hs) => hs.filter((_, j) => j !== i)) })] }, i))) }) })) : null, _jsx(ErrorLine, { error: add.error }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [headers.length < 5 ? (_jsx(IconButton, { type: "button", icon: PlusIcon, label: "Add header", variant: "outline", onClick: () => setHeaders((hs) => [...hs, { name: '', value: '' }]) })) : null, _jsx("span", { className: "flex-1" }), _jsxs(Button, { type: "submit", size: "sm", disabled: !name.trim() || !url.trim() || add.isPending, children: [add.isPending ? _jsx(RefreshCwIcon, { className: "animate-spin" }) : _jsx(PlusIcon, {}), "Add"] })] })] }) }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Each post is ", _jsx("span", { className: "num", children: '{ event, title, message, click, at }' }), ". Messages name no account, holding or amount. For a Cloudflare Access service token, add the headers CF-Access-Client-Id and CF-Access-Client-Secret."] })] }));
134
132
  }
135
133
  // ── Events: one row per event, one column per target ──
136
134
  function EventCell({ event, target, name, api, }) {
package/dist/overview.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // An app's Overview: a service-health page, not a decisions page. A stage map
3
3
  // (each stage a chip with its status dot, name and a one-line verdict; arrows between; tap one to
4
4
  // focus it) and then each stage's widgets, one LumenLayout card each with its own ↻ and states
package/dist/page.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // The page frame: a fixed-height header (sidebar toggle, breadcrumb, actions)
3
3
  // and the body, with the shell's gutter, section gap and max width. Pages never set their own outer
4
4
  // padding or header. On phone the actions stay in the bar as icons and a back chevron replaces the trail.
package/dist/pager.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // The compact pager, the same look as LumenView's: the count opens the page sizes,
3
3
  // and the chevrons turn the page while there is more than one. Coverage views page their rows with it.
4
4
  import { viewPageSizes } from '@columenlabs/lumen-ui-types/views';
package/dist/prefs.d.ts CHANGED
@@ -1,46 +1,46 @@
1
- export declare const THEMES: readonly ["light", "dark", "system"];
1
+ export declare const THEMES: readonly ['light', 'dark', 'system'];
2
2
  export type Theme = (typeof THEMES)[number];
3
3
  export declare const TIME_ZONES: readonly [{
4
- readonly id: "America/New_York";
5
- readonly label: "Eastern";
4
+ readonly id: 'America/New_York';
5
+ readonly label: 'Eastern';
6
6
  }, {
7
- readonly id: "America/Chicago";
8
- readonly label: "Central";
7
+ readonly id: 'America/Chicago';
8
+ readonly label: 'Central';
9
9
  }, {
10
- readonly id: "America/Los_Angeles";
11
- readonly label: "Pacific";
10
+ readonly id: 'America/Los_Angeles';
11
+ readonly label: 'Pacific';
12
12
  }, {
13
- readonly id: "UTC";
14
- readonly label: "UTC";
13
+ readonly id: 'UTC';
14
+ readonly label: 'UTC';
15
15
  }];
16
16
  export type TimeZoneId = (typeof TIME_ZONES)[number]['id'];
17
17
  /** The text font; Manrope is the suite's own, the rest are for reading comfort. */
18
18
  export declare const FONTS: readonly [{
19
- readonly id: "manrope";
20
- readonly label: "Manrope";
19
+ readonly id: 'manrope';
20
+ readonly label: 'Manrope';
21
21
  }, {
22
- readonly id: "inter";
23
- readonly label: "Inter";
22
+ readonly id: 'inter';
23
+ readonly label: 'Inter';
24
24
  }, {
25
- readonly id: "plex";
26
- readonly label: "IBM Plex Sans";
25
+ readonly id: 'plex';
26
+ readonly label: 'IBM Plex Sans';
27
27
  }, {
28
- readonly id: "system";
29
- readonly label: "System";
28
+ readonly id: 'system';
29
+ readonly label: 'System';
30
30
  }];
31
31
  export type FontId = (typeof FONTS)[number]['id'];
32
32
  /** Text size: the root size every rem scales from, so spacing grows with the text. */
33
33
  export declare const FONT_SIZES: readonly [{
34
- readonly id: "small";
35
- readonly label: "Small";
34
+ readonly id: 'small';
35
+ readonly label: 'Small';
36
36
  readonly px: 15;
37
37
  }, {
38
- readonly id: "default";
39
- readonly label: "Default";
38
+ readonly id: 'default';
39
+ readonly label: 'Default';
40
40
  readonly px: 16;
41
41
  }, {
42
- readonly id: "large";
43
- readonly label: "Large";
42
+ readonly id: 'large';
43
+ readonly label: 'Large';
44
44
  readonly px: 17;
45
45
  }];
46
46
  export type FontSizeId = (typeof FONT_SIZES)[number]['id'];
@@ -63,9 +63,9 @@ export declare const ASSISTANT_WIDTH: {
63
63
  /** Eastern by default, as an app's zone picker had it (the market's own zone). */
64
64
  export declare const DEFAULT_PREFS: Prefs;
65
65
  /** The theme on screen: `system` follows the device. */
66
- export declare const resolvedTheme: (p?: Prefs) => "light" | "dark";
66
+ export declare const resolvedTheme: (p?: Prefs) => 'light' | 'dark';
67
67
  export declare function setPref<K extends keyof Prefs>(key: K, value: Prefs[K]): void;
68
68
  export declare const getPrefs: () => Prefs;
69
69
  export declare function usePrefs(): Prefs;
70
70
  /** `Pacific`, `UTC`: the short name shown next to times. */
71
- export declare const timeZoneLabel: (id: TimeZoneId) => "America/New_York" | "Eastern" | "America/Chicago" | "Central" | "America/Los_Angeles" | "Pacific" | "UTC";
71
+ export declare const timeZoneLabel: (id: TimeZoneId) => "America/Chicago" | "America/Los_Angeles" | "America/New_York" | "Central" | "Eastern" | "Pacific" | "UTC";
package/dist/schedules.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { AlertTriangleIcon, CheckIcon, ListIcon, MessageSquareIcon, PlayIcon, PlusIcon, RefreshCwIcon, Trash2Icon, } from 'lucide-react';
3
3
  import { Fragment, useState } from 'react';
4
4
  import { useAssistant, useAssistantName } from './assistant-context.js';
package/dist/settings.js CHANGED
@@ -147,9 +147,7 @@ export function LumenSettings({ open, section, onOpen, onClose, appLabel, profil
147
147
  ...(sections.length ? [{ label: appLabel, items: sections.filter(shown) }] : []),
148
148
  ].filter((g) => g.items.length);
149
149
  const search = (_jsxs(InputGroup, { className: "bg-background", children: [_jsx(InputGroupAddon, { children: _jsx(SearchIcon, {}) }), _jsx(InputGroupInput, { type: "search", className: "[&::-webkit-search-cancel-button]:hidden", "aria-label": "Search settings", placeholder: "Search", value: query, onChange: (e) => setQuery(e.target.value) }), query && (_jsx(InputGroupAddon, { align: "inline-end", children: _jsx(InputGroupButton, { size: "icon-xs", "aria-label": "Clear search", onClick: () => setQuery(''), children: _jsx(XIcon, {}) }) }))] }));
150
- const header = (s, slot) => (
151
- // Actions sit at the bottom right, in line with the description.
152
- _jsxs("div", { className: "flex items-end gap-2", children: [_jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsxs("h3", { id: `settings-${s.id}-title`, className: "flex items-center gap-2 text-base font-semibold", children: [_jsx(s.icon, { className: "size-4 text-muted-foreground" }), s.title] }), s.description && (_jsx("p", { className: "truncate text-sm text-muted-foreground", title: typeof s.description === 'string' ? s.description : undefined, children: s.description }))] }), _jsx("div", { ref: slot, className: "flex shrink-0 items-center gap-2 empty:hidden" })] }));
150
+ const header = (s, slot) => (_jsxs("div", { className: "flex items-end gap-2", children: [_jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsxs("h3", { id: `settings-${s.id}-title`, className: "flex items-center gap-2 text-base font-semibold", children: [_jsx(s.icon, { className: "size-4 text-muted-foreground" }), s.title] }), s.description && (_jsx("p", { className: "truncate text-sm text-muted-foreground", title: typeof s.description === 'string' ? s.description : undefined, children: s.description }))] }), _jsx("div", { ref: slot, className: "flex shrink-0 items-center gap-2 empty:hidden" })] }));
153
151
  return (_jsx(Dialog, { open: open, onOpenChange: (o) => {
154
152
  if (o)
155
153
  onOpen(section);
package/dist/shell.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // The frame every app renders in, from the shadcn sidebar-07 block: the app's
3
3
  // brand (or an app switcher) top-left, its own nav, the profile bottom-left; collapses to icons on
4
4
  // desktop and becomes a drawer on phone. An app passes its id, nav and status items; pages render in
@@ -85,9 +85,7 @@ function OwnTile({ domain, tile: t, rows, fields, }) {
85
85
  if (!figs)
86
86
  return null;
87
87
  const v = figs.main.value;
88
- return (_jsx(Tile, { label: t.label, value: _jsx(FigureText, { f: figs.main }), valueClassName: cn(t.sign && typeof v === 'number' && (v > 0 ? 'text-gain' : v < 0 ? 'text-loss' : '')), lines: figs.lines.map((l, i) => (
89
- // biome-ignore lint/suspicious/noArrayIndexKey: a card's lines in their saved order
90
- _jsx(FigureText, { f: l }, i))) }));
88
+ return (_jsx(Tile, { label: t.label, value: _jsx(FigureText, { f: figs.main }), valueClassName: cn(t.sign && typeof v === 'number' && (v > 0 ? 'text-gain' : v < 0 ? 'text-loss' : '')), lines: figs.lines.map((l, i) => (_jsx(FigureText, { f: l }, i))) }));
91
89
  }
92
90
  /**
93
91
  * A LumenCard's number and lines: its frame shows the label, so the body is
@@ -109,9 +107,7 @@ export function LumenCard({ domain, tile: t, rows, fields, drawn, loading, style
109
107
  const of = target ? (_jsx(ViewValueCell, { value: target, format: figs.main.format, amount: figs.main.amount })) : null;
110
108
  if (style === 'progress_circle')
111
109
  return (_jsxs("div", { className: "flex min-w-0 items-center gap-3", children: [_jsx(ProgressRing, { value: share, tone: tone }), _jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: "num truncate text-xl leading-7 font-semibold", children: _jsx(FigureText, { f: figs.main }) }), _jsx("span", { className: "num truncate text-xs text-muted-foreground", children: of ? _jsxs(_Fragment, { children: ["of ", of] }) : 'Set a target in Edit widget' })] })] }));
112
- return (_jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: cn('num truncate text-2xl leading-8 font-semibold', t.sign && typeof v === 'number' && (v > 0 ? 'text-gain' : v < 0 ? 'text-loss' : '')), children: _jsx(FigureText, { f: figs.main }) }), style === 'progress_bar' && (_jsxs("div", { className: "flex flex-col gap-1 pt-1", children: [_jsx(Progress, { value: share ?? 0, className: cn('h-2', tone && TONE_BAR[tone]), "aria-label": "Progress to target" }), _jsx("span", { className: "num text-xs text-muted-foreground", children: of ? (_jsxs(_Fragment, { children: [share === null ? '—' : `${share.toFixed(0)}%`, " of ", of] })) : ('Set a target in Edit widget') })] })), figs.lines.map((l, i) => (
113
- // biome-ignore lint/suspicious/noArrayIndexKey: a card's lines in their saved order
114
- _jsx("span", { className: "num line-clamp-2 text-xs text-muted-foreground", children: _jsx(FigureText, { f: l }) }, i)))] }));
110
+ return (_jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: cn('num truncate text-2xl leading-8 font-semibold', t.sign && typeof v === 'number' && (v > 0 ? 'text-gain' : v < 0 ? 'text-loss' : '')), children: _jsx(FigureText, { f: figs.main }) }), style === 'progress_bar' && (_jsxs("div", { className: "flex flex-col gap-1 pt-1", children: [_jsx(Progress, { value: share ?? 0, className: cn('h-2', tone && TONE_BAR[tone]), "aria-label": "Progress to target" }), _jsx("span", { className: "num text-xs text-muted-foreground", children: of ? (_jsxs(_Fragment, { children: [share === null ? '—' : `${share.toFixed(0)}%`, " of ", of] })) : ('Set a target in Edit widget') })] })), figs.lines.map((l, i) => (_jsx("span", { className: "num line-clamp-2 text-xs text-muted-foreground", children: _jsx(FigureText, { f: l }) }, i)))] }));
115
111
  }
116
112
  /** A meter's tone on a bar's fill (theme tokens, no glow). */
117
113
  const TONE_BAR = {
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // The Symbol sheet (the assistant drafts step 1): a tap on any symbol in any view opens one sheet
3
3
  // about it, the same drawer as a row's details (bottom on phone, right on desktop). The shell draws
4
4
  // its header and LumenChart; the app adds its own sections
package/dist/tasks.d.ts CHANGED
@@ -23,7 +23,7 @@ export declare function useTasks(): TasksState | null;
23
23
  export declare function TasksProvider({ config, children }: {
24
24
  config?: TasksConfig;
25
25
  children: ReactNode;
26
- }): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react").JSX.Element | null | undefined;
26
+ }): string | number | bigint | boolean | import("react").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | Iterable<ReactNode> | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | import("react").ReactPortal | null | undefined> | null | undefined;
27
27
  /** The header button: a ring while anything runs, the count, a gold dot for ended unseen tasks. */
28
28
  export declare function TasksButton(): import("react").JSX.Element | null;
29
29
  export {};
package/dist/tasks.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { isActive } from '@columenlabs/lumen-ui-types/tasks';
3
3
  import { useQueryClient } from '@tanstack/react-query';
4
4
  import { useRouter } from '@tanstack/react-router';
package/dist/tile.js CHANGED
@@ -1,11 +1,9 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from './lib/utils.js';
3
3
  import { Card } from './ui/card.js';
4
4
  import { ToggleGroup, ToggleGroupItem } from './ui/toggle-group.js';
5
5
  function TileBody({ label, value, caption, lines, valueClassName, }) {
6
- return (_jsxs(_Fragment, { children: [_jsx("span", { className: "w-full truncate text-xs text-muted-foreground", children: label }), _jsx("span", { className: cn('num truncate text-xl leading-7 font-semibold', valueClassName), children: value }), caption ? (_jsx("span", { className: "num line-clamp-2 text-xs text-muted-foreground", children: caption })) : null, lines?.map((l, i) => (
7
- // biome-ignore lint/suspicious/noArrayIndexKey: a card's lines in their saved order
8
- _jsx("span", { className: "num line-clamp-2 text-xs text-muted-foreground", children: l }, i)))] }));
6
+ return (_jsxs(_Fragment, { children: [_jsx("span", { className: "w-full truncate text-xs text-muted-foreground", children: label }), _jsx("span", { className: cn('num truncate text-xl leading-7 font-semibold', valueClassName), children: value }), caption ? (_jsx("span", { className: "num line-clamp-2 text-xs text-muted-foreground", children: caption })) : null, lines?.map((l, i) => (_jsx("span", { className: "num line-clamp-2 text-xs text-muted-foreground", children: l }, i)))] }));
9
7
  }
10
8
  export function Tile({ label, value, caption, lines, className, valueClassName, }) {
11
9
  return (_jsx(Card, { size: "sm", className: cn('min-w-0 gap-0.5 px-3', className), children: _jsx(TileBody, { label: label, value: value, caption: caption, lines: lines, valueClassName: valueClassName }) }));
@@ -1,7 +1,7 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
2
  import type * as React from 'react';
3
3
  declare const badgeVariants: (props?: ({
4
- variant?: "link" | "success" | "default" | "outline" | "secondary" | "ghost" | "destructive" | "warning" | "info" | null | undefined;
4
+ variant?: "default" | "destructive" | "ghost" | "info" | "link" | "outline" | "secondary" | "success" | "warning" | null | undefined;
5
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
6
  declare function Badge({ className, variant, asChild, ...props }: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & {
7
7
  asChild?: boolean;
@@ -1,8 +1,8 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
2
  import type * as React from 'react';
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "link" | "default" | "outline" | "secondary" | "ghost" | "destructive" | "destructive-confirm" | null | undefined;
5
- size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
4
+ variant?: "default" | "destructive" | "destructive-confirm" | "ghost" | "link" | "outline" | "secondary" | null | undefined;
5
+ size?: "default" | "icon" | "icon-lg" | "icon-sm" | "icon-xs" | "lg" | "sm" | "xs" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
8
8
  asChild?: boolean;
@@ -2,8 +2,8 @@ import * as React from 'react';
2
2
  import * as RechartsPrimitive from 'recharts';
3
3
  import type { TooltipValueType } from 'recharts';
4
4
  declare const THEMES: {
5
- readonly light: "";
6
- readonly dark: ".dark";
5
+ readonly light: '';
6
+ readonly dark: '.dark';
7
7
  };
8
8
  type TooltipNameType = number | string;
9
9
  export type ChartConfig = Record<string, {
package/dist/ui/chart.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from '../lib/utils.js';
3
3
  import * as React from 'react';
4
4
  import * as RechartsPrimitive from 'recharts';
@@ -86,10 +86,7 @@ function ChartLegendContent({ className, hideIcon = false, payload, verticalAlig
86
86
  if (!payload?.length) {
87
87
  return null;
88
88
  }
89
- return (
90
- // One series a line, cut to fit: a list on phone that scrolls past five
91
- // lines, wrapping rows on wider screens; the full name shows on hover.
92
- _jsx("div", { className: cn('flex max-h-24 flex-col items-start gap-x-4 gap-y-0.5 overflow-y-auto sm:max-h-none sm:flex-row sm:flex-wrap sm:items-center sm:justify-center sm:overflow-visible', verticalAlign === 'top' ? 'pb-3' : 'pt-3', className), children: payload
89
+ return (_jsx("div", { className: cn('flex max-h-24 flex-col items-start gap-x-4 gap-y-0.5 overflow-y-auto sm:max-h-none sm:flex-row sm:flex-wrap sm:items-center sm:justify-center sm:overflow-visible', verticalAlign === 'top' ? 'pb-3' : 'pt-3', className), children: payload
93
90
  .filter((item) => item.type !== 'none')
94
91
  .map((item, index) => {
95
92
  const key = `${nameKey ?? item.dataKey ?? 'value'}`;
@@ -6,7 +6,7 @@ declare function FieldLegend({ className, variant, ...props }: React.ComponentPr
6
6
  }): import("react").JSX.Element;
7
7
  declare function FieldGroup({ className, ...props }: React.ComponentProps<'div'>): import("react").JSX.Element;
8
8
  declare const fieldVariants: (props?: ({
9
- orientation?: "horizontal" | "vertical" | "responsive" | null | undefined;
9
+ orientation?: "horizontal" | "responsive" | "vertical" | null | undefined;
10
10
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
11
11
  declare function Field({ className, orientation, ...props }: React.ComponentProps<'div'> & VariantProps<typeof fieldVariants>): import("react").JSX.Element;
12
12
  declare function FieldContent({ className, ...props }: React.ComponentProps<'div'>): import("react").JSX.Element;
@@ -3,11 +3,11 @@ import type * as React from 'react';
3
3
  import { Button } from './button.js';
4
4
  declare function InputGroup({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
5
5
  declare const inputGroupAddonVariants: (props?: ({
6
- align?: "inline-end" | "inline-start" | "block-end" | "block-start" | null | undefined;
6
+ align?: "block-end" | "block-start" | "inline-end" | "inline-start" | null | undefined;
7
7
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
8
  declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
9
9
  declare const inputGroupButtonVariants: (props?: ({
10
- size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
10
+ size?: "icon-sm" | "icon-xs" | "sm" | "xs" | null | undefined;
11
11
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
12
12
  declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, 'size'> & VariantProps<typeof inputGroupButtonVariants>): React.JSX.Element;
13
13
  declare function InputGroupText({ className, ...props }: React.ComponentProps<'span'>): React.JSX.Element;
package/dist/ui/item.d.ts CHANGED
@@ -4,14 +4,14 @@ import { Separator } from './separator.js';
4
4
  declare function ItemGroup({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
5
5
  declare function ItemSeparator({ className, ...props }: React.ComponentProps<typeof Separator>): React.JSX.Element;
6
6
  declare const itemVariants: (props?: ({
7
- variant?: "default" | "outline" | "muted" | null | undefined;
8
- size?: "default" | "xs" | "sm" | null | undefined;
7
+ variant?: "default" | "muted" | "outline" | null | undefined;
8
+ size?: "default" | "sm" | "xs" | null | undefined;
9
9
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
10
10
  declare function Item({ className, variant, size, asChild, ...props }: React.ComponentProps<'div'> & VariantProps<typeof itemVariants> & {
11
11
  asChild?: boolean;
12
12
  }): React.JSX.Element;
13
13
  declare const itemMediaVariants: (props?: ({
14
- variant?: "image" | "default" | "icon" | null | undefined;
14
+ variant?: "default" | "icon" | "image" | null | undefined;
15
15
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
16
16
  declare function ItemMedia({ className, variant, ...props }: React.ComponentProps<'div'> & VariantProps<typeof itemMediaVariants>): React.JSX.Element;
17
17
  declare function ItemContent({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
@@ -44,7 +44,7 @@ declare function SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>
44
44
  declare function SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>): React.JSX.Element;
45
45
  declare const sidebarMenuButtonVariants: (props?: ({
46
46
  variant?: "default" | "outline" | null | undefined;
47
- size?: "default" | "sm" | "lg" | null | undefined;
47
+ size?: "default" | "lg" | "sm" | null | undefined;
48
48
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
49
49
  declare function SidebarMenuButton({ asChild, isActive, variant, size, tooltip, className, ...props }: React.ComponentProps<'button'> & {
50
50
  asChild?: boolean;
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from '../lib/utils.js';
3
3
  import { cva } from 'class-variance-authority';
4
4
  import { Slot } from 'radix-ui';
@@ -3,7 +3,7 @@ import { Toggle as TogglePrimitive } from 'radix-ui';
3
3
  import type * as React from 'react';
4
4
  declare const toggleVariants: (props?: ({
5
5
  variant?: "default" | "outline" | null | undefined;
6
- size?: "default" | "sm" | "lg" | null | undefined;
6
+ size?: "default" | "lg" | "sm" | null | undefined;
7
7
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
8
  declare function Toggle({ className, variant, size, ...props }: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>): React.JSX.Element;
9
9
  export { Toggle, toggleVariants };
@@ -49,10 +49,7 @@ export function EditCell({ label, value, options, unused = [], chip, note, color
49
49
  ]
50
50
  : []),
51
51
  ];
52
- return (
53
- // Clicks and keys stay off the row, which opens its details (the list is a portal, but React
54
- // events still bubble through here).
55
- _jsxs("span", { className: edited ? 'inline-flex items-center gap-1' : 'contents', onClick: stop, onKeyDown: stop, children: [_jsx(LumenSelector, { trigger: value === null ? 'icon' : chip ? 'chip' : 'field', icon: value === null ? PlusIcon : undefined, size: "sm", label: value === null ? `Set ${label}` : `${label}: ${value}`, className: value === null
52
+ return (_jsxs("span", { className: edited ? 'inline-flex items-center gap-1' : 'contents', onClick: stop, onKeyDown: stop, children: [_jsx(LumenSelector, { trigger: value === null ? 'icon' : chip ? 'chip' : 'field', icon: value === null ? PlusIcon : undefined, size: "sm", label: value === null ? `Set ${label}` : `${label}: ${value}`, className: value === null
56
53
  ? '-ml-1 size-6 text-muted-foreground'
57
54
  : chip
58
55
  ? 'h-6 border-0 bg-secondary px-2 text-xs font-normal text-secondary-foreground dark:bg-secondary'
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { CATALOG, FRAME_LINK, catalogKeys, linkColumns, readableDomain, } from '@columenlabs/lumen-ui-types/catalog';
3
3
  import { CONNECTED_COUNT, VIEW_CARD_KIND_NAMES, WIDGET_STYLES, cardsOf, connectedKey, inferConnection, isOwnTile, isRowCard, isTableCard, mainTableOf, tableConfigOf, tableLayoutOf, viewAggs, viewCardSchema, viewPageSizes, viewPaginationSchema, widgetStyleId, } from '@columenlabs/lumen-ui-types/views';
4
4
  // The Edit view dialog (mock 2b): two panes. Left, a tree of every field the
@@ -14,7 +14,7 @@ export declare function FormatChip({ format, icon }: {
14
14
  icon?: LucideIcon;
15
15
  }): import("react").JSX.Element;
16
16
  /** The number formats as picker options, each with how it reads. */
17
- export declare const formatOptions: () => LumenOption<ViewFormula["format"]>[];
17
+ export declare const formatOptions: () => LumenOption<ViewFormula['format']>[];
18
18
  /**
19
19
  * A formula as it shows: a Text one has no sum or average of words, so its
20
20
  * group and Total rows are blank unless they count, or show the first or last value. Its format is
@@ -127,12 +127,12 @@ export declare const CHIP_TONE: Record<ViewChipTone, string>;
127
127
  /** A run's state as a chip, the same on every app: done green, failed
128
128
  * red, running blue, queued, waiting and canceled grey. */
129
129
  export declare const RUN_STATE_TONE: {
130
- readonly done: "gain";
131
- readonly failed: "loss";
132
- readonly running: "info";
133
- readonly queued: "muted";
134
- readonly waiting: "muted";
135
- readonly canceled: "muted";
130
+ readonly done: 'gain';
131
+ readonly failed: 'loss';
132
+ readonly running: 'info';
133
+ readonly queued: 'muted';
134
+ readonly waiting: 'muted';
135
+ readonly canceled: 'muted';
136
136
  };
137
137
  /** A group of fields by where they come from: their colour and, per topic, the source line. */
138
138
  export interface ViewFieldGroup {
@@ -303,8 +303,8 @@ export declare const formulasOf: (c: CustomViewConfig) => {
303
303
  key: string;
304
304
  label: string;
305
305
  expr: string;
306
- format: "number" | "text" | "weight" | "compact" | "rounded" | "price" | "price_rounded" | "price_signed" | "percent" | "signed" | "integer";
307
- agg: "none" | "max" | "min" | "first" | "last" | "sum" | "count" | "mean" | "distinct" | null;
306
+ format: "compact" | "integer" | "number" | "percent" | "price" | "price_rounded" | "price_signed" | "rounded" | "signed" | "text" | "weight";
307
+ agg: "count" | "distinct" | "first" | "last" | "max" | "mean" | "min" | "none" | "sum" | null;
308
308
  }[];
309
309
  /** Fields listed under Columns but not shown, for their Filter and Group ticks; views saved before it have none. */
310
310
  export declare const hiddenOf: (c: CustomViewConfig) => string[];
@@ -313,32 +313,32 @@ export declare const tilesOf: (c: CustomViewConfig) => ({
313
313
  key: string;
314
314
  label: string;
315
315
  field: string;
316
- agg: "max" | "min" | "first" | "last" | "sum" | "count" | "mean" | "distinct";
316
+ agg: "count" | "distinct" | "first" | "last" | "max" | "mean" | "min" | "sum";
317
317
  filter: {
318
318
  key: string;
319
319
  value: string;
320
320
  not?: boolean | undefined;
321
- op?: "gt" | "lt" | "eq" | "between" | undefined;
322
- link?: "blue" | "lime" | "pink" | "teal" | "amber" | undefined;
321
+ op?: "between" | "eq" | "gt" | "lt" | undefined;
322
+ link?: "amber" | "blue" | "lime" | "pink" | "teal" | undefined;
323
323
  }[];
324
324
  sign: boolean;
325
325
  suffix: string;
326
326
  lines: ({
327
327
  kind: "value";
328
328
  field: string;
329
- agg: "max" | "min" | "first" | "last" | "sum" | "count" | "mean" | "distinct";
329
+ agg: "count" | "distinct" | "first" | "last" | "max" | "mean" | "min" | "sum";
330
330
  filter: {
331
331
  key: string;
332
332
  value: string;
333
333
  not?: boolean | undefined;
334
- op?: "gt" | "lt" | "eq" | "between" | undefined;
335
- link?: "blue" | "lime" | "pink" | "teal" | "amber" | undefined;
334
+ op?: "between" | "eq" | "gt" | "lt" | undefined;
335
+ link?: "amber" | "blue" | "lime" | "pink" | "teal" | undefined;
336
336
  }[];
337
337
  suffix: string;
338
338
  } | {
339
339
  kind: "pct";
340
340
  field: string;
341
- agg: "max" | "min" | "first" | "last" | "sum" | "count" | "mean" | "distinct";
341
+ agg: "count" | "distinct" | "first" | "last" | "max" | "mean" | "min" | "sum";
342
342
  } | {
343
343
  kind: "text";
344
344
  text: string;
package/dist/whats-new.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // What's new (in Lumen for
3
3
  // every app): the version in the status bar opens the release notes, newest
4
4
  // first, each release's Key takeaways only. An app turns it on with LumenShell's `releases`, its