@k2b/ui 0.31.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/base.css +2 -0
  2. package/dist/browser/actions/ViewTabs.js +8 -0
  3. package/dist/browser/actions/ViewTabs.js.map +1 -1
  4. package/dist/browser/content/Chart.js +104 -55
  5. package/dist/browser/content/Chart.js.map +1 -1
  6. package/dist/browser/content/ChartExplorer.js +5 -3
  7. package/dist/browser/content/ChartExplorer.js.map +1 -1
  8. package/dist/browser/content/MapView.js +4 -4
  9. package/dist/browser/content/MapView.js.map +1 -1
  10. package/dist/browser/content/chart-inspection-core.js +4 -1
  11. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  12. package/dist/browser/content/code-highlight.js +66 -0
  13. package/dist/browser/content/code-highlight.js.map +1 -1
  14. package/dist/browser/content/index.js +1 -0
  15. package/dist/browser/content/index.js.map +1 -1
  16. package/dist/browser/content/map-view-live.js +47 -10
  17. package/dist/browser/content/map-view-live.js.map +1 -1
  18. package/dist/browser/content/map-view-types.js.map +1 -1
  19. package/dist/browser/inputs/AutocompleteEditor.js +167 -104
  20. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  21. package/dist/browser/inputs/RichSelect.js +1474 -0
  22. package/dist/browser/inputs/RichSelect.js.map +1 -0
  23. package/dist/browser/inputs/TextInput.js +95 -60
  24. package/dist/browser/inputs/TextInput.js.map +1 -1
  25. package/dist/browser/inputs/choice.js +19 -8
  26. package/dist/browser/inputs/choice.js.map +1 -1
  27. package/dist/browser/inputs/index.js +1 -0
  28. package/dist/browser/inputs/index.js.map +1 -1
  29. package/dist/browser/inputs/rich-select-messages.js +46 -0
  30. package/dist/browser/inputs/rich-select-messages.js.map +1 -0
  31. package/dist/browser/layout/AppWorkspace.js +177 -135
  32. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  33. package/dist/browser/layout/DetailPanel.js +10 -1
  34. package/dist/browser/layout/DetailPanel.js.map +1 -1
  35. package/dist/browser/layout/Navigation.js +14 -5
  36. package/dist/browser/layout/Navigation.js.map +1 -1
  37. package/dist/browser/layout/PageTitle.js +9 -3
  38. package/dist/browser/layout/PageTitle.js.map +1 -1
  39. package/dist/browser/layout/ResizeSeparator.js +8 -2
  40. package/dist/browser/layout/ResizeSeparator.js.map +1 -1
  41. package/dist/browser/layout/app-workspace-controller.js +192 -31
  42. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  43. package/dist/browser/layout/navigation-model.js.map +1 -1
  44. package/dist/browser/layout/resize-separator.js +25 -1
  45. package/dist/browser/layout/resize-separator.js.map +1 -1
  46. package/dist/browser/surfaces/Skeleton.js +14 -0
  47. package/dist/browser/surfaces/Skeleton.js.map +1 -0
  48. package/dist/browser/surfaces/index.js +1 -0
  49. package/dist/browser/surfaces/index.js.map +1 -1
  50. package/dist/ssr/actions/ViewTabs.js +8 -0
  51. package/dist/ssr/actions/ViewTabs.js.map +1 -1
  52. package/dist/ssr/content/Chart.js +27 -7
  53. package/dist/ssr/content/Chart.js.map +1 -1
  54. package/dist/ssr/content/ChartExplorer.js +5 -3
  55. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  56. package/dist/ssr/content/MapView.js +4 -4
  57. package/dist/ssr/content/MapView.js.map +1 -1
  58. package/dist/ssr/content/chart-inspection-core.js +4 -1
  59. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  60. package/dist/ssr/content/code-highlight.js +66 -0
  61. package/dist/ssr/content/code-highlight.js.map +1 -1
  62. package/dist/ssr/content/index.js +1 -0
  63. package/dist/ssr/content/index.js.map +1 -1
  64. package/dist/ssr/content/map-view-types.js.map +1 -1
  65. package/dist/ssr/inputs/AutocompleteEditor.js +64 -24
  66. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  67. package/dist/ssr/inputs/RichSelect.js +950 -0
  68. package/dist/ssr/inputs/RichSelect.js.map +1 -0
  69. package/dist/ssr/inputs/TextInput.js +40 -16
  70. package/dist/ssr/inputs/TextInput.js.map +1 -1
  71. package/dist/ssr/inputs/choice.js +19 -8
  72. package/dist/ssr/inputs/choice.js.map +1 -1
  73. package/dist/ssr/inputs/index.js +1 -0
  74. package/dist/ssr/inputs/index.js.map +1 -1
  75. package/dist/ssr/inputs/rich-select-messages.js +46 -0
  76. package/dist/ssr/inputs/rich-select-messages.js.map +1 -0
  77. package/dist/ssr/layout/AppWorkspace.js +36 -7
  78. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  79. package/dist/ssr/layout/DetailPanel.js +1 -1
  80. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  81. package/dist/ssr/layout/Navigation.js +1 -1
  82. package/dist/ssr/layout/Navigation.js.map +1 -1
  83. package/dist/ssr/layout/PageTitle.js +9 -3
  84. package/dist/ssr/layout/PageTitle.js.map +1 -1
  85. package/dist/ssr/layout/ResizeSeparator.js +4 -1
  86. package/dist/ssr/layout/ResizeSeparator.js.map +1 -1
  87. package/dist/ssr/layout/app-workspace-controller.js +192 -31
  88. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  89. package/dist/ssr/layout/navigation-model.js.map +1 -1
  90. package/dist/ssr/layout/resize-separator.js +25 -1
  91. package/dist/ssr/layout/resize-separator.js.map +1 -1
  92. package/dist/ssr/surfaces/Skeleton.js +8 -0
  93. package/dist/ssr/surfaces/Skeleton.js.map +1 -0
  94. package/dist/ssr/surfaces/index.js +1 -0
  95. package/dist/ssr/surfaces/index.js.map +1 -1
  96. package/dist/styles.css +1 -1
  97. package/dist/types/content/Chart.d.ts +4 -2
  98. package/dist/types/content/ChartExplorer.d.ts +0 -1
  99. package/dist/types/content/code-highlight.d.ts +3 -1
  100. package/dist/types/content/index.d.ts +1 -0
  101. package/dist/types/content/map-view-live.d.ts +1 -1
  102. package/dist/types/content/map-view-types.d.ts +2 -0
  103. package/dist/types/inputs/AutocompleteEditor.d.ts +6 -1
  104. package/dist/types/inputs/RichSelect.d.ts +93 -0
  105. package/dist/types/inputs/TextInput.d.ts +5 -2
  106. package/dist/types/inputs/choice.d.ts +24 -4
  107. package/dist/types/inputs/index.d.ts +2 -0
  108. package/dist/types/inputs/rich-select-messages.d.ts +21 -0
  109. package/dist/types/layout/AppWorkspace.d.ts +7 -0
  110. package/dist/types/layout/DetailPanel.d.ts +2 -0
  111. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  112. package/dist/types/layout/navigation-model.d.ts +2 -0
  113. package/dist/types/layout/resize-separator.d.ts +1 -0
  114. package/dist/types/surfaces/Skeleton.d.ts +6 -0
  115. package/dist/types/surfaces/index.d.ts +1 -0
  116. package/package.json +4 -4
