pendentive 0.1.1

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 (113) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +88 -0
  3. package/dist/components/avatar/Avatar.d.ts +26 -0
  4. package/dist/components/badge/Badge.d.ts +25 -0
  5. package/dist/components/button/Button.d.ts +51 -0
  6. package/dist/components/button/ButtonGroup.d.ts +36 -0
  7. package/dist/components/checkbox/Checkbox.d.ts +34 -0
  8. package/dist/components/command/Command.d.ts +59 -0
  9. package/dist/components/data/List.d.ts +40 -0
  10. package/dist/components/data/Table.d.ts +37 -0
  11. package/dist/components/data/Tree.d.ts +36 -0
  12. package/dist/components/feedback/Alert.d.ts +29 -0
  13. package/dist/components/feedback/ProgressBar.d.ts +32 -0
  14. package/dist/components/feedback/Skeleton.d.ts +20 -0
  15. package/dist/components/feedback/Spinner.d.ts +20 -0
  16. package/dist/components/feedback/Toast.d.ts +30 -0
  17. package/dist/components/field/ColorField.d.ts +33 -0
  18. package/dist/components/field/NumberField.d.ts +42 -0
  19. package/dist/components/field/TextArea.d.ts +35 -0
  20. package/dist/components/field/TextField.d.ts +39 -0
  21. package/dist/components/field/shared.d.ts +9 -0
  22. package/dist/components/field/textInput.css.d.ts +5 -0
  23. package/dist/components/hovercard/HoverCard.d.ts +35 -0
  24. package/dist/components/input/ChipInput.d.ts +31 -0
  25. package/dist/components/input/DatePicker.d.ts +66 -0
  26. package/dist/components/input/FileDropzone.d.ts +26 -0
  27. package/dist/components/layout/Card.d.ts +24 -0
  28. package/dist/components/layout/Section.d.ts +33 -0
  29. package/dist/components/layout/Separator.d.ts +18 -0
  30. package/dist/components/misc/ModeCard.d.ts +35 -0
  31. package/dist/components/navigation/Accordion.d.ts +42 -0
  32. package/dist/components/navigation/Breadcrumb.d.ts +25 -0
  33. package/dist/components/navigation/Pagination.d.ts +30 -0
  34. package/dist/components/navigation/Tabs.d.ts +38 -0
  35. package/dist/components/overlay/AlertDialog.d.ts +37 -0
  36. package/dist/components/overlay/ContextMenu.d.ts +19 -0
  37. package/dist/components/overlay/Dialog.d.ts +38 -0
  38. package/dist/components/overlay/Drawer.d.ts +40 -0
  39. package/dist/components/overlay/DropdownMenu.d.ts +55 -0
  40. package/dist/components/overlay/Popover.d.ts +33 -0
  41. package/dist/components/radio/RadioGroup.d.ts +37 -0
  42. package/dist/components/select/Combobox.d.ts +42 -0
  43. package/dist/components/select/Select.d.ts +48 -0
  44. package/dist/components/slider/RangeSlider.d.ts +43 -0
  45. package/dist/components/slider/Slider.d.ts +41 -0
  46. package/dist/components/switch/Switch.d.ts +35 -0
  47. package/dist/components/toggle/Toggle.d.ts +39 -0
  48. package/dist/components/toggle/ToggleGroup.d.ts +47 -0
  49. package/dist/components/tooltip/Tooltip.d.ts +22 -0
  50. package/dist/core/classNames.d.ts +6 -0
  51. package/dist/core/content.d.ts +2 -0
  52. package/dist/core/controller.d.ts +34 -0
  53. package/dist/core/dom.d.ts +14 -0
  54. package/dist/core/overlay.d.ts +14 -0
  55. package/dist/core/styleInjector.d.ts +12 -0
  56. package/dist/core/theme.d.ts +18 -0
  57. package/dist/core/types.d.ts +10 -0
  58. package/dist/index.cjs +4054 -0
  59. package/dist/index.cjs.map +1 -0
  60. package/dist/index.d.ts +62 -0
  61. package/dist/index.js +3934 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/linteau.global.js +397 -0
  64. package/dist/linteau.global.js.map +7 -0
  65. package/dist/styles/tokens.d.ts +33 -0
  66. package/dist/svg/Icon.d.ts +19 -0
  67. package/dist/svg/create-icon.d.ts +13 -0
  68. package/dist/svg/icons/alertTriangle.d.ts +1 -0
  69. package/dist/svg/icons/bell.d.ts +1 -0
  70. package/dist/svg/icons/calendar.d.ts +1 -0
  71. package/dist/svg/icons/check.d.ts +1 -0
  72. package/dist/svg/icons/chevronDown.d.ts +1 -0
  73. package/dist/svg/icons/chevronLeft.d.ts +1 -0
  74. package/dist/svg/icons/chevronRight.d.ts +1 -0
  75. package/dist/svg/icons/chevronUp.d.ts +1 -0
  76. package/dist/svg/icons/circle.d.ts +1 -0
  77. package/dist/svg/icons/copy.d.ts +1 -0
  78. package/dist/svg/icons/download.d.ts +1 -0
  79. package/dist/svg/icons/edit.d.ts +1 -0
  80. package/dist/svg/icons/externalLink.d.ts +1 -0
  81. package/dist/svg/icons/eye.d.ts +1 -0
  82. package/dist/svg/icons/eyeOff.d.ts +1 -0
  83. package/dist/svg/icons/filter.d.ts +1 -0
  84. package/dist/svg/icons/heart.d.ts +1 -0
  85. package/dist/svg/icons/home.d.ts +1 -0
  86. package/dist/svg/icons/index.d.ts +54 -0
  87. package/dist/svg/icons/info.d.ts +1 -0
  88. package/dist/svg/icons/link.d.ts +1 -0
  89. package/dist/svg/icons/loader.d.ts +1 -0
  90. package/dist/svg/icons/lock.d.ts +1 -0
  91. package/dist/svg/icons/mail.d.ts +1 -0
  92. package/dist/svg/icons/menu.d.ts +1 -0
  93. package/dist/svg/icons/minus.d.ts +1 -0
  94. package/dist/svg/icons/moon.d.ts +1 -0
  95. package/dist/svg/icons/moreHorizontal.d.ts +1 -0
  96. package/dist/svg/icons/phone.d.ts +1 -0
  97. package/dist/svg/icons/plus.d.ts +1 -0
  98. package/dist/svg/icons/refreshCw.d.ts +1 -0
  99. package/dist/svg/icons/search.d.ts +1 -0
  100. package/dist/svg/icons/settings.d.ts +1 -0
  101. package/dist/svg/icons/star.d.ts +1 -0
  102. package/dist/svg/icons/sun.d.ts +1 -0
  103. package/dist/svg/icons/trash.d.ts +1 -0
  104. package/dist/svg/icons/upload.d.ts +1 -0
  105. package/dist/svg/icons/user.d.ts +1 -0
  106. package/dist/svg/icons/x.d.ts +1 -0
  107. package/dist/svg/index.cjs +380 -0
  108. package/dist/svg/index.cjs.map +1 -0
  109. package/dist/svg/index.d.ts +4 -0
  110. package/dist/svg/index.js +352 -0
  111. package/dist/svg/index.js.map +1 -0
  112. package/dist/svg/types.d.ts +26 -0
  113. package/package.json +81 -0
