@columenlabs/lumen-ui 0.1.88 → 0.1.89
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/assistant/lumen-assistant.js +3 -1
- package/dist/lazy-part.d.ts +8 -0
- package/dist/lazy-part.js +15 -0
- package/dist/lumen-layout.d.ts +1 -1
- package/dist/lumen-layout.js +3 -1
- package/dist/lumen-view.js +3 -1
- package/dist/lumen-widget.js +7 -3
- package/dist/market/chart-span.d.ts +16 -0
- package/dist/market/chart-span.js +26 -0
- package/dist/market/lumen-chart.d.ts +1 -1
- package/dist/market/lumen-chart.js +5 -2
- package/dist/market/price-chart.d.ts +2 -10
- package/dist/market/price-chart.js +2 -26
- package/dist/shell.js +3 -1
- package/package.json +2 -2
|
@@ -2,10 +2,10 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { useQuery, useQueryClient } from '@tanstack/react-query';
|
|
3
3
|
import { ArrowUpIcon, CheckIcon, ChevronRightIcon, CircleAlertIcon, CopyIcon, CornerDownRightIcon, CrosshairIcon, FileTextIcon, LightbulbIcon, PencilIcon, PlusIcon, SparklesIcon, SquareIcon, Undo2Icon, WrenchIcon, XIcon, } from 'lucide-react';
|
|
4
4
|
import { createContext, useContext, useEffect, useRef, useState } from 'react';
|
|
5
|
-
import Markdown from 'react-markdown';
|
|
6
5
|
import { LumenAssistantButton, LumenAssistantChats, LumenAssistantPanel, assistantOpen, useAssistantHotkey, } from '../assistant-panel.js';
|
|
7
6
|
import { IconButton } from '../icon-button.js';
|
|
8
7
|
import { errorText } from '../integrations.js';
|
|
8
|
+
import { lazyPart } from '../lazy-part.js';
|
|
9
9
|
import { cn } from '../lib/utils.js';
|
|
10
10
|
import { LumenSelector, LumenSelectorList, } from '../lumen-selector.js';
|
|
11
11
|
import { lumenToast } from '../lumen-toast.js';
|
|
@@ -20,6 +20,8 @@ import { Textarea } from '../ui/textarea.js';
|
|
|
20
20
|
import { chatMarkdown, chatTurns, copyMarkdown, turnMarkdown } from './copy.js';
|
|
21
21
|
import { composeAssistant, selectionRef, useComposeRequest, usePageSelection, useShownAssistantSources, } from './sources.js';
|
|
22
22
|
import { useAssistantChat } from './use-assistant-chat.js';
|
|
23
|
+
// The Markdown renderer loads with the first answer (lazy-part.tsx).
|
|
24
|
+
const Markdown = lazyPart(() => import('react-markdown').then((m) => m.default));
|
|
23
25
|
/** The main model's context drawn full (tokens); the mark sits where the assistant compacts. */
|
|
24
26
|
const CONTEXT_MAX = 200_000;
|
|
25
27
|
const COMPACT_AT = 150_000;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A part of the kit loaded only when it first shows (a chart, Edit widget, What's new), so an app's
|
|
3
|
+
* first page never downloads what it doesn't draw. The import must be a dynamic `import()` with the
|
|
4
|
+
* part's module, and every other import of that module elsewhere in the kit's static graph must be
|
|
5
|
+
* type-only, or the bundler keeps it in the first file.
|
|
6
|
+
*/
|
|
7
|
+
import { type ComponentType, type ReactNode } from 'react';
|
|
8
|
+
export declare function lazyPart<P extends object>(load: () => Promise<ComponentType<P>>, fallback?: ReactNode): ComponentType<P>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* A part of the kit loaded only when it first shows (a chart, Edit widget, What's new), so an app's
|
|
4
|
+
* first page never downloads what it doesn't draw. The import must be a dynamic `import()` with the
|
|
5
|
+
* part's module, and every other import of that module elsewhere in the kit's static graph must be
|
|
6
|
+
* type-only, or the bundler keeps it in the first file.
|
|
7
|
+
*/
|
|
8
|
+
import { Suspense, lazy } from 'react';
|
|
9
|
+
export function lazyPart(load, fallback = null) {
|
|
10
|
+
const Part = lazy(() => load().then((c) => ({ default: c })));
|
|
11
|
+
function LazyPart(props) {
|
|
12
|
+
return (_jsx(Suspense, { fallback: fallback, children: _jsx(Part, { ...props }) }));
|
|
13
|
+
}
|
|
14
|
+
return LazyPart;
|
|
15
|
+
}
|
package/dist/lumen-layout.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { type LumenLoad } from './lumen-source.js';
|
|
|
8
8
|
import { type LumenViewProps, type ServerPaging } from './lumen-view.js';
|
|
9
9
|
import { type CardControls, type CardLink } from './lumen-widget.js';
|
|
10
10
|
import { type Crumb } from './page.js';
|
|
11
|
-
import {
|
|
11
|
+
import type { ViewEditorSection } from './view-editor.js';
|
|
12
12
|
import { type ViewDomain } from './view-model.js';
|
|
13
13
|
/** A card a page builds in code, after the saved view's cards: a view of other data, a list. */
|
|
14
14
|
export interface LumenLayoutCard {
|
package/dist/lumen-layout.js
CHANGED
|
@@ -21,6 +21,7 @@ import { useGroup } from './group-button.js';
|
|
|
21
21
|
import { useIsMobile } from './hooks/use-mobile.js';
|
|
22
22
|
import { SourceStatusItems, useJoins } from './joins.js';
|
|
23
23
|
import { useYourData } from './joins.js';
|
|
24
|
+
import { lazyPart } from './lazy-part.js';
|
|
24
25
|
import { cn } from './lib/utils.js';
|
|
25
26
|
import { LumenDrawer } from './lumen-drawer.js';
|
|
26
27
|
import { LumenTokenizedFilter, filterByTokens, useLumenFilter, } from './lumen-filter.js';
|
|
@@ -35,8 +36,9 @@ import { IconButton, Page } from './page.js';
|
|
|
35
36
|
import { SourcedCard } from './sourced-card.js';
|
|
36
37
|
import { LumenCard, SummaryTiles } from './summary-cards.js';
|
|
37
38
|
import { Button } from './ui/button.js';
|
|
38
|
-
import { ViewEditDialog } from './view-editor.js';
|
|
39
39
|
import { computedOf, filterFieldsOf, formulaBlanks, pick, subgroupOf, summaryCash, takesFormulas, withSavedFilters, withViewFields, } from './view-model.js';
|
|
40
|
+
// Loaded when it first shows (lazy-part.tsx).
|
|
41
|
+
const ViewEditDialog = lazyPart(() => import('./view-editor.js').then((m) => m.ViewEditDialog), null);
|
|
40
42
|
/** Rows of a view the assistant sees with each message. */
|
|
41
43
|
const ASSISTANT_ROWS = 10;
|
|
42
44
|
export function LumenLayout(props) {
|
package/dist/lumen-view.js
CHANGED
|
@@ -20,6 +20,7 @@ import { useFloatingHead } from './floating-head.js';
|
|
|
20
20
|
import { FreshnessMark, freshnessLine, freshnessOf } from './freshness.js';
|
|
21
21
|
import { useIsMobile } from './hooks/use-mobile.js';
|
|
22
22
|
import { IconButton } from './icon-button.js';
|
|
23
|
+
import { lazyPart } from './lazy-part.js';
|
|
23
24
|
import { cn } from './lib/utils.js';
|
|
24
25
|
import { LumenTokenizedFilter, useLumenFilter, } from './lumen-filter.js';
|
|
25
26
|
import { useGridCell } from './lumen-grid.js';
|
|
@@ -44,9 +45,10 @@ import { ToggleGroup, ToggleGroupItem } from './ui/toggle-group.js';
|
|
|
44
45
|
import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip.js';
|
|
45
46
|
import { UnitColumns } from './unit-value.js';
|
|
46
47
|
import { EditCell, EditInputCell, EditManyCell } from './view-edit-cell.js';
|
|
47
|
-
import { ViewEditDialog } from './view-editor.js';
|
|
48
48
|
import { fieldOptions } from './view-formulas.js';
|
|
49
49
|
import { CHIP_TONE, FORMULAS_GROUP, chipsOf, computedOf, filterFieldsOf, groupOf, label, pick, rollUp, rollsUp, subgroupOf, withSavedFilters, withViewFields, } from './view-model.js';
|
|
50
|
+
// Loaded when it first shows (lazy-part.tsx).
|
|
51
|
+
const ViewEditDialog = lazyPart(() => import('./view-editor.js').then((m) => m.ViewEditDialog), null);
|
|
50
52
|
export { CHIP_TONE, FORMULAS_GROUP, RUN_STATE_TONE } from './view-model.js';
|
|
51
53
|
export { rollUp } from './view-model.js';
|
|
52
54
|
/** Rows a table draws per group, or per unpaged table, before "Show more". */
|
package/dist/lumen-widget.js
CHANGED
|
@@ -12,10 +12,10 @@ import { useEffect, useMemo, useRef, useState } from 'react';
|
|
|
12
12
|
import { useAssistant, useAssistantName } from './assistant-context.js';
|
|
13
13
|
import { LumenConfirm } from './confirm.js';
|
|
14
14
|
import { FoldChevron, useFolded, usePageKey } from './fold.js';
|
|
15
|
-
import { GrowthChart } from './growth-chart.js';
|
|
16
15
|
import { useIsMobile } from './hooks/use-mobile.js';
|
|
17
16
|
import { IconButton } from './icon-button.js';
|
|
18
17
|
import { useDomainReads } from './joins.js';
|
|
18
|
+
import { lazyPart } from './lazy-part.js';
|
|
19
19
|
import { cn } from './lib/utils.js';
|
|
20
20
|
import { LumenBoundary } from './lumen-boundary.js';
|
|
21
21
|
import { LumenTokenizedFilter, filterByTokens, useLumenFilter, } from './lumen-filter.js';
|
|
@@ -23,11 +23,9 @@ import { useGridCell } from './lumen-grid.js';
|
|
|
23
23
|
import { CardIdProvider, LinkDot, LinkPicker, linkVar, useLinks, } from './lumen-links.js';
|
|
24
24
|
import { LumenSelector } from './lumen-selector.js';
|
|
25
25
|
import { LumenFreshness, LumenLazy, LumenLoadFooter, LumenRefresh, LumenStates, } from './lumen-source.js';
|
|
26
|
-
import { TrendBody } from './lumen-trend.js';
|
|
27
26
|
import { AllocationBar, Donut, Headline, RankedBars, STACK_MAX, StackedBars, } from './lumen-widget-charts.js';
|
|
28
27
|
import { useHasMarket } from './market/live.js';
|
|
29
28
|
import { useBarsUrl, useLumenChart } from './market/lumen-chart.js';
|
|
30
|
-
import { MarketWidget } from './market/market-widget.js';
|
|
31
29
|
import { maskAmount, useAmountsHidden } from './shell.js';
|
|
32
30
|
import { SummaryCardsEditor, summaryCardIssues } from './summary-cards.js';
|
|
33
31
|
import { Badge } from './ui/badge.js';
|
|
@@ -51,6 +49,12 @@ import { computedOf, label, summaryCash, } from './view-model.js';
|
|
|
51
49
|
import { WidgetControlsEditor } from './widget-controls.js';
|
|
52
50
|
import { PAGE_SOURCE, useWidgetDataOptions } from './widget-data.js';
|
|
53
51
|
import { dateFields } from './widget-settings.js';
|
|
52
|
+
// Loaded when it first shows (lazy-part.tsx).
|
|
53
|
+
const MarketWidget = lazyPart(() => import('./market/market-widget.js').then((m) => m.MarketWidget), _jsx(Skeleton, { className: "h-full min-h-40 w-full" }));
|
|
54
|
+
// Loaded when it first shows (lazy-part.tsx).
|
|
55
|
+
const TrendBody = lazyPart(() => import('./lumen-trend.js').then((m) => m.TrendBody), _jsx(Skeleton, { className: "h-full min-h-40 w-full" }));
|
|
56
|
+
// Loaded when it first shows (lazy-part.tsx).
|
|
57
|
+
const GrowthChart = lazyPart(() => import('./growth-chart.js').then((m) => m.GrowthChart), _jsx(Skeleton, { className: "h-full min-h-40 w-full" }));
|
|
54
58
|
/** Each style's icon, by its id in `WIDGET_STYLES`; a style left out takes its kind's. */
|
|
55
59
|
const STYLE_ICONS = {
|
|
56
60
|
'table:table': TableIcon,
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time spans on a chart's bars, apart from the chart itself so a page can work them out without
|
|
3
|
+
* loading the chart (lightweight-charts) before it shows.
|
|
4
|
+
*/
|
|
5
|
+
import type { Time } from 'lightweight-charts';
|
|
6
|
+
/** A bar's time as Unix seconds (days read as UTC midnight). */
|
|
7
|
+
export declare const secOf: (t: string | number | Time) => number;
|
|
8
|
+
/** A span of time in Unix seconds; either end may be infinite (from the first bar, to the last). */
|
|
9
|
+
export interface TimeSpan {
|
|
10
|
+
from: number;
|
|
11
|
+
to: number;
|
|
12
|
+
}
|
|
13
|
+
/** First index whose time is at or after `t` (`secs` ascending); `secs.length` when none is. */
|
|
14
|
+
export declare function lowerBound(secs: number[], t: number): number;
|
|
15
|
+
/** The bars of `secs` inside `span`, as an index range (at least one bar). */
|
|
16
|
+
export declare function indexSpan(secs: number[], span: TimeSpan): [number, number];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** A bar's time as Unix seconds (days read as UTC midnight). */
|
|
2
|
+
export const secOf = (t) => typeof t === 'number'
|
|
3
|
+
? t
|
|
4
|
+
: typeof t === 'string'
|
|
5
|
+
? Date.parse(`${t}T00:00:00Z`) / 1000
|
|
6
|
+
: Date.UTC(t.year, t.month - 1, t.day) / 1000;
|
|
7
|
+
/** First index whose time is at or after `t` (`secs` ascending); `secs.length` when none is. */
|
|
8
|
+
export function lowerBound(secs, t) {
|
|
9
|
+
let lo = 0;
|
|
10
|
+
let hi = secs.length;
|
|
11
|
+
while (lo < hi) {
|
|
12
|
+
const mid = (lo + hi) >> 1;
|
|
13
|
+
if (secs[mid] < t)
|
|
14
|
+
lo = mid + 1;
|
|
15
|
+
else
|
|
16
|
+
hi = mid;
|
|
17
|
+
}
|
|
18
|
+
return lo;
|
|
19
|
+
}
|
|
20
|
+
/** The bars of `secs` inside `span`, as an index range (at least one bar). */
|
|
21
|
+
export function indexSpan(secs, span) {
|
|
22
|
+
const last = secs.length - 1;
|
|
23
|
+
const a = Math.min(last, lowerBound(secs, span.from));
|
|
24
|
+
const b = Math.max(a, Math.min(last, lowerBound(secs, span.to + 1) - 1));
|
|
25
|
+
return [a, b];
|
|
26
|
+
}
|
|
@@ -18,7 +18,7 @@ import { type MarketBar, type MarketWindow } from '@columenlabs/lumen-ui-types/m
|
|
|
18
18
|
import { type ReactNode } from 'react';
|
|
19
19
|
import { type LumenLoad } from '../lumen-source.js';
|
|
20
20
|
import { type ChartIndicator } from './indicators.js';
|
|
21
|
-
import {
|
|
21
|
+
import type { ChartBar } from './price-chart.js';
|
|
22
22
|
/** Opens the chart dialog: one symbol, or up to 8 to compare, with its indicators if given. */
|
|
23
23
|
export type OpenChart = (symbols: string | string[], indicators?: IndicatorSpec[]) => void;
|
|
24
24
|
/**
|
|
@@ -6,6 +6,7 @@ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, use
|
|
|
6
6
|
import { useInView } from 'react-intersection-observer';
|
|
7
7
|
import { useAssistantMoves } from '../assistant-screen.js';
|
|
8
8
|
import { IconButton } from '../icon-button.js';
|
|
9
|
+
import { lazyPart } from '../lazy-part.js';
|
|
9
10
|
import { cn } from '../lib/utils.js';
|
|
10
11
|
import { useLumenLoad } from '../lumen-source.js';
|
|
11
12
|
import { usePrefs } from '../prefs.js';
|
|
@@ -15,11 +16,13 @@ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } f
|
|
|
15
16
|
import { Input } from '../ui/input.js';
|
|
16
17
|
import { Skeleton } from '../ui/skeleton.js';
|
|
17
18
|
import { ToggleGroup, ToggleGroupItem } from '../ui/toggle-group.js';
|
|
18
|
-
import {
|
|
19
|
+
import { indexSpan, secOf } from './chart-span.js';
|
|
19
20
|
import { ALL_SHOWN, IndicatorPicker } from './indicator-picker.js';
|
|
20
21
|
import { CHART_INDICATORS, computeIndicators, formulaIndicator, lineColor, resolveIndicator, } from './indicators.js';
|
|
21
22
|
import { extendedOf, todayOf, useMarket } from './live.js';
|
|
22
|
-
|
|
23
|
+
// The charts load when the dialog first draws one (lazy-part.tsx).
|
|
24
|
+
const PriceChart = lazyPart(() => import('./price-chart.js').then((m) => m.PriceChart), _jsx(Skeleton, { className: "h-96 w-full" }));
|
|
25
|
+
const CompareChart = lazyPart(() => import('./compare-chart.js').then((m) => m.CompareChart), _jsx(Skeleton, { className: "h-96 w-full" }));
|
|
23
26
|
const ChartContext = createContext(null);
|
|
24
27
|
const BarsContext = createContext(null);
|
|
25
28
|
const IndicatorsContext = createContext(null);
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* financial time axis and panning (approved in the market-live design).
|
|
7
7
|
*/
|
|
8
8
|
import { type IChartApi, type Time } from 'lightweight-charts';
|
|
9
|
+
import { type TimeSpan } from './chart-span.js';
|
|
9
10
|
import { type ChartIndicator, type IndicatorValues } from './indicators.js';
|
|
10
11
|
/** One bar: `time` is a `YYYY-MM-DD` day or Unix seconds. */
|
|
11
12
|
export interface ChartBar {
|
|
@@ -67,15 +68,7 @@ export declare function useTheme(): {
|
|
|
67
68
|
export declare const alpha: (c: string, a: number) => string;
|
|
68
69
|
/** Time labels in the person's zone (the axis would otherwise read UTC). */
|
|
69
70
|
export declare function timeText(t: Time, zone: string, withDay: boolean): string;
|
|
70
|
-
|
|
71
|
-
export declare const secOf: (t: string | number | Time) => number;
|
|
72
|
-
/** A span of time in Unix seconds; either end may be infinite (from the first bar, to the last). */
|
|
73
|
-
export interface TimeSpan {
|
|
74
|
-
from: number;
|
|
75
|
-
to: number;
|
|
76
|
-
}
|
|
77
|
-
/** The bars of `secs` inside `span`, as an index range (at least one bar). */
|
|
78
|
-
export declare function indexSpan(secs: number[], span: TimeSpan): [number, number];
|
|
71
|
+
export { indexSpan, secOf, type TimeSpan } from './chart-span.js';
|
|
79
72
|
export interface PriceChartProps {
|
|
80
73
|
bars: ChartBar[];
|
|
81
74
|
/** Bars shown at first, counted from the latest; left out: all of them. */
|
|
@@ -125,4 +118,3 @@ export declare function Navigator({ chart, bars, secs, timeline, theme, timeZone
|
|
|
125
118
|
multiDay: boolean;
|
|
126
119
|
goTo: (span: TimeSpan) => void;
|
|
127
120
|
}): import("react").JSX.Element;
|
|
128
|
-
export {};
|
|
@@ -9,6 +9,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
import { AreaSeries, BarSeries, CandlestickSeries, ColorType, CrosshairMode, HistogramSeries, LineSeries, createChart, } from 'lightweight-charts';
|
|
10
10
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
11
11
|
import { cn } from '../lib/utils.js';
|
|
12
|
+
import { indexSpan, lowerBound, secOf } from './chart-span.js';
|
|
12
13
|
import { lineColor } from './indicators.js';
|
|
13
14
|
/** How the price is drawn: the basics every charting tool offers. */
|
|
14
15
|
export const CHART_TYPES = [
|
|
@@ -99,32 +100,7 @@ export function timeText(t, zone, withDay) {
|
|
|
99
100
|
...(withDay ? { month: 'short', day: 'numeric' } : {}),
|
|
100
101
|
});
|
|
101
102
|
}
|
|
102
|
-
|
|
103
|
-
export const secOf = (t) => typeof t === 'number'
|
|
104
|
-
? t
|
|
105
|
-
: typeof t === 'string'
|
|
106
|
-
? Date.parse(`${t}T00:00:00Z`) / 1000
|
|
107
|
-
: Date.UTC(t.year, t.month - 1, t.day) / 1000;
|
|
108
|
-
/** First index whose time is at or after `t` (`secs` ascending); `secs.length` when none is. */
|
|
109
|
-
function lowerBound(secs, t) {
|
|
110
|
-
let lo = 0;
|
|
111
|
-
let hi = secs.length;
|
|
112
|
-
while (lo < hi) {
|
|
113
|
-
const mid = (lo + hi) >> 1;
|
|
114
|
-
if (secs[mid] < t)
|
|
115
|
-
lo = mid + 1;
|
|
116
|
-
else
|
|
117
|
-
hi = mid;
|
|
118
|
-
}
|
|
119
|
-
return lo;
|
|
120
|
-
}
|
|
121
|
-
/** The bars of `secs` inside `span`, as an index range (at least one bar). */
|
|
122
|
-
export function indexSpan(secs, span) {
|
|
123
|
-
const last = secs.length - 1;
|
|
124
|
-
const a = Math.min(last, lowerBound(secs, span.from));
|
|
125
|
-
const b = Math.max(a, Math.min(last, lowerBound(secs, span.to + 1) - 1));
|
|
126
|
-
return [a, b];
|
|
127
|
-
}
|
|
103
|
+
export { indexSpan, secOf } from './chart-span.js';
|
|
128
104
|
/** One chart: price in the chosen type, volume, then a pane per oscillator, all sharing the time axis. */
|
|
129
105
|
export function PriceChart({ bars, visible, type, chosen, values, timeZone = 'America/Los_Angeles', zoom = false, navigator = false, baseline = null, timeline, range, onRange, onOutside, className, }) {
|
|
130
106
|
const host = useRef(null);
|
package/dist/shell.js
CHANGED
|
@@ -7,6 +7,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
7
7
|
import { useRouterState } from '@tanstack/react-router';
|
|
8
8
|
import { ChevronsUpDownIcon, LogOutIcon, ScrollTextIcon, SettingsIcon, SunMoonIcon, } from 'lucide-react';
|
|
9
9
|
import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from 'react';
|
|
10
|
+
import { lazyPart } from './lazy-part.js';
|
|
10
11
|
import { cn } from './lib/utils.js';
|
|
11
12
|
import { LumenFinder } from './lumen-finder.js';
|
|
12
13
|
import { usePrefs } from './prefs.js';
|
|
@@ -19,7 +20,8 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem,
|
|
|
19
20
|
import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarRail, useSidebar, } from './ui/sidebar.js';
|
|
20
21
|
import { Toaster } from './ui/sonner.js';
|
|
21
22
|
import { TooltipProvider } from './ui/tooltip.js';
|
|
22
|
-
|
|
23
|
+
// Loaded when it first shows (lazy-part.tsx).
|
|
24
|
+
const WhatsNew = lazyPart(() => import('./whats-new.js').then((m) => m.WhatsNew), null);
|
|
23
25
|
const Ctx = createContext(null);
|
|
24
26
|
export function useShell() {
|
|
25
27
|
const c = useContext(Ctx);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@columenlabs/lumen-ui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.89",
|
|
4
4
|
"description": "Lumen: shared React components (frame, views, widgets, charts, drawers).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@codemirror/lang-javascript": "6.2.5",
|
|
50
50
|
"@codemirror/lang-json": "6.0.2",
|
|
51
51
|
"@codemirror/lang-sql": "6.10.0",
|
|
52
|
-
"@columenlabs/lumen-ui-types": "0.1.
|
|
52
|
+
"@columenlabs/lumen-ui-types": "0.1.89",
|
|
53
53
|
"@dnd-kit/core": "6.3.1",
|
|
54
54
|
"@dnd-kit/sortable": "10.0.0",
|
|
55
55
|
"@dnd-kit/utilities": "3.2.2",
|