@@ -92,14 +92,16 @@ export type ChartProps = {
92
92
  /** Target when zooming in from the world view. Defaults to Europe (50, 10). */
93
93
  zoomFocus?: Pick<MapViewport, "latitude" | "longitude">;
94
94
  } : {}) & (K extends "line" ? {
95
- maxGap?: number;
95
+ /** Largest connected X distance; positive, finite, without area/errorBand fills. */ maxGap?: number;
96
+ /** Wrap the legend above the plot inside the caller's total chart height. Requires legend=true. */
97
+ legendPlacement?: "top-start";
96
98
  } : {}) & (K extends "stateTimeline" ? StateTimelineChartOptions : Omit<Parameters<(typeof charts)[K]>[0], "width" | "height" | "inspect">);
97
99
  }[ChartKind];
98
100
  /** Pure renderer options: component layout, events and inspection are configured elsewhere. */
99
101
  export type ChartRenderOptions = {
100
102
  [K in ChartKind]: Omit<Extract<ChartProps, {
101
103
  kind: K;
102
- }>, "class" | "style" | "labels" | "interactive" | "onSelect" | "selected" | "tooltip" | "cursor">;
104
+ }>, "class" | "style" | "labels" | "interactive" | "onSelect" | "selected" | "tooltip" | "cursor" | "legendPlacement">;
103
105
  }[ChartKind];