@@ -0,0 +1,42 @@
1
+ import type { IconInput } from '../../svg/types';
2
+ /** Options accepted by the `NumberField` factory. */
3
+ export interface NumberFieldOptions {
4
+ /** Label rendered above the input. */
5
+ label?: string;
6
+ /** Optional icon rendered before the label. */
7
+ icon?: IconInput;
8
+ /** Minimum allowed value. */
9
+ min?: number;
10
+ /** Maximum allowed value. */
11
+ max?: number;
12
+ /** Step increment used by the native spinner arrows. Defaults to `1`. */
13
+ step?: number;
14
+ /** Controlled value. */
15
+ value?: number;
16
+ /** Uncontrolled initial value, used only if `value` is omitted. Defaults to `0`. */
17
+ defaultValue?: number;
18
+ /** Disables the input. Defaults to `false`. */
19
+ disabled?: boolean;
20
+ /** Called on every valid numeric change. */
21
+ onChange?: (value: number) => void;
22
+ }
23
+ /** The runtime control surface attached to every `NumberField` element. */
24
+ export interface NumberFieldApi {
25
+ /** Returns the current numeric value. */
26
+ getValue: () => number;
27
+ /** Programmatically sets the value, clamped to `[min, max]` if provided. */
28
+ setValue: (value: number) => void;
29
+ /** Enables/disables the input. */
30
+ setDisabled: (disabled: boolean) => void;
31
+ /** Detaches the field from the DOM and its internal listener. */
32
+ destroy: () => void;
33
+ }
34
+ /** A `NumberField` is a real `HTMLDivElement` (the field wrapper) extended with `NumberFieldApi`. */
35
+ export type NumberFieldElement = HTMLDivElement & NumberFieldApi;
36
+ /**
37
+ * Creates a labeled numeric input, supporting controlled and uncontrolled usage.
38
+ *
39
+ * This component has no CSS of its own -- it's fully covered by the shared `field-base`
40
+ * and `text-input` blocks, so it registers those keys and nothing else.
41
+ */
42
+ export declare function NumberField(options?: NumberFieldOptions): NumberFieldElement;
@@ -0,0 +1,35 @@
1
+ import type { IconInput } from '../../svg/types';
2
+ /** Options accepted by the `TextArea` factory. */
3
+ export interface TextAreaOptions {
4
+ /** Label rendered above the textarea. */
5
+ label?: string;
6
+ /** Optional icon rendered before the label. */
7
+ icon?: IconInput;
8
+ /** Placeholder text. */
9
+ placeholder?: string;
10
+ /** Visible row count. Defaults to `3`. */
11
+ rows?: number;
12
+ /** Controlled value. */
13
+ value?: string;
14
+ /** Uncontrolled initial value, used only if `value` is omitted. */
15
+ defaultValue?: string;
16
+ /** Disables the textarea. Defaults to `false`. */
17
+ disabled?: boolean;
18
+ /** Called on every keystroke with the new value. */
19
+ onChange?: (value: string) => void;
20
+ }
21
+ /** The runtime control surface attached to every `TextArea` element. */
22
+ export interface TextAreaApi {
23
+ /** Returns the current value. */
24
+ getValue: () => string;
25
+ /** Programmatically sets the value (does not trigger `onChange`). */
26
+ setValue: (value: string) => void;
27
+ /** Enables/disables the textarea. */
28
+ setDisabled: (disabled: boolean) => void;
29
+ /** Detaches the field from the DOM and its internal listener. */
30
+ destroy: () => void;
31
+ }
32
+ /** A `TextArea` is a real `HTMLDivElement` (the field wrapper) extended with `TextAreaApi`. */
33
+ export type TextAreaElement = HTMLDivElement & TextAreaApi;
34
+ /** Creates a labeled multi-line text input, supporting controlled and uncontrolled usage. */
35
+ export declare function TextArea(options?: TextAreaOptions): TextAreaElement;
@@ -0,0 +1,39 @@
1
+ import type { IconInput } from '../../svg/types';
2
+ /** Options accepted by the `TextField` factory. */
3
+ export interface TextFieldOptions {
4
+ /** Label rendered above the input. */
5
+ label?: string;
6
+ /** Optional icon rendered before the label. */
7
+ icon?: IconInput;
8
+ /** Native input type. Defaults to `'text'`. */
9
+ type?: 'text' | 'email' | 'password' | 'search' | 'tel' | 'url';
10
+ /** Placeholder text. */
11
+ placeholder?: string;
12
+ /** Controlled value. When provided together with `onChange`, you own the state. */
13
+ value?: string;
14
+ /** Uncontrolled initial value, used only if `value` is omitted. */
15
+ defaultValue?: string;
16
+ /** Disables the input. Defaults to `false`. */
17
+ disabled?: boolean;
18
+ /** Called on every keystroke with the new value. */
19
+ onChange?: (value: string) => void;
20
+ /** Called when Enter is pressed. */
21
+ onEnter?: (value: string) => void;
22
+ }
23
+ /** The runtime control surface attached to every `TextField` element. */
24
+ export interface TextFieldApi {
25
+ /** Returns the current input value. */
26
+ getValue: () => string;
27
+ /** Programmatically sets the value (does not trigger `onChange`). */
28
+ setValue: (value: string) => void;
29
+ /** Enables/disables the input. */
30
+ setDisabled: (disabled: boolean) => void;
31
+ /** Focuses the underlying input. */
32
+ focus: () => void;
33
+ /** Detaches the field from the DOM and its internal listeners. */
34
+ destroy: () => void;
35
+ }
36
+ /** A `TextField` is a real `HTMLDivElement` (the field wrapper) extended with `TextFieldApi`. */
37
+ export type TextFieldElement = HTMLDivElement & TextFieldApi;
38
+ /** Creates a labeled single-line text input, supporting controlled and uncontrolled usage. */
39
+ export declare function TextField(options?: TextFieldOptions): TextFieldElement;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CSS shared by every labeled field-style component (TextField, TextArea, NumberField,
3
+ * ColorField, ChipInput, DatePicker, Select, Combobox, Slider, RangeSlider, Switch).
4
+ *
5
+ * Every one of those calls `ensureComponentStyles('field-base', fieldBaseCss)` before its
6
+ * own specific CSS -- the key dedupes, so this is injected once no matter how many
7
+ * field-style components an app uses.
8
+ */
9
+ export declare const fieldBaseCss = "\n.linteau-field { display: flex; flex-direction: column; gap: 6px; width: 100% }\n.linteau-field-row { display: flex; align-items: center; justify-content: space-between }\n.linteau-field-label { display: flex; align-items: center; gap: 6px; color: var(--linteau-foreground) }\n.linteau-field-value { color: var(--linteau-muted-foreground); font-variant-numeric: tabular-nums }\n.linteau-field-header { display: flex; justify-content: space-between; align-items: center; font-size: 12px }\n";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CSS shared by every plain text-style input (TextField, TextArea, NumberField, and the
3
+ * text inputs inside Combobox/DatePicker). Registered under the `text-input` key.
4
+ */
5
+ export declare const textInputCss = "\n.linteau-text-input, .linteau-textarea {\n width: 100%;\n background: var(--linteau-secondary);\n color: var(--linteau-foreground);\n border: 1px solid var(--linteau-border);\n border-radius: var(--linteau-radius-sm);\n padding: 8px 10px;\n font-size: 12px;\n font-family: inherit;\n transition: border-color 120ms ease;\n}\n.linteau-text-input:focus, .linteau-textarea:focus {\n outline: none;\n border-color: var(--linteau-ring);\n box-shadow: 0 0 0 2px color-mix(in oklch, var(--linteau-ring) 20%, transparent);\n}\n.linteau-text-input:disabled, .linteau-textarea:disabled { opacity: 0.5; cursor: not-allowed }\n.linteau-textarea { resize: vertical; min-height: 72px }\n";
@@ -0,0 +1,35 @@
1
+ import type { FloatingPlacement } from '../../core/overlay';
2
+ import type { Destroyable } from '../../core/types';
3
+ /** Options accepted by the `HoverCard` factory. */
4
+ export interface HoverCardOptions {
5
+ /** The element that triggers the card on hover/focus. */
6
+ anchor: HTMLElement;
7
+ /** Initial card content -- can hold interactive elements, unlike `Tooltip`. */
8
+ content: HTMLElement | string;
9
+ /** Side of the anchor the card appears on. Defaults to `'bottom'`. */
10
+ placement?: FloatingPlacement;
11
+ /** Milliseconds to wait before showing, after hover/focus starts. Defaults to `300`. */
12
+ openDelay?: number;
13
+ /** Milliseconds to wait before hiding, after the pointer leaves both the anchor and the card. Defaults to `150`. */
14
+ closeDelay?: number;
15
+ }
16
+ /**
17
+ * The runtime control surface returned by `HoverCard`. Like `Tooltip`, this is a plain
18
+ * controller -- not an element -- since it attaches behavior to an existing anchor.
19
+ */
20
+ export interface HoverCardApi extends Destroyable {
21
+ /** Replaces the card's content. */
22
+ setContent: (content: HTMLElement | string) => void;
23
+ /** Opens the card immediately, bypassing `openDelay`. */
24
+ open: () => void;
25
+ /** Closes the card immediately, bypassing `closeDelay`. */
26
+ close: () => void;
27
+ }
28
+ /** This component's own CSS, colocated and self-injected on first use. */
29
+ export declare const hoverCardCss = "\n.linteau-hover-card { position: fixed; z-index: 1200; width: 280px; background: var(--linteau-card); border: 1px solid var(--linteau-border); border-radius: var(--linteau-radius-md); padding: 12px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4); font-size: 12px; color: var(--linteau-foreground) }\n";
30
+ /**
31
+ * Attaches a floating rich-content card to `anchor`, shown on hover/focus with a delay in
32
+ * each direction. Unlike `Tooltip`, the card stays open while the pointer moves into it --
33
+ * so it can safely contain links, buttons, or other interactive content.
34
+ */
35
+ export declare function HoverCard(options: HoverCardOptions): HoverCardApi;
@@ -0,0 +1,31 @@
1
+ import type { IconInput } from '../../svg/types';
2
+ /** Options accepted by the `ChipInput` factory. */
3
+ export interface ChipInputOptions {
4
+ /** Label rendered above the field. */
5
+ label?: string;
6
+ /** Optional icon rendered before the label. */
7
+ icon?: IconInput;
8
+ /** Controlled list of chip values. */
9
+ value?: string[];
10
+ /** Uncontrolled initial values, used only if `value` is omitted. */
11
+ defaultValue?: string[];
12
+ /** Placeholder shown in the text input. */
13
+ placeholder?: string;
14
+ /** Called whenever a chip is added or removed. */
15
+ onChange?: (value: string[]) => void;
16
+ }
17
+ /** The runtime control surface attached to every `ChipInput` element. */
18
+ export interface ChipInputApi {
19
+ /** Returns the current list of chip values. */
20
+ getValue: () => string[];
21
+ /** Programmatically replaces the chip list (does not trigger `onChange`). */
22
+ setValue: (value: string[]) => void;
23
+ /** Detaches the field from the DOM and its internal listeners. */
24
+ destroy: () => void;
25
+ }
26
+ /** A `ChipInput` is a real `HTMLDivElement` (the field wrapper) extended with `ChipInputApi`. */
27
+ export type ChipInputElement = HTMLDivElement & ChipInputApi;
28
+ /** This component's own CSS, colocated and self-injected on first use. */
29
+ export declare const chipInputCss = "\n.linteau-chip-field { display: flex; flex-wrap: wrap; gap: 6px; padding: 6px; background: var(--linteau-secondary); border: 1px solid var(--linteau-border); border-radius: var(--linteau-radius-sm) }\n.linteau-chip-field:focus-within { border-color: var(--linteau-ring) }\n.linteau-chip { display: inline-flex; align-items: center; gap: 4px; background: var(--linteau-accent); color: var(--linteau-accent-foreground); border-radius: 999px; padding: 3px 8px; font-size: 11px }\n.linteau-chip-remove { background: transparent; border: none; color: inherit; cursor: pointer; display: flex; padding: 0 }\n.linteau-chip-input { flex: 1; min-width: 80px; background: transparent; border: none; color: var(--linteau-foreground); font-size: 12px; font-family: inherit; outline: none }\n";
30
+ /** Creates a labeled tag/chip input: press Enter to add the typed text as a removable chip. */
31
+ export declare function ChipInput(options?: ChipInputOptions): ChipInputElement;
@@ -0,0 +1,66 @@
1
+ import type { IconInput } from '../../svg/types';
2
+ /** Which single day of the week a calendar week starts on. `0` = Sunday, `1` = Monday. */
3
+ export type WeekStartsOn = 0 | 1;
4
+ /** A `from`/`to` date pair used when `mode` is `'range'`. `to` is `undefined` while the second endpoint hasn't been picked yet. */
5
+ export interface DateRange {
6
+ /** The earlier bound of the range. */
7
+ from: Date;
8
+ /** The later bound of the range, or `undefined` mid-selection. */
9
+ to?: Date;
10
+ }
11
+ /** Options accepted by the `DatePicker` factory. */
12
+ export interface DatePickerOptions {
13
+ /** Label rendered above the field. */
14
+ label?: string;
15
+ /** Optional icon rendered before the label. */
16
+ icon?: IconInput;
17
+ /** `'single'` picks one date; `'range'` picks a `from`/`to` pair. Defaults to `'single'`. */
18
+ mode?: 'single' | 'range';
19
+ /** Controlled selected value -- a `Date` in `'single'` mode, a `DateRange` in `'range'` mode. */
20
+ value?: Date | DateRange;
21
+ /** Uncontrolled initial value, used only if `value` is omitted. */
22
+ defaultValue?: Date | DateRange;
23
+ /** Earliest selectable date, inclusive. */
24
+ min?: Date;
25
+ /** Latest selectable date, inclusive. */
26
+ max?: Date;
27
+ /** Which day starts each calendar week. Defaults to `0` (Sunday). */
28
+ weekStartsOn?: WeekStartsOn;
29
+ /** Formats a single date for display. Defaults to `Date.prototype.toLocaleDateString`. */
30
+ format?: (date: Date) => string;
31
+ /** Placeholder shown when nothing is selected. Defaults to `'Select a date'` (or `'Select a date range'` in range mode). */
32
+ placeholder?: string;
33
+ /** Disables the whole field. Defaults to `false`. */
34
+ disabled?: boolean;
35
+ /** Shows a "Today" quick-jump button in the footer. Defaults to `true`. */
36
+ showTodayButton?: boolean;
37
+ /** Shows a "Clear" button in the footer once a value is selected. Defaults to `true`. */
38
+ showClearButton?: boolean;
39
+ /** Called whenever the selection changes (including clears, which pass `undefined`). */
40
+ onChange?: (value: Date | DateRange | undefined) => void;
41
+ }
42
+ /** The runtime control surface attached to every `DatePicker` element. */
43
+ export interface DatePickerApi {
44
+ /** Returns the currently selected value, if any. */
45
+ getValue: () => Date | DateRange | undefined;
46
+ /** Programmatically sets the value (does not trigger `onChange`). */
47
+ setValue: (value: Date | DateRange | undefined) => void;
48
+ /** Opens the calendar popover. */
49
+ open: () => void;
50
+ /** Closes the calendar popover. */
51
+ close: () => void;
52
+ /** Returns whether the calendar popover is currently open. */
53
+ isOpen: () => boolean;
54
+ /** Detaches the field from the DOM and its internal listeners. */
55
+ destroy: () => void;
56
+ }
57
+ /** A `DatePicker` is a real `HTMLDivElement` (the field wrapper) extended with `DatePickerApi`. */
58
+ export type DatePickerElement = HTMLDivElement & DatePickerApi;
59
+ /** This component's own CSS -- the calendar popover, weekday header, range highlighting, and footer actions. Depends on `.linteau-combobox` (registered via the imported `comboboxCss`). */
60
+ export declare const calendarCss = "\n.linteau-calendar { position: fixed; z-index: 1200; width: 280px; background: var(--linteau-card); border: 1px solid var(--linteau-border); border-radius: var(--linteau-radius-lg); padding: 10px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4) }\n.linteau-calendar-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px }\n.linteau-calendar-nav { background: transparent; border: none; color: var(--linteau-foreground); cursor: pointer; display: flex; padding: 4px; border-radius: var(--linteau-radius-sm) }\n.linteau-calendar-nav:hover:not(:disabled) { background: var(--linteau-accent) }\n.linteau-calendar-nav:disabled { opacity: 0.35; cursor: not-allowed }\n.linteau-calendar-month { font-size: 12px; font-weight: 600 }\n.linteau-calendar-weekdays { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; margin-bottom: 2px }\n.linteau-calendar-weekday { height: 20px; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 600; color: var(--linteau-muted-foreground); text-transform: uppercase }\n.linteau-calendar-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px }\n.linteau-calendar-day { height: 28px; display: flex; align-items: center; justify-content: center; font-size: 11px; border-radius: var(--linteau-radius-sm); background: transparent; border: none; color: var(--linteau-foreground); cursor: pointer; font-family: inherit }\n.linteau-calendar-day:hover:not(:disabled) { background: var(--linteau-accent) }\n.linteau-calendar-day:disabled { opacity: 0.35; cursor: not-allowed }\n.linteau-calendar-day:focus-visible { outline: 2px solid var(--linteau-ring); outline-offset: 1px }\n.linteau-calendar-day-outside { opacity: 0.35 }\n.linteau-calendar-day-selected { background: var(--linteau-primary); color: var(--linteau-primary-foreground) }\n.linteau-calendar-day-today:not(.linteau-calendar-day-selected) { box-shadow: inset 0 0 0 1px var(--linteau-ring) }\n.linteau-calendar-day-in-range { background: var(--linteau-accent); border-radius: 0 }\n.linteau-calendar-day-range-start { background: var(--linteau-primary); color: var(--linteau-primary-foreground); border-radius: var(--linteau-radius-sm) 0 0 var(--linteau-radius-sm) }\n.linteau-calendar-day-range-end { background: var(--linteau-primary); color: var(--linteau-primary-foreground); border-radius: 0 var(--linteau-radius-sm) var(--linteau-radius-sm) 0 }\n.linteau-calendar-footer { display: flex; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--linteau-border) }\n.linteau-calendar-footer-button { flex: 1; padding: 6px 8px; font-size: 11px; border-radius: var(--linteau-radius-sm); border: 1px solid var(--linteau-border); background: transparent; color: var(--linteau-foreground); cursor: pointer; font-family: inherit }\n.linteau-calendar-footer-button:hover { background: var(--linteau-accent) }\n.linteau-combobox-input-clearable { padding-right: 46px }\n.linteau-combobox-clear { position: absolute; right: 26px; color: var(--linteau-muted-foreground); background: transparent; border: none; cursor: pointer; display: flex; padding: 2px }\n.linteau-combobox-clear:hover { color: var(--linteau-foreground) }\n";
61
+ /**
62
+ * Creates a labeled date (or date-range) field backed by a floating month-grid calendar
63
+ * popover with weekday headers, outside-month days, range selection with hover preview,
64
+ * full keyboard navigation, and Today/Clear quick actions.
65
+ */
66
+ export declare function DatePicker(options?: DatePickerOptions): DatePickerElement;
@@ -0,0 +1,26 @@
1
+ /** Options accepted by the `FileDropzone` factory. */
2
+ export interface FileDropzoneOptions {
3
+ /** Label text shown inside the drop area. Defaults to `'Drop files here or click to browse'`. */
4
+ label?: string;
5
+ /** Comma-separated MIME types/extensions passed to the underlying file input. */
6
+ accept?: string;
7
+ /** Allows selecting multiple files. Defaults to `false`. */
8
+ multiple?: boolean;
9
+ /** Disables interaction. Defaults to `false`. */
10
+ disabled?: boolean;
11
+ /** Called with the selected/dropped files. */
12
+ onFiles: (files: File[]) => void;
13
+ }
14
+ /** The runtime control surface attached to every `FileDropzone` element. */
15
+ export interface FileDropzoneApi {
16
+ /** Clears the underlying file input's selection. */
17
+ reset: () => void;
18
+ /** Detaches the dropzone from the DOM and its internal listeners. */
19
+ destroy: () => void;
20
+ }
21
+ /** A `FileDropzone` is a real `HTMLDivElement` extended with `FileDropzoneApi`. */
22
+ export type FileDropzoneElement = HTMLDivElement & FileDropzoneApi;
23
+ /** This component's own CSS, colocated and self-injected on first use. */
24
+ export declare const dropzoneCss = "\n.linteau-dropzone { border: 1px dashed var(--linteau-border); border-radius: var(--linteau-radius-lg); padding: 24px; display: flex; flex-direction: column; align-items: center; gap: 8px; text-align: center; cursor: pointer; color: var(--linteau-muted-foreground); transition: border-color 120ms ease, background 120ms ease }\n.linteau-dropzone:hover, .linteau-dropzone-active { border-color: var(--linteau-ring); background: var(--linteau-accent) }\n.linteau-dropzone-disabled { opacity: 0.5; cursor: not-allowed }\n.linteau-dropzone-label { font-size: 12px }\n";
25
+ /** Creates a drag-and-drop file upload zone with a click-to-browse fallback. */
26
+ export declare function FileDropzone(options: FileDropzoneOptions): FileDropzoneElement;
@@ -0,0 +1,24 @@
1
+ /** Options accepted by the `Card` factory. All slots are optional. */
2
+ export interface CardOptions {
3
+ /** Content rendered in the header slot (a border-separated top strip). */
4
+ header?: HTMLElement | string;
5
+ /** Content rendered in the footer slot (a border-separated bottom strip). */
6
+ footer?: HTMLElement | string;
7
+ }
8
+ /** The runtime control surface attached to every `Card` element. */
9
+ export interface CardApi {
10
+ /** The main content container -- append anything here. */
11
+ body: HTMLElement;
12
+ /** Replaces the header slot content (pass `null` to remove it). */
13
+ setHeader: (content: HTMLElement | string | null) => void;
14
+ /** Replaces the footer slot content (pass `null` to remove it). */
15
+ setFooter: (content: HTMLElement | string | null) => void;
16
+ /** Detaches the card from the DOM. */
17
+ destroy: () => void;
18
+ }
19
+ /** A `Card` is a real `HTMLDivElement` extended with `CardApi`. */
20
+ export type CardElement = HTMLDivElement & CardApi;
21
+ /** This component's own CSS, colocated and self-injected on first use. */
22
+ export declare const cardCss = "\n.linteau-card { border: 1px solid var(--linteau-border); border-radius: var(--linteau-radius-lg); background: var(--linteau-card); color: var(--linteau-card-foreground); overflow: hidden }\n.linteau-card-header { padding: 14px 16px; border-bottom: 1px solid var(--linteau-border); font-weight: 600 }\n.linteau-card-body { padding: 16px }\n.linteau-card-footer { padding: 12px 16px; border-top: 1px solid var(--linteau-border) }\n";
23
+ /** Creates a bordered, sectioned surface with optional header/footer slots and a body you fill freely. */
24
+ export declare function Card(options?: CardOptions): CardElement;
@@ -0,0 +1,33 @@
1
+ import type { IconInput } from '../../svg/types';
2
+ /** Options accepted by the `Section` factory. */
3
+ export interface SectionOptions {
4
+ /** Optional icon rendered before the title. */
5
+ icon?: IconInput;
6
+ /** When `true`, the header becomes clickable and toggles the body. Defaults to `false`. */
7
+ collapsible?: boolean;
8
+ /** Initial collapsed state when `collapsible` is `true`. Defaults to `false`. */
9
+ defaultCollapsed?: boolean;
10
+ /** Extra elements (e.g. buttons) rendered on the right side of the header. */
11
+ actions?: HTMLElement[];
12
+ }
13
+ /** The runtime control surface attached to every `Section` element. */
14
+ export interface SectionApi {
15
+ /** The header element, exposed for advanced customization. */
16
+ header: HTMLElement;
17
+ /** The body container -- append your fields/content here. */
18
+ body: HTMLElement;
19
+ /** Updates the section title text. */
20
+ setTitle: (title: string) => void;
21
+ /** Programmatically collapses/expands the section (only relevant when `collapsible`). */
22
+ setCollapsed: (collapsed: boolean) => void;
23
+ /** Returns whether the section is currently collapsed. */
24
+ isCollapsed: () => boolean;
25
+ /** Detaches the section from the DOM and its internal listeners. */
26
+ destroy: () => void;
27
+ }
28
+ /** A `Section` is a real `HTMLDivElement` extended with `SectionApi`. */
29
+ export type SectionElement = HTMLDivElement & SectionApi;
30
+ /** This component's own CSS, colocated and self-injected on first use. */
31
+ export declare const sectionCss = "\n.linteau-section { border: 1px solid var(--linteau-border); border-radius: var(--linteau-radius-lg); background: var(--linteau-muted); overflow: hidden; width: 100% }\n.linteau-section-header { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--linteau-border); color: var(--linteau-muted-foreground); cursor: default }\n.linteau-section-header.linteau-section-collapsible { cursor: pointer }\n.linteau-section-header h3 { margin: 0; font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; font-weight: 600; flex: 1 }\n.linteau-section-actions { display: flex; align-items: center; gap: 6px }\n.linteau-section-body { padding: 12px; display: flex; flex-direction: column; gap: 12px }\n.linteau-section-body.linteau-collapsed { display: none }\n.linteau-section-chevron { transition: transform 150ms ease }\n.linteau-section-chevron.linteau-collapsed { transform: rotate(-90deg) }\n";
32
+ /** Creates a titled, bordered container -- the primary layout grouping primitive of the library. */
33
+ export declare function Section(title: string, options?: SectionOptions): SectionElement;
@@ -0,0 +1,18 @@
1
+ /** Options accepted by the `Separator` factory. */
2
+ export interface SeparatorOptions {
3
+ /** Layout direction. Defaults to `'horizontal'`. */
4
+ orientation?: 'horizontal' | 'vertical';
5
+ }
6
+ /** The runtime control surface attached to every `Separator` element. */
7
+ export interface SeparatorApi {
8
+ /** Switches orientation, updating classes in place. */
9
+ setOrientation: (orientation: 'horizontal' | 'vertical') => void;
10
+ /** Detaches the separator from the DOM. */
11
+ destroy: () => void;
12
+ }
13
+ /** A `Separator` is a real `HTMLHRElement` extended with `SeparatorApi`. */
14
+ export type SeparatorElement = HTMLHRElement & SeparatorApi;
15
+ /** This component's own CSS, colocated and self-injected on first use. */
16
+ export declare const separatorCss = "\n.linteau-separator { background: var(--linteau-border); border: none; flex-shrink: 0 }\n.linteau-separator-horizontal { width: 100%; height: 1px }\n.linteau-separator-vertical { width: 1px; height: 100% }\n";
17
+ /** Creates a thin dividing line, horizontal or vertical. */
18
+ export declare function Separator(options?: SeparatorOptions): SeparatorElement;
@@ -0,0 +1,35 @@
1
+ import type { IconInput } from '../../svg/types';
2
+ /** Options accepted by the `ModeCard` factory. */
3
+ export interface ModeCardOptions {
4
+ /** Title text. */
5
+ label: string;
6
+ /** Description text, hidden and replaced by a lock message when `locked` is `true`. */
7
+ description: string;
8
+ /** Icon shown at the top of the card (replaced by a lock icon when `locked`). */
9
+ icon: IconInput;
10
+ /** Disables selection and shows a lock icon/message. Defaults to `false`. */
11
+ locked?: boolean;
12
+ /** Message shown instead of `description` when locked. Defaults to `'Coming in the next update'`. */
13
+ lockedMessage?: string;
14
+ /** Initial selected visual state. Defaults to `false`. */
15
+ selected?: boolean;
16
+ /** Called when the (unlocked) card is clicked. */
17
+ onSelect?: () => void;
18
+ }
19
+ /** The runtime control surface attached to every `ModeCard` element. */
20
+ export interface ModeCardApi {
21
+ /** Returns whether the card is currently marked as selected. */
22
+ isSelected: () => boolean;
23
+ /** Programmatically toggles the selected visual state. */
24
+ setSelected: (selected: boolean) => void;
25
+ /** Programmatically locks/unlocks the card. */
26
+ setLocked: (locked: boolean) => void;
27
+ /** Detaches the card from the DOM and its internal listener. */
28
+ destroy: () => void;
29
+ }
30
+ /** A `ModeCard` is a real `HTMLButtonElement` extended with `ModeCardApi`. */
31
+ export type ModeCardElement = HTMLButtonElement & ModeCardApi;
32
+ /** This component's own CSS, colocated and self-injected on first use. */
33
+ export declare const modeCardCss = "\n.linteau-mode-card { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; padding: 14px; background: var(--linteau-card); border: 1px solid var(--linteau-border); border-radius: var(--linteau-radius-lg); color: var(--linteau-foreground); cursor: pointer; text-align: left; font-family: inherit; transition: border-color 120ms ease, transform 120ms ease }\n.linteau-mode-card:hover:not(.linteau-locked) { border-color: var(--linteau-ring); transform: translateY(-2px) }\n.linteau-mode-card.linteau-selected { border-color: var(--linteau-primary); box-shadow: 0 0 0 1px var(--linteau-primary) }\n.linteau-mode-card.linteau-locked { opacity: 0.45; cursor: not-allowed }\n.linteau-mode-card-icon { color: var(--linteau-foreground) }\n.linteau-mode-card-title { font-weight: 600; font-size: 13px }\n.linteau-mode-card-description { font-size: 11px; color: var(--linteau-muted-foreground) }\n";
34
+ /** Creates a selectable, optionally lockable option card -- typically used in mode/menu pickers. */
35
+ export declare function ModeCard(options: ModeCardOptions): ModeCardElement;
@@ -0,0 +1,42 @@
1
+ import type { IconInput } from '../../svg/types';
2
+ /** A single collapsible section within an `Accordion`. */
3
+ export interface AccordionItem {
4
+ /** Visible header label. */
5
+ label: string;
6
+ /** Unique value identifying this section. */
7
+ value: string;
8
+ /** Optional icon rendered before the label. */
9
+ icon?: IconInput;
10
+ /** Content revealed when this section is open. */
11
+ content: HTMLElement;
12
+ }
13
+ /** Options accepted by the `Accordion` factory. */
14
+ export interface AccordionOptions {
15
+ /** The sections to render. */
16
+ items: AccordionItem[];
17
+ /** Allows more than one section open at once. Defaults to `false`. */
18
+ multiple?: boolean;
19
+ /** Values open by default. */
20
+ defaultOpen?: string[];
21
+ /** Called whenever the set of open sections changes. */
22
+ onChange?: (openValues: string[]) => void;
23
+ }
24
+ /** The runtime control surface attached to every `Accordion` element. */
25
+ export interface AccordionApi {
26
+ /** Returns the values of currently open sections. */
27
+ getOpen: () => string[];
28
+ /** Opens a section by value. */
29
+ open: (value: string) => void;
30
+ /** Closes a section by value. */
31
+ close: (value: string) => void;
32
+ /** Toggles a section by value. */
33
+ toggle: (value: string) => void;
34
+ /** Detaches the accordion from the DOM and its internal listeners. */
35
+ destroy: () => void;
36
+ }
37
+ /** An `Accordion` is a real `HTMLDivElement` extended with `AccordionApi`. */
38
+ export type AccordionElement = HTMLDivElement & AccordionApi;
39
+ /** This component's own CSS, colocated and self-injected on first use. */
40
+ export declare const accordionCss = "\n.linteau-accordion { display: flex; flex-direction: column; gap: 8px; width: 100% }\n.linteau-accordion-item { border: 1px solid var(--linteau-border); border-radius: var(--linteau-radius-lg); overflow: hidden }\n.linteau-accordion-header { display: flex; align-items: center; gap: 8px; width: 100%; padding: 12px; background: var(--linteau-muted); border: none; cursor: pointer; font-size: 13px; font-weight: 500; color: var(--linteau-foreground); font-family: inherit }\n.linteau-accordion-chevron { margin-left: auto; transition: transform 150ms ease }\n.linteau-accordion-chevron.linteau-open { transform: rotate(180deg) }\n.linteau-accordion-content { padding: 12px }\n.linteau-accordion-content.linteau-collapsed { display: none }\n";
41
+ /** Creates a set of collapsible sections, single- or multi-open. */
42
+ export declare function Accordion(options: AccordionOptions): AccordionElement;
@@ -0,0 +1,25 @@
1
+ /** A single crumb in a `Breadcrumb`. The last item in the list is rendered as the non-interactive current page. */
2
+ export interface BreadcrumbItem {
3
+ /** Visible label. */
4
+ label: string;
5
+ /** Called when the crumb is clicked (ignored for the last/current item). */
6
+ onClick?: () => void;
7
+ }
8
+ /** Options accepted by the `Breadcrumb` factory. */
9
+ export interface BreadcrumbOptions {
10
+ /** The trail of crumbs, in order from root to current page. */
11
+ items: BreadcrumbItem[];
12
+ }
13
+ /** The runtime control surface attached to every `Breadcrumb` element. */
14
+ export interface BreadcrumbApi {
15
+ /** Replaces the full trail. */
16
+ setItems: (items: BreadcrumbItem[]) => void;
17
+ /** Detaches the breadcrumb from the DOM and its internal listeners. */
18
+ destroy: () => void;
19
+ }
20
+ /** A `Breadcrumb` is a real `HTMLElement` (`<nav>`) extended with `BreadcrumbApi`. */
21
+ export type BreadcrumbElement = HTMLElement & BreadcrumbApi;
22
+ /** This component's own CSS, colocated and self-injected on first use. */
23
+ export declare const breadcrumbCss = "\n.linteau-breadcrumb { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--linteau-muted-foreground) }\n.linteau-breadcrumb-item { background: transparent; border: none; color: var(--linteau-muted-foreground); cursor: pointer; font: inherit; padding: 0 }\n.linteau-breadcrumb-item:hover { color: var(--linteau-foreground) }\n.linteau-breadcrumb-current { color: var(--linteau-foreground); font-weight: 500 }\n";
24
+ /** Creates a navigational trail of crumbs separated by chevrons. */
25
+ export declare function Breadcrumb(options: BreadcrumbOptions): BreadcrumbElement;
@@ -0,0 +1,30 @@
1
+ /** Options accepted by the `Pagination` factory. */
2
+ export interface PaginationOptions {
3
+ /** Controlled current page (1-indexed). */
4
+ page?: number;
5
+ /** Uncontrolled initial page, used only if `page` is omitted. Defaults to `1`. */
6
+ defaultPage?: number;
7
+ /** Total number of pages. */
8
+ pageCount: number;
9
+ /** Page buttons shown on each side of the current page before collapsing into an ellipsis. Defaults to `1`. */
10
+ siblingCount?: number;
11
+ /** Called whenever the user navigates to a new page. */
12
+ onChange?: (page: number) => void;
13
+ }
14
+ /** The runtime control surface attached to every `Pagination` element. */
15
+ export interface PaginationApi {
16
+ /** Returns the current page. */
17
+ getPage: () => number;
18
+ /** Programmatically navigates to a page (does not trigger `onChange`). */
19
+ setPage: (page: number) => void;
20
+ /** Updates the total page count and re-renders. */
21
+ setPageCount: (pageCount: number) => void;
22
+ /** Detaches the control from the DOM and its internal listeners. */
23
+ destroy: () => void;
24
+ }
25
+ /** A `Pagination` is a real `HTMLDivElement` extended with `PaginationApi`. */
26
+ export type PaginationElement = HTMLDivElement & PaginationApi;
27
+ /** This component's own CSS, colocated and self-injected on first use. */
28
+ export declare const paginationCss = "\n.linteau-pagination { display: flex; align-items: center; gap: 4px }\n.linteau-pagination-item { min-width: 28px; height: 28px; padding: 0 6px; display: flex; align-items: center; justify-content: center; border-radius: var(--linteau-radius-sm); border: 1px solid transparent; background: transparent; color: var(--linteau-muted-foreground); font-size: 12px; cursor: pointer; font-family: inherit }\n.linteau-pagination-item:hover:not(:disabled) { background: var(--linteau-accent) }\n.linteau-pagination-item:disabled { opacity: 0.4; cursor: not-allowed }\n.linteau-pagination-item-active { background: var(--linteau-primary); color: var(--linteau-primary-foreground) }\n.linteau-pagination-ellipsis { color: var(--linteau-muted-foreground); padding: 0 4px }\n";
29
+ /** Creates a page-number navigator with previous/next controls and smart ellipsis collapsing. */
30
+ export declare function Pagination(options: PaginationOptions): PaginationElement;
@@ -0,0 +1,38 @@
1
+ import type { IconInput } from '../../svg/types';
2
+ /** A single tab: its trigger label/icon and the panel content it reveals. */
3
+ export interface TabItem {
4
+ /** Visible trigger label. */
5
+ label: string;
6
+ /** Unique value identifying this tab. */
7
+ value: string;
8
+ /** Optional icon rendered before the label. */
9
+ icon?: IconInput;
10
+ /** Content shown in the panel while this tab is active. */
11
+ content: HTMLElement;
12
+ }
13
+ /** Options accepted by the `Tabs` factory. */
14
+ export interface TabsOptions {
15
+ /** The tabs to render. */
16
+ items: TabItem[];
17
+ /** Controlled active value. */
18
+ value?: string;
19
+ /** Uncontrolled initial value, used only if `value` is omitted. Defaults to the first item. */
20
+ defaultValue?: string;
21
+ /** Called whenever the active tab changes. */
22
+ onChange?: (value: string) => void;
23
+ }
24
+ /** The runtime control surface attached to every `Tabs` element. */
25
+ export interface TabsApi {
26
+ /** Returns the currently active tab's value. */
27
+ getValue: () => string;
28
+ /** Programmatically activates a tab (does not trigger `onChange`). */
29
+ setValue: (value: string) => void;
30
+ /** Detaches the tabs from the DOM and their internal listeners. */
31
+ destroy: () => void;
32
+ }
33
+ /** A `Tabs` is a real `HTMLDivElement` extended with `TabsApi`. */
34
+ export type TabsElement = HTMLDivElement & TabsApi;
35
+ /** This component's own CSS, colocated and self-injected on first use. */
36
+ export declare const tabsCss = "\n.linteau-tabs { display: flex; flex-direction: column; gap: 12px; width: 100% }\n.linteau-tabs-list { display: flex; gap: 4px; border-bottom: 1px solid var(--linteau-border) }\n.linteau-tabs-trigger { background: transparent; border: none; border-bottom: 2px solid transparent; padding: 8px 12px; font-size: 12px; font-weight: 500; color: var(--linteau-muted-foreground); cursor: pointer; display: flex; align-items: center; gap: 6px; font-family: inherit }\n.linteau-tabs-trigger:hover { color: var(--linteau-foreground) }\n.linteau-tabs-trigger-active { color: var(--linteau-foreground); border-bottom-color: var(--linteau-primary) }\n.linteau-tabs-panel { width: 100% }\n";
37
+ /** Creates a tabbed container: a trigger list plus a panel that swaps content per active tab. */
38
+ export declare function Tabs(options: TabsOptions): TabsElement;
@@ -0,0 +1,37 @@
1
+ import type { Destroyable } from '../../core/types';
2
+ /** Options accepted by the `AlertDialog` factory. */
3
+ export interface AlertDialogOptions {
4
+ /** Title shown in the header. */
5
+ title: string;
6
+ /** Supporting description text shown in the body. */
7
+ description?: string;
8
+ /** Label for the dismiss action. Defaults to `'Cancel'`. */
9
+ cancelText?: string;
10
+ /** Label for the confirm action. Defaults to `'Continue'`. */
11
+ confirmText?: string;
12
+ /** Renders the confirm button in the destructive color -- use for irreversible actions. Defaults to `false`. */
13
+ destructive?: boolean;
14
+ /** Called when the user confirms. */
15
+ onConfirm?: () => void;
16
+ /** Called when the user cancels (via the Cancel button or Escape). */
17
+ onCancel?: () => void;
18
+ }
19
+ /**
20
+ * The runtime control surface returned by `AlertDialog`. A thin wrapper over `Dialog` that
21
+ * enforces the confirm-or-cancel pattern: unlike `Dialog`, clicking the backdrop never
22
+ * dismisses it -- the user must explicitly choose.
23
+ */
24
+ export interface AlertDialogApi extends Destroyable {
25
+ /** Opens the alert dialog. */
26
+ open: () => void;
27
+ /** Closes the alert dialog (equivalent to cancelling). */
28
+ close: () => void;
29
+ /** Returns whether the alert dialog is currently open. */
30
+ isOpen: () => boolean;
31
+ }
32
+ /**
33
+ * Creates a modal confirmation dialog for actions that need explicit user consent (deleting
34
+ * a resource, discarding changes) -- built entirely on top of `Dialog` and `Button`, so it
35
+ * ships no CSS of its own.
36
+ */
37
+ export declare function AlertDialog(options: AlertDialogOptions): AlertDialogApi;
@@ -0,0 +1,19 @@
1
+ import type { MenuEntry } from './DropdownMenu';
2
+ import type { Destroyable } from '../../core/types';
3
+ /** Options accepted by the `ContextMenu` factory. */
4
+ export interface ContextMenuOptions {
5
+ /** The element that opens the menu on right-click. */
6
+ target: HTMLElement;
7
+ /** The menu's items/separators. */
8
+ items: MenuEntry[];
9
+ /** Called when an enabled item is chosen. */
10
+ onSelect?: (value: string) => void;
11
+ }
12
+ /**
13
+ * The runtime control surface returned by `ContextMenu`. This is a plain controller -- not
14
+ * an element -- because it attaches behavior to an existing `target` rather than creating
15
+ * a new one to place in your layout.
16
+ */
17
+ export type ContextMenuApi = Destroyable;
18
+ /** Replaces the native right-click menu on `target` with a styled `ContextMenu`. Shares `.linteau-menu` CSS with `DropdownMenu` -- the `menu` key dedupes. */
19
+ export declare function ContextMenu(options: ContextMenuOptions): ContextMenuApi;