104
106
  /** Keep the fixed 28-unit bar-gauge rows inside the shared SSR/browser coordinate space. */
105
107
  export declare const chartRenderHeight: (props: ChartRenderOptions) => number;
@@ -10,7 +10,6 @@ export type ChartExplorerColumn<T> = {
10
10
  render?: (row: T) => JSX.Element;
11
11
  /**
12
12
  * Explicit comparable value. Omit to leave the column unsortable.
13
- * Returning a number also exempts the cell from spreadsheet formula guarding on copy.
14
13
  */
15
14
  sortValue?: (row: T) => string | number | null;
16
15
  align?: "left" | "center" | "right";
@@ -6,9 +6,11 @@
6
6
  * in token spans, so the returned strings are safe to inject with
7
7
  * `innerHTML`.
8
8
  */
9
- export type CodeDisplayLanguage = "ts" | "tsx" | "js" | "jsx" | "script" | "markdown" | "md" | "text";
9
+ export type CodeDisplayLanguage = "ts" | "tsx" | "js" | "jsx" | "script" | "markdown" | "md" | "text" | "sql";
10
10
  export declare const escapeCodeHtml: (s: string) => string;
11
11
  export declare const highlightCode: (code: string) => string;
12
12
  export declare const highlightMarkdownDisplay: (code: string) => string;
13
13
  export declare const highlightCodeDisplayLines: (code: string, language?: CodeDisplayLanguage) => string[];
14
14
  export declare const highlightCodeDisplay: (code: string, language?: CodeDisplayLanguage) => string;
15
+ /** Display-only, tolerant of incomplete SQL while typing. Source is always escaped. */
16
+ export declare const highlightSql: (code: string) => string;
@@ -17,6 +17,7 @@ export type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter
17
17
  export type { ChartSnapshot } from "./chart-snapshot";
18
18
  export { prepareChartSnapshot } from "./chart-snapshot";
19
19
  export type { StateTimelineChartOptions, StateTimelineDomain, StateTimelineInterval, StateTimelineRow, StateTimelineState, } from "./chart-state-timeline";
20
+ export { highlightSql } from "./code-highlight";
20
21
  export { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from "./collection-selection";
21
22
  export type { DataTableColumn, DataTableControlsProps, DataTableFooter, DataTableHeaderProps, DataTablePanelFooterProps, DataTablePanelProps, DataTableProps, DataTableRenderCell, DataTableRenderHeader, DataTableSort, } from "./DataTable";
22
23
  export { default as DataTable } from "./DataTable";
@@ -1,2 +1,2 @@
1
1
  import { Map, type MapOptions } from "maplibre-gl";
2
- export declare function createMap(options: MapOptions): Map;
2
+ export declare function createMap(options: MapOptions, onResourceError: () => void): Map;
@@ -58,4 +58,6 @@ export type MapViewProps = Omit<MapViewFrameProps, "attribution"> & {
58
58
  notice?: JSX.Element;
59
59
  empty?: JSX.Element;
60
60
  onLocate?: () => void;
61
+ /** Observe rendering and resource failures without receiving provider responses or URLs. */
62
+ onStateChange?: (state: "static" | "loading" | "ready" | "error" | "no-webgl" | "empty") => void;
61
63
  };
@@ -14,7 +14,12 @@ export type AutocompleteEditorProps = ValueFieldProps<string> & {
14
14
  name?: string;
15
15
  maxLength?: number;
16
16
  textareaRef?: (element: HTMLTextAreaElement) => void;
17
- variant?: "default" | "paper";
17
+ variant?: "default" | "paper" | "embedded";
18
+ readOnly?: boolean;
19
+ /** Number logical lines; disables soft wrapping to keep the gutter aligned. */
20
+ lineNumbers?: boolean;
21
+ /** One-based line to mark in the gutter, for example a parser error. */
22
+ markedLine?: number;
18
23
  };
19
24
  export declare function AutocompleteEditor(props: AutocompleteEditorProps): JSX.Element;
20
25
  export type { Completion, SuggestContext, Suggestion } from "./completion";
@@ -0,0 +1,93 @@
1
+ import { type JSX } from "solid-js";
2
+ import type { ValueFieldProps } from "./field-contract";
3
+ import type { ChoiceAppearance } from "./Select";
4
+ /** One option: a name plus at most one short line. */
5
+ export type RichSelectItem = {
6
+ value: string;
7
+ /** Wraps; never truncated. */
8
+ label: string;
9
+ /** At most one short line that says what the choice changes. */
10
+ description?: string;
11
+ /** Icon class shown before the name. */
12
+ icon?: string;
13
+ /** Color dot shown before the name, such as a space color. Replaces `icon`. */
14
+ color?: string;
15
+ /** Creates a fresh visual for each render location. Replaces `icon` and `color`. */
16
+ visual?: () => JSX.Element;
17
+ /** Makes the row unavailable. The reason replaces `description`; the arrow keys still reach the row. */
18
+ disabledReason?: string;
19
+ /** Section id. Headings show only from eight options; keep each section's items together. */
20
+ section?: string;
21
+ /** Extra search terms that are not shown. */
22
+ keywords?: readonly string[];
23
+ };
24
+ export type RichSelectSection = {
25
+ id: string;
26
+ label: string;
27
+ };
28
+ export type RichSelectStatus = "ready" | "loading" | "error";
29
+ export type RichSelectFooter = {
30
+ label: string;
31
+ icon?: string;
32
+ onActivate: () => void;
33
+ } | {
34
+ label: string;
35
+ icon?: string;
36
+ create: {
37
+ placeholder: string;
38
+ onCreate: (name: string) => void;
39
+ };
40
+ };
41
+ export type RichSelectFact = {
42
+ icon: string;
43
+ text: JSX.Element;
44
+ tone?: "default" | "warning";
45
+ };
46
+ export type RichSelectProps = ValueFieldProps<string | null> & {
47
+ items: readonly RichSelectItem[];
48
+ /** Labels for the `section` ids of the items. */
49
+ sections?: readonly RichSelectSection[];
50
+ /** Names the list: the heading of a list without preview, the phone sheet title, and the listbox label. */
51
+ title?: string;
52
+ placeholder?: string;
53
+ /** Replaces the selected item's name in the trigger, such as "Name · address". */
54
+ triggerLabel?: string;
55
+ /** Icon class for the trigger while no item with its own visual is selected. */
56
+ icon?: string;
57
+ tone?: "default" | "warning";
58
+ /** Custom content inside the shared trigger button, which keeps the combobox semantics. */
59
+ renderTrigger?: (selected: RichSelectItem | undefined) => JSX.Element;
60
+ /**
61
+ * The body of the preview beside the list, for options whose consequences differ.
62
+ * Without it the picker shows only the list. Keep it to at most three facts.
63
+ */
64
+ renderPreview?: (item: RichSelectItem) => JSX.Element;
65
+ searchPlaceholder?: string;
66
+ status?: RichSelectStatus;
67
+ onRetry?: () => void;
68
+ /** Shown when the list is ready and has no items. */
69
+ empty?: JSX.Element;
70
+ footer?: RichSelectFooter;
71
+ appearance?: ChoiceAppearance;
72
+ placement?: "bottom-start" | "top-start";
73
+ /** CSS lengths for the desktop popover. */
74
+ size?: {
75
+ width?: string;
76
+ height?: string;
77
+ };
78
+ name?: string;
79
+ };
80
+ /** Search and section headings appear from this many options. */
81
+ export declare const RICH_SELECT_SEARCH_FROM = 8;
82
+ /** Up to three short facts for a preview, each with an icon; warnings in the warning tone. */
83
+ export declare function RichSelectFacts(props: {
84
+ facts: readonly RichSelectFact[];
85
+ }): JSX.Element;
86
+ /**
87
+ * A dropdown whose rows explain each choice: a name plus one short line, an
88
+ * unavailable row with its reason, and an optional preview of what a choice
89
+ * changes. Desktop opens a popover beside the trigger; a phone opens a bottom
90
+ * sheet whose info buttons show the preview as a second level.
91
+ */
92
+ export declare function RichSelect(props: RichSelectProps): JSX.Element;
93
+ export default RichSelect;
@@ -5,9 +5,12 @@ export type TextInputProps = Omit<JSX.InputHTMLAttributes<HTMLInputElement>, "on
5
5
  minLength?: number;
6
6
  maxLength?: number;
7
7
  type?: "text" | "search" | "email" | "url" | "tel";
8
- variant?: "default" | "ai";
9
- icon?: string;
8
+ variant?: "default" | "ai" | "compact";
9
+ /** Set false for a plain field without a leading icon. */
10
+ icon?: string | false;
10
11
  activeIcon?: string;
12
+ /** ID of a consumer-owned visible error; caller owns its announcement. Native controls only. */
13
+ externalErrorId?: string;
11
14
  prefix?: JSX.Element;
12
15
  suffix?: JSX.Element;
13
16
  clearable?: boolean;
@@ -10,8 +10,19 @@ export type ChoiceOption<T extends string = string> = {
10
10
  groups?: readonly string[];
11
11
  };
12
12
  export type ChoiceOptionsLoader<T extends string = string> = (query: string, signal: AbortSignal) => Promise<readonly ChoiceOption<T>[]>;
13
- export declare const filterChoiceOptions: <T extends string>(options: readonly ChoiceOption<T>[], query: string) => readonly ChoiceOption<T>[];
14
- export declare const nextEnabledChoiceIndex: <T extends string>(options: readonly ChoiceOption<T>[], current: number, direction: 1 | -1) => number;
13
+ /** Matches label, description, value, and optional extra keywords. */
14
+ export declare const filterChoiceOptions: <O extends Pick<ChoiceOption<string>, "label" | "description" | "value"> & {
15
+ keywords?: readonly string[];
16
+ }>(options: readonly O[], query: string) => readonly O[];
17
+ /**
18
+ * Moves through the options and wraps at the ends, skipping `disabled` ones. A
19
+ * RichSelect row that cannot be chosen carries a `disabledReason` instead, so
20
+ * the arrow keys still reach it and its reason can be read.
21
+ */
22
+ export declare const nextEnabledChoiceIndex: <O extends {
23
+ label: string;
24
+ disabled?: boolean;
25
+ }>(options: readonly O[], current: number, direction: 1 | -1) => number;
15
26
  /**
16
27
  * Counts the leading pills that fit into `available` pixels and measures the
17
28
  * whole row. When not all of them fit, the rest collapse into a summary pill
@@ -32,8 +43,17 @@ export declare function createChoiceLoader<T extends string>(loader: () => Choic
32
43
  retry: () => void;
33
44
  cancel: () => void;
34
45
  };
35
- export declare const placeChoicePopover: (trigger: HTMLElement, popover: HTMLElement) => void;
36
- export declare function createChoicePopover(disabled: () => boolean): {
46
+ export type ChoicePopoverPlacement = {
47
+ /**
48
+ * `trigger` (default) gives the popover the trigger's width; `own` keeps the
49
+ * width its stylesheet sets, such as a RichSelect with a preview.
50
+ */
51
+ width?: "trigger" | "own";
52
+ /** The side tried first. The popover flips when the other side has more room. */
53
+ side?: "below" | "above";
54
+ };
55
+ export declare const placeChoicePopover: (trigger: HTMLElement, popover: HTMLElement, placement?: ChoicePopoverPlacement) => void;
56
+ export declare function createChoicePopover(disabled: () => boolean, placement?: () => ChoicePopoverPlacement): {
37
57
  open: () => boolean;
38
58
  setTrigger: Setter<HTMLElement | undefined>;
39
59
  setPopover: Setter<HTMLElement | undefined>;
@@ -37,6 +37,8 @@ export type { NumberInputProps } from "./NumberInput";
37
37
  export { NumberInput } from "./NumberInput";
38
38
  export type { QrScannerError, QrScannerProps } from "./QrScanner";
39
39
  export { QrScanner } from "./QrScanner";
40
+ export type { RichSelectFact, RichSelectFooter, RichSelectItem, RichSelectProps, RichSelectSection, RichSelectStatus, } from "./RichSelect";
41
+ export { RichSelect, RichSelectFacts } from "./RichSelect";
40
42
  export type { ChoiceAppearance, SelectGridSize, SelectGroup, SelectOption, SelectProps, SelectSourceOption, SelectView } from "./Select";
41
43
  export { Select } from "./Select";
42
44
  export type { SelectChipOption, SelectChipProps } from "./SelectChip";
@@ -0,0 +1,21 @@
1
+ declare const richSelectMessages: import("@k2b/stdlib").Catalog<{
2
+ back: string;
3
+ choose: string;
4
+ chooseOption: string;
5
+ close: string;
6
+ couldNotLoad: string;
7
+ create: string;
8
+ detailsFor: ({ name }: {
9
+ name: string;
10
+ }) => string;
11
+ loading: string;
12
+ noOptions: string;
13
+ noResults: string;
14
+ retry: string;
15
+ search: string;
16
+ }>;
17
+ export type RichSelectMessages = ReturnType<(typeof richSelectMessages)["resolve"]>["t"];
18
+ /** Resolved from the inherited render locale. */
19
+ export declare const useRichSelectMessages: () => (() => RichSelectMessages);
20
+ export declare const checkRichSelectMessages: () => import("@k2b/stdlib").CatalogIssue[];
21
+ export {};
@@ -6,6 +6,8 @@ import type { ScrollAreaProps } from "./ScrollArea";
6
6
  import { type AppWorkspaceSidebarSwitcherProps } from "./SidebarSwitcher";
7
7
  export type { AppWorkspaceWidthShare } from "./app-workspace-width";
8
8
  export type AppWorkspaceHeadProps = {
9
+ /** Below 48rem, show this head only with this active Main region. Unsplit Mains keep their head. */
10
+ mobilePane?: string;
9
11
  /** View tabs, usually a ViewTabs. */
10
12
  views?: JSX.Element;
11
13
  /** Filter chips, usually FilterChip elements. */
@@ -107,6 +109,10 @@ export type AppWorkspaceDetailWidth = "sm" | "md" | "lg" | "xl";
107
109
  export type AppWorkspaceDetailProps = {
108
110
  children: JSX.Element;
109
111
  open: boolean;
112
+ /** Keeps the shared head control reachable while closed; set the app's existing open state synchronously. */
113
+ onOpen?: () => void;
114
+ /** Whether the current object may show details. False disables reopening and hides the panel. */
115
+ available?: boolean;
110
116
  /**
111
117
  * Whether choosing an item in Main opens this Detail as the drawer while it waits.
112
118
  * Set false when Main itself shows the chosen item, such as a reader beside a list:
@@ -124,6 +130,7 @@ export type AppWorkspaceDetailProps = {
124
130
  maxWidth?: number;
125
131
  /**
126
132
  * Closes the column with Escape, or the phone sheet with a downward drag.
133
+ * With onOpen, the shared head control also closes the column or phone sheet.
127
134
  * Server-rendered panels mark their close control with
128
135
  * `data-workspace-detail-close` instead; those gestures click it.
129
136
  * Escape and a rightward touch swipe park an open waiting drawer without
@@ -2,6 +2,8 @@ import { type JSX } from "solid-js";
2
2
  import { type ButtonLinkProps, type ButtonProps } from "../actions/Button";
3
3
  import { type DropdownItem } from "../actions/Dropdown";
4
4
  export type DetailPanelProps = {
5
+ /** Plain sections share their host surface, as in AppWorkspace.Detail. */
6
+ surface?: "default" | "plain";
5
7
  children: JSX.Element;
6
8
  class?: string;
7
9
  };
@@ -11,6 +11,8 @@ export declare const parkWorkspaceDetailDrawers: (root?: ParentNode) => void;
11
11
  * stays application state, so the controller only requests the change.
12
12
  */
13
13
  export declare const APP_WORKSPACE_SIDEBAR_HIDE_EVENT = "k2b-app-workspace-sidebar-hide";
14
+ /** Asks the owning Detail to reopen its current available object. */
15
+ export declare const APP_WORKSPACE_DETAIL_OPEN_EVENT = "k2b-app-workspace-detail-open";
14
16
  /** Asks the owning `AppWorkspace.Detail` to close; its `onClose` decides. */
15
17
  export declare const APP_WORKSPACE_DETAIL_CLOSE_EVENT = "k2b-app-workspace-detail-close";
16
18
  /**
@@ -22,6 +22,8 @@ type NavigationEntry = {
22
22
  */
23
23
  status?: NavigationStatus | null;
24
24
  active?: boolean;
25
+ /** Current container, independently of its active destination. `false` quiets this row; omitted keeps the default ink. */
26
+ context?: boolean;
25
27
  disabled?: boolean;
26
28
  color?: string;
27
29
  children?: readonly NavigationItem[];
@@ -10,6 +10,7 @@ export type ResizeSeparatorOptions = {
10
10
  collapseBelow?: number;
11
11
  onResize: (value: number) => void;
12
12
  onResizeEnd?: (value: number) => void;
13
+ onReset?: () => void;
13
14
  onCollapseIntent?: (armed: boolean) => void;
14
15
  onCollapse?: () => void;
15
16
  onDragChange?: (dragging: boolean) => void;
@@ -0,0 +1,6 @@
1
+ import type { JSX } from "solid-js";
2
+ export type SkeletonProps = {
3
+ class?: string;
4
+ };
5
+ /** Decorative loading geometry. The consumer owns dimensions and one accessible loading status. */
6
+ export declare function Skeleton(props: SkeletonProps): JSX.Element;
@@ -20,6 +20,7 @@ export type { ProgressRingProps, ProgressRingTone } from "./ProgressRing";
20
20
  export { ProgressRing } from "./ProgressRing";
21
21
  export type { ResourceCardProps, ResourceCardState } from "./ResourceCard";
22
22
  export { ResourceCard } from "./ResourceCard";
23
+ export { Skeleton, type SkeletonProps } from "./Skeleton";
23
24
  export type { StatCellAccent, StatCellProps, StatCellTone } from "./StatCell";
24
25
  export { StatCell } from "./StatCell";
25
26
  export type { StatGridAction, StatGridColumns, StatGridProps, StatGridSize, StatGridSurface, } from "./StatGrid";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k2b/ui",
3
- "version": "0.31.0",
3
+ "version": "0.32.0",
4
4
  "description": "Production-ready components for SolidJS applications.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -59,13 +59,13 @@
59
59
  "qr-scanner": "1.4.2"
60
60
  },
61
61
  "peerDependencies": {
62
- "@k2b/ssr": "^0.12.0 || ^0.13.0 || ^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0",
62
+ "@k2b/ssr": "^0.12.0 || ^0.13.0 || ^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^0.20.0",
63
63
  "solid-js": "^1.9.10"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@babel/core": "8.0.6",
67
67
  "@babel/preset-typescript": "8.0.1",
68
- "@k2b/ssr": "0.19.0",
68
+ "@k2b/ssr": "0.20.0",
69
69
  "@types/babel__core": "7.20.5",
70
70
  "@types/bun": "1.4.2",
71
71
  "axe-core": "4.11.0",
@@ -76,7 +76,7 @@
76
76
  "hono": "4.13.9",
77
77
  "playwright": "1.64.1",
78
78
  "seroval": "1.6.7",
79
- "solid-js": "1.9.15",
79
+ "solid-js": "1.9.17",
80
80
  "tailwindcss": "4.3.3",
81
81
  "typescript": "7.0.2",
82
82
  "@typescript/typescript6": "6.0.2",