@raylang/elements 0.7.0 → 0.9.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 (58) hide show
  1. package/base.css +1 -1
  2. package/components/accordion/accordion.js +7 -4
  3. package/components/alert/alert.js +2 -1
  4. package/components/attachment/attachment.js +4 -5
  5. package/components/blockquote/blockquote.js +2 -2
  6. package/components/bottom-nav/bottom-nav.js +3 -3
  7. package/components/carousel/carousel.js +22 -10
  8. package/components/checkbox/checkbox.js +5 -2
  9. package/components/checkbox-group/checkbox-group.js +1 -1
  10. package/components/code/code.js +16 -11
  11. package/components/color-picker/color-picker.js +5 -5
  12. package/components/combobox/combobox.js +2 -1
  13. package/components/command-palette/command-palette.js +17 -2
  14. package/components/date-picker/date-picker.js +5 -3
  15. package/components/dialog/dialog.js +1 -1
  16. package/components/doc-tabs/doc-tabs.js +255 -0
  17. package/components/drawer/drawer.js +27 -9
  18. package/components/icon/icon.js +4 -1
  19. package/components/icon-button/icon-button.js +4 -0
  20. package/components/indicator/indicator.js +2 -1
  21. package/components/input/input.js +13 -1
  22. package/components/menu/menu.js +43 -8
  23. package/components/mode-input/mode-input.js +221 -0
  24. package/components/nav-link/nav-link.js +5 -2
  25. package/components/notification/notification.js +15 -12
  26. package/components/progress/progress.js +2 -2
  27. package/components/radio/radio.js +4 -2
  28. package/components/scroll-area/scroll-area.js +14 -11
  29. package/components/search/search.js +3 -3
  30. package/components/segmented-control/segmented-control.js +5 -3
  31. package/components/select/select.js +3 -3
  32. package/components/separator/separator.js +8 -3
  33. package/components/sidebar/sidebar.js +154 -11
  34. package/components/slider/slider.js +5 -2
  35. package/components/split/split.js +25 -7
  36. package/components/stepper/stepper.js +4 -4
  37. package/components/switch/switch.js +3 -3
  38. package/components/table/table.js +5 -5
  39. package/components/tabs/tabs.js +55 -14
  40. package/components/textarea/textarea.js +13 -1
  41. package/components/timeline/timeline.js +13 -8
  42. package/components/toggle-group/toggle-group.js +6 -4
  43. package/core/complete.js +252 -0
  44. package/core/core.js +6 -1
  45. package/core/direction.js +19 -0
  46. package/core/icons.js +12 -0
  47. package/core/position.js +11 -3
  48. package/core/scroll.js +85 -1
  49. package/core/styles.js +1 -1
  50. package/core/textlayer.js +214 -0
  51. package/core.js +1 -0
  52. package/custom-elements.json +1487 -143
  53. package/index.js +2 -0
  54. package/llms-full.txt +224 -28
  55. package/llms.txt +26 -4
  56. package/package.json +9 -1
  57. package/ray-elements.d.ts +190 -31
  58. package/vscode.html-custom-data.json +477 -22
package/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # ray-elements
2
2
 
3
- > Web components (custom elements, Shadow DOM, no dependencies) for any web app: plain HTML, React, Vue or a raylang app. npm: `@raylang/elements`, `@raylang/react`, `@raylang/vue`; raylang: the `elements` package. This file describes version 0.7.0.
3
+ > Web components (custom elements, Shadow DOM, no dependencies) for any web app: plain HTML, React, Vue or a raylang app. npm: `@raylang/elements`, `@raylang/react`, `@raylang/vue`; raylang: the `elements` package. This file describes version 0.9.0.
4
4
 
5
5
  ray-elements is a design system of standard web components (custom elements
6
6
  with Shadow DOM, no dependencies): `<ray-button>`, `<ray-input>`,
@@ -82,7 +82,10 @@ reference of every component follows them.
82
82
  `import { Trash2 } from "lucide-static"; setIcons({ trash: Trash2 })` (or
83
83
  its SVG pasted in, without a bundler); never draw your own paths. To change
84
84
  one control's icon (only the chips' ×), register its role
85
- (`setIcons({ "ui.remove": … })`, roles listed in the reference).
85
+ (`setIcons({ "ui.remove": … })`, roles listed in the reference). Under
86
+ `dir="rtl"` the roles that point along the text (`ui.next`…) mirror by
87
+ themselves; an icon of yours that points (back, send) takes `mirror`
88
+ (`<ray-icon name="arrow-left" mirror>`).
86
89
  - **Overlays are in the top layer**: `ray-dialog` is a native modal
87
90
  `<dialog>`; popovers, menus, tooltips and notifications are `[popover]`
88
91
  elements. Never fight them with `z-index` or `overflow`.
@@ -164,6 +167,21 @@ green a check, red an error, yellow a warning, others info).
164
167
  - App-wide defaults for a component: `configure({ defaults: { "ray-button":
165
168
  { variant: "light" } } })`.
166
169
 
170
+ ## Right to left
171
+
172
+ - `dir="rtl"` on `<html>` (with its `lang`) or a subtree mirrors the
173
+ components: layout, the icons that point along the text, arrow keys
174
+ (ArrowLeft is forward), sliders, carousels, splits and floating panels
175
+ (`bottom-start` lines up with the right edge). Nothing to configure.
176
+ - For a side, write `start`/`end` (they follow the direction):
177
+ `label-position="start"`, `<ray-drawer position="start">`,
178
+ `<ray-sidebar side="end">`, `<ray-toaster position="top-start">`.
179
+ `left`/`right` are sides of the screen whatever the direction; use them
180
+ only when the side is meant (a map's legend).
181
+ - Your own CSS: logical properties (`margin-inline-start`, `inset-inline-end`,
182
+ `text-align: start`), never `left`/`right`; an icon of yours that points
183
+ (back, send) takes `mirror`.
184
+
167
185
  ## React and Vue
168
186
 
169
187
  ```tsx
@@ -238,7 +256,9 @@ fn run() -> Result<int, string> {
238
256
 
239
257
  With the bridge: `<ray-file-upload native>` and `<ray-path-input>` use the
240
258
  system file dialogs and give real paths, `confirmDialog()` asks with the
241
- system dialog, `<ray-menu native>` opens a native context menu,
259
+ system dialog, `<ray-menu native>` opens a native context menu (fill
260
+ items that depend on the click in its `ray-request-open`, not in your own
261
+ `contextmenu` listener),
242
262
  `<ray-command-palette native-menus>` runs the app's menu bar
243
263
  (`bridge.menu`, `bridge.route`), `ray-app-shell` becomes the title bar of a
244
264
  `full_content` window, and `trackEdits(form)` shows the unsaved mark. The
@@ -275,6 +295,7 @@ Members whose name starts with `_` are internal.
275
295
  - [Date picker](https://elements.raylang.dev/components/date-picker.md): `<ray-date-picker>`, `<ray-calendar>` (Inputs). A date field with a calendar dropdown, and the calendar on its own.
276
296
  - [File upload](https://elements.raylang.dev/components/file-upload.md): `<ray-file-upload>` (Inputs). A drop zone to pick files: drag, click, keyboard or paste.
277
297
  - [Input](https://elements.raylang.dev/components/input.md): `<ray-input>` (Inputs). A text field with label, description and error (Mantine's TextInput).
298
+ - [Mode input](https://elements.raylang.dev/components/mode-input.md): `<ray-mode-input>` (Inputs). A text field with a menu of modes on one side: choosing a mode applies its attributes to the field (type, placeholder, inputmode, pattern…), so one control says what a value is and the value — a file path or text, an amount in € or $, a search by name or ID.
278
299
  - [Number input](https://elements.raylang.dev/components/number-input.md): `<ray-number-input>` (Inputs). A number field (Mantine's NumberInput): + and − buttons (hold to repeat), arrow keys, min, max and step, fixed decimals, a prefix and a suffix, a thousands separator, or a duration (m:ss).
279
300
  - [Password input](https://elements.raylang.dev/components/password-input.md): `<ray-password-input>` (Inputs). A password field with a button that shows or hides what was typed (Mantine's PasswordInput).
280
301
  - [Path input](https://elements.raylang.dev/components/path-input.md): `<ray-path-input>` (Inputs). A field for a path on disk: a file to open, a folder, or where to save.
@@ -287,9 +308,10 @@ Members whose name starts with `_` are internal.
287
308
  - [Textarea](https://elements.raylang.dev/components/textarea.md): `<ray-textarea>` (Inputs). A multi-line text field that can grow with its content.
288
309
  - [Bottom nav](https://elements.raylang.dev/components/bottom-nav.md): `<ray-bottom-nav>`, `<ray-bottom-nav-item>` (Navigation). The bottom navigation of a phone app (Material's navigation bar, the iOS tab bar): three to five destinations with an icon, a label and a badge, the current one marked by a pill.
289
310
  - [Breadcrumbs](https://elements.raylang.dev/components/breadcrumbs.md): `<ray-breadcrumbs>`, `<ray-breadcrumb>` (Navigation). Where a page sits (Mantine's Breadcrumbs, the WAI-ARIA breadcrumb pattern): links in a labelled nav, the last one the current page.
311
+ - [Document tabs](https://elements.raylang.dev/components/doc-tabs.md): `<ray-doc-tabs>`, `<ray-doc-tab>` (Navigation). The tabs of open documents (an editor's, a browser's): closable, with an unsaved mark, all over one shared panel; WAI-ARIA tabs with arrows, Home/End and Delete to close.
290
312
  - [Nav link](https://elements.raylang.dev/components/nav-link.md): `<ray-nav-link>` (Navigation). A sidebar/navigation item: icon, label, description, badge, active state, and nested nav links that collapse under it.
291
313
  - [Pagination](https://elements.raylang.dev/components/pagination.md): `<ray-pagination>` (Navigation). Page navigation: previous/next, optional first/last, page numbers with ellipses; the number of items stays constant so it does not jump.
292
- - [Sidebar](https://elements.raylang.dev/components/sidebar.md): `<ray-sidebar>`, `<ray-sidebar-group>` (Navigation). The side navigation of an app shell: header, content and footer; on wide screens it collapses to an icon rail, below a breakpoint it becomes an off-canvas drawer.
314
+ - [Sidebar](https://elements.raylang.dev/components/sidebar.md): `<ray-sidebar>`, `<ray-sidebar-group>` (Navigation). The side navigation of an app shell: header, content and footer; on wide screens it collapses to an icon rail (or out of view), below a breakpoint it becomes an off-canvas drawer.
293
315
  - [Stepper](https://elements.raylang.dev/components/stepper.md): `<ray-stepper>`, `<ray-step>` (Navigation). A task in steps (Mantine's Stepper): a wizard, a checkout, an onboarding.
294
316
  - [Tabs](https://elements.raylang.dev/components/tabs.md): `<ray-tabs>`, `<ray-tab>`, `<ray-tab-panel>` (Navigation). Tabs and panels (WAI-ARIA tabs pattern): arrows, Home/End, automatic or manual activation.
295
317
  - [Command palette](https://elements.raylang.dev/components/command-palette.md): `<ray-command-palette>` (Overlays). Search and run actions from the keyboard (Mantine's Spotlight): fuzzy search, groups, shortcuts, ⌘K / Ctrl+K; combobox + listbox pattern in a modal dialog.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raylang/elements",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "Web components for any app, with raylang extras (shadcn/ui + Mantine inspired)",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": ["web-components", "custom-elements", "design-system", "ui", "raylang"],
@@ -84,6 +84,10 @@
84
84
  "types": "./ray-elements.d.ts",
85
85
  "default": "./components/input/input.js"
86
86
  },
87
+ "./mode-input": {
88
+ "types": "./ray-elements.d.ts",
89
+ "default": "./components/mode-input/mode-input.js"
90
+ },
87
91
  "./number-input": {
88
92
  "types": "./ray-elements.d.ts",
89
93
  "default": "./components/number-input/number-input.js"
@@ -132,6 +136,10 @@
132
136
  "types": "./ray-elements.d.ts",
133
137
  "default": "./components/breadcrumbs/breadcrumbs.js"
134
138
  },
139
+ "./doc-tabs": {
140
+ "types": "./ray-elements.d.ts",
141
+ "default": "./components/doc-tabs/doc-tabs.js"
142
+ },
135
143
  "./nav-link": {
136
144
  "types": "./ray-elements.d.ts",
137
145
  "default": "./components/nav-link/nav-link.js"
package/ray-elements.d.ts CHANGED
@@ -229,6 +229,7 @@ export declare const srOnlyStyles: CSSStyleSheet;
229
229
  // --- positioning and focus ---------------------------------------------------
230
230
 
231
231
  export interface PlaceOptions {
232
+ /** side[-align]: top|bottom|left|right, -start|-end; on top/bottom, -start/-end follow the writing direction. */
232
233
  placement?: string;
233
234
  offset?: number;
234
235
  padding?: number;
@@ -246,6 +247,10 @@ export declare function autoUpdate(anchor: Element | object, floating: HTMLEleme
246
247
  export declare function tabbables(root: Element | ShadowRoot, options?: { lightOnly?: boolean }): HTMLElement[];
247
248
  /** Focuses the first [autofocus] or tabbable element; whether something got focus. */
248
249
  export declare function focusFirst(root: Element | ShadowRoot, options?: { lightOnly?: boolean }): boolean;
250
+ /** Whether the element lays out right to left (dir="rtl" on it or an ancestor). */
251
+ export declare function isRtl(el: Element): boolean;
252
+ /** An arrow key as the reading direction sees it: right to left, ArrowLeft comes back as "ArrowRight" and the reverse. */
253
+ export declare function inlineKey(key: string, el: Element): string;
249
254
 
250
255
  // --- charts (core/charts.js) -----------------------------------------------------
251
256
 
@@ -488,8 +493,8 @@ export declare class RayCheckbox extends FieldControl {
488
493
  color: string | undefined;
489
494
  /** Box and font size. */
490
495
  size: "xs" | "sm" | "md" | "lg" | "xl";
491
- /** Side of the label. */
492
- labelPosition: "right" | "left";
496
+ /** Side of the label: start/end follow the writing direction; left/right are sides of the screen. */
497
+ labelPosition: "end" | "start" | "right" | "left";
493
498
  }
494
499
 
495
500
  // --- Checkbox group (checkbox-group)
@@ -806,6 +811,12 @@ export interface RayFileUploadEventMap extends HTMLElementEventMap {
806
811
  }
807
812
 
808
813
  // --- Input (input)
814
+ /** A range of a field's text to mark (ray-input and ray-textarea highlight): offsets into the text, end excluded. */
815
+ export type HighlightRange = { start: number; end: number; kind?: string; title?: string };
816
+ /** A suggestion of a field's complete(): value is inserted; label (default: value) and detail are shown, description under them. */
817
+ export type CompletionItem = { value: string; label?: string; detail?: string; description?: string };
818
+ /** What complete() returns: the part of the text (offsets, to excluded) a suggestion replaces, and the suggestions. */
819
+ export type CompletionResult = { from: number; to: number; items: CompletionItem[] };
809
820
  /** <ray-input> Also forwards placeholder, autocomplete, inputmode, pattern, min, max, step, minlength, maxlength, spellcheck, autocapitalize, enterkeyhint and list to the inner input. Enter submits its form as a native field does: through the first submit button (ray-button type="submit" included; nothing when it is disabled), or, without one, only when the form has a single text field. */
810
821
  export declare class RayInput extends FieldControl {
811
822
  /** Current value. The value attribute is the initial value (restored on form reset). */
@@ -836,8 +847,59 @@ export declare class RayInput extends FieldControl {
836
847
  radius: "xs" | "sm" | "md" | "lg" | "xl" | "full" | undefined;
837
848
  /** Box style. */
838
849
  variant: "default" | "filled" | "unstyled";
850
+ /** Marks ranges of the text, painted behind it: called with the text on every change (typed or set), it returns { start, end, kind?, title? } offsets. kind "error" is red with a wavy underline; any other kind is styled with ::part(highlight-<kind>); title is the tooltip over the range. Ranges must not overlap. */
851
+ highlight: ((text: string) => HighlightRange[]) | null;
852
+ /** Inline suggestions: called as the user types (and on Ctrl+Space) with the text and the caret, it returns the part of the text a suggestion would replace and the suggestions ({ from, to, items }), or null for none. A list opens under that part (ArrowUp/Down, Enter or Tab to accept, Escape to close); the chosen item's value replaces from–to as an undoable edit, then ray-complete fires. The field becomes a combobox (aria-autocomplete, aria-expanded, aria-activedescendant). */
853
+ complete: ((text: string, caret: number) => CompletionResult | null | Promise<CompletionResult | null>) | null;
854
+ /** Accessible name of the suggestion list. */
855
+ suggestionsLabel: string;
839
856
  /** Selects the text. */
840
857
  select(): void;
858
+ /** Runs highlight again, when what it marks changed but the text did not. */
859
+ refreshHighlight(): void;
860
+ addEventListener<K extends keyof RayInputEventMap>(type: K, listener: (this: RayInput, ev: RayInputEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
861
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
862
+ removeEventListener<K extends keyof RayInputEventMap>(type: K, listener: (this: RayInput, ev: RayInputEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
863
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
864
+ }
865
+ export interface RayInputEventMap extends HTMLElementEventMap {
866
+ /** A suggestion was accepted (the text already has it). */
867
+ "ray-complete": CustomEvent<{ item: CompletionItem; from: number; to: number }>;
868
+ }
869
+
870
+ // --- Mode input (mode-input)
871
+ /** A mode of ray-mode-input: hint is the trigger's short text ("€"), attrs the attributes it sets on the field. */
872
+ export type ModeOption = { value: string; label: string; icon?: string; hint?: string; description?: string; disabled?: boolean; attrs?: Record<string, string> };
873
+ /** <ray-mode-input> Declare the modes as <option> children (label, data-icon, data-hint, data-description, disabled, and data-set-<attribute> for each attribute the mode sets on the field) or with the options property. A mode's attributes replace the field's own while it is chosen and give them back after. The menu is a ray-menu of radio items in the field's shadow root; Alt+ArrowDown opens it from the field, and the trigger keeps the caret in the field. */
874
+ export declare class RayModeInput extends RayInput {
875
+ /** The chosen mode's value (default: the first). Setting it applies that mode without ray-mode-change. */
876
+ mode: string | undefined;
877
+ /** The modes; when not set, the <option> children. */
878
+ options: ModeOption[] | undefined;
879
+ /** What the trigger shows: the mode's hint or label, its icon, or both. Default: the icon when the mode has one, else the label. */
880
+ display: "label" | "icon" | "both" | undefined;
881
+ /** The side of the field the trigger sits on. */
882
+ position: "start" | "end";
883
+ /** The trigger's accessible name, read with the current mode ("Mode: File"). */
884
+ menuLabel: string;
885
+ /** With a native host (a std/ui window with the bridge), the system's menu (no descriptions there). */
886
+ nativeMenu: boolean | undefined;
887
+ /** The modes in use. */
888
+ readonly modes: ModeOption[];
889
+ /** The chosen mode. */
890
+ readonly currentOption: ModeOption | null;
891
+ /** Chooses a mode as the user would (fires ray-mode-change). */
892
+ choose(value: string): void;
893
+ addEventListener<K extends keyof RayModeInputEventMap>(type: K, listener: (this: RayModeInput, ev: RayModeInputEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
894
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
895
+ removeEventListener<K extends keyof RayModeInputEventMap>(type: K, listener: (this: RayModeInput, ev: RayModeInputEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
896
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
897
+ }
898
+ export interface RayModeInputEventMap extends HTMLElementEventMap {
899
+ /** The user chose a mode (mode is already the new one); cancelable: preventDefault keeps the previous mode. */
900
+ "ray-mode-change": CustomEvent<{ mode: string; previous: string | null; option: ModeOption }>;
901
+ /** A suggestion was accepted (the text already has it). */
902
+ "ray-complete": CustomEvent<{ item: CompletionItem; from: number; to: number }>;
841
903
  }
842
904
 
843
905
  // --- Number input (number-input)
@@ -896,6 +958,8 @@ export declare class RayPasswordInput extends RayInput {
896
958
  export interface RayPasswordInputEventMap extends HTMLElementEventMap {
897
959
  /** The user showed or hid the password. */
898
960
  "ray-visibility-change": CustomEvent<{ visible: boolean }>;
961
+ /** A suggestion was accepted (the text already has it). */
962
+ "ray-complete": CustomEvent<{ item: CompletionItem; from: number; to: number }>;
899
963
  }
900
964
 
901
965
  // --- Path input (path-input)
@@ -925,6 +989,8 @@ export declare class RayPathInput extends RayInput {
925
989
  export interface RayPathInputEventMap extends HTMLElementEventMap {
926
990
  /** The system dialog failed. */
927
991
  "ray-error": CustomEvent<{ error: Error }>;
992
+ /** A suggestion was accepted (the text already has it). */
993
+ "ray-complete": CustomEvent<{ item: CompletionItem; from: number; to: number }>;
928
994
  }
929
995
 
930
996
  // --- Radio group (radio)
@@ -1137,8 +1203,8 @@ export declare class RaySwitch extends RayCheckbox {
1137
1203
  description: string | undefined;
1138
1204
  /** Error text. */
1139
1205
  error: string | undefined;
1140
- /** Side of the label. */
1141
- labelPosition: "right" | "left";
1206
+ /** Side of the label: start/end follow the writing direction; left/right are sides of the screen. */
1207
+ labelPosition: "end" | "start" | "right" | "left";
1142
1208
  /** Track color when on. */
1143
1209
  color: string | undefined;
1144
1210
  /** Track size. */
@@ -1178,6 +1244,22 @@ export declare class RayTextarea extends FieldControl {
1178
1244
  size: "xs" | "sm" | "md" | "lg" | "xl";
1179
1245
  /** Box style. */
1180
1246
  variant: "default" | "filled" | "unstyled";
1247
+ /** Marks ranges of the text, painted behind it: called with the text on every change (typed or set), it returns { start, end, kind?, title? } offsets. kind "error" is red with a wavy underline; any other kind is styled with ::part(highlight-<kind>); title is the tooltip over the range. Ranges must not overlap. */
1248
+ highlight: ((text: string) => HighlightRange[]) | null;
1249
+ /** Inline suggestions: called as the user types (and on Ctrl+Space) with the text and the caret, it returns the part of the text a suggestion would replace and the suggestions ({ from, to, items }), or null for none. A list opens under that part (ArrowUp/Down, Enter or Tab to accept, Escape to close); the chosen item's value replaces from–to as an undoable edit, then ray-complete fires. The field becomes a combobox (aria-autocomplete, aria-expanded, aria-activedescendant). */
1250
+ complete: ((text: string, caret: number) => CompletionResult | null | Promise<CompletionResult | null>) | null;
1251
+ /** Accessible name of the suggestion list. */
1252
+ suggestionsLabel: string;
1253
+ /** Runs highlight again, when what it marks changed but the text did not. */
1254
+ refreshHighlight(): void;
1255
+ addEventListener<K extends keyof RayTextareaEventMap>(type: K, listener: (this: RayTextarea, ev: RayTextareaEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
1256
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
1257
+ removeEventListener<K extends keyof RayTextareaEventMap>(type: K, listener: (this: RayTextarea, ev: RayTextareaEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
1258
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
1259
+ }
1260
+ export interface RayTextareaEventMap extends HTMLElementEventMap {
1261
+ /** A suggestion was accepted (the text already has it). */
1262
+ "ray-complete": CustomEvent<{ item: CompletionItem; from: number; to: number }>;
1181
1263
  }
1182
1264
 
1183
1265
  // --- Bottom nav (bottom-nav)
@@ -1258,6 +1340,42 @@ export declare class RayBreadcrumb extends RayElement {
1258
1340
  current: boolean | undefined;
1259
1341
  }
1260
1342
 
1343
+ // --- Document tabs (doc-tabs)
1344
+ /** <ray-doc-tabs> Unlike ray-tabs, a tab has no panel of its own: they all control the element named by panel, whose content the app fills for the selected one. Closing is the app's: the ×, a middle click or Delete/Backspace fire ray-request-close, and the app removes the tab (after asking about unsaved changes, if it must). When the selected tab is removed, the one at its place is selected (change) and, if the closed tab had the focus, focused. More tabs than width: the bar scrolls sideways, fades the edge that hides tabs (data-overflow-start / data-overflow-end on the host), scrolls with a vertical wheel and keeps the selected tab in view. */
1345
+ export declare class RayDocTabs extends RayElement {
1346
+ /** Value of the selected tab (default: the first). */
1347
+ value: string | undefined;
1348
+ /** The id of the shared panel: it gets role=tabpanel and aria-labelledby the selected tab; the tabs get aria-controls. */
1349
+ panel: string | undefined;
1350
+ /** Accessible name of the tab list ("Open requests"). */
1351
+ label: string | undefined;
1352
+ /** Tooltip of the ×. */
1353
+ closeLabel: string;
1354
+ /** What assistive technology hears after the name of a dirty tab. */
1355
+ dirtyLabel: string;
1356
+ /** Its tabs, in order. */
1357
+ readonly tabs: RayDocTab[];
1358
+ /** The shared panel, found by the panel id. */
1359
+ readonly panelElement: HTMLElement | null;
1360
+ addEventListener<K extends keyof RayDocTabsEventMap>(type: K, listener: (this: RayDocTabs, ev: RayDocTabsEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
1361
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
1362
+ removeEventListener<K extends keyof RayDocTabsEventMap>(type: K, listener: (this: RayDocTabs, ev: RayDocTabsEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
1363
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
1364
+ }
1365
+ export interface RayDocTabsEventMap extends HTMLElementEventMap {
1366
+ /** The × was clicked, the tab middle-clicked, or Delete/Backspace pressed on it: remove the tab to close it (not fired for hide-close tabs). */
1367
+ "ray-request-close": CustomEvent<{ value: string; tab: RayDocTab; source: "button" | "middle" | "key" }>;
1368
+ }
1369
+ /** <ray-doc-tab> A document's tab: an icon or tag (slot left), its name (cut with an ellipsis; give the full one in title), and the × or the unsaved dot. */
1370
+ export declare class RayDocTab extends RayElement {
1371
+ /** Identifies the document (ray-doc-tabs value). */
1372
+ value: string | undefined;
1373
+ /** Unsaved changes: a dot in place of the ×, which comes back under the pointer. */
1374
+ dirty: boolean | undefined;
1375
+ /** Cannot be closed: no ×, no middle click, no Delete. */
1376
+ hideClose: boolean | undefined;
1377
+ }
1378
+
1261
1379
  // --- Nav link (nav-link)
1262
1380
  /** <ray-nav-link> A link with href (aria-current=page when active), or a button that toggles its nested links. */
1263
1381
  export declare class RayNavLink extends RayElement {
@@ -1335,12 +1453,14 @@ export declare class RayPagination extends RayElement {
1335
1453
  // --- Sidebar (sidebar)
1336
1454
  /** <ray-sidebar> Put ray-sidebar-group + ray-nav-link (with an icon in slot=left) inside. Collapsed, nav links show only their icon (the label becomes the tooltip) and the host has the collapsed attribute, so your own header/footer content can hide with CSS (ray-sidebar[collapsed] .brand-name { display: none }). */
1337
1455
  export declare class RaySidebar extends RayElement {
1338
- /** Wide screens: an icon rail instead of the full panel. */
1456
+ /** Wide screens: collapsed as collapse says (an icon rail, or out of view). */
1339
1457
  collapsed: boolean | undefined;
1458
+ /** What collapsed does on wide screens: icon, a rail of the nav links' icons; offcanvas, hidden entirely (no width, out of the tab order). */
1459
+ collapse: "icon" | "offcanvas";
1340
1460
  /** Narrow screens: the drawer is shown (modal, focus trapped; Escape, backdrop click or a followed link close it). */
1341
1461
  open: boolean | undefined;
1342
- /** The edge it sits on. */
1343
- side: "left" | "right";
1462
+ /** The edge it sits on (its border faces the content, its narrow-screen drawer slides from there): start/end follow the writing direction; left/right are sides of the screen. */
1463
+ side: "start" | "end" | "left" | "right";
1344
1464
  /** A panel against the edge, or a floating card with a margin. */
1345
1465
  variant: "sidebar" | "floating";
1346
1466
  /** Width when expanded (CSS length). Default 16rem. */
@@ -1351,6 +1471,16 @@ export declare class RaySidebar extends RayElement {
1351
1471
  breakpoint: string;
1352
1472
  /** Accessible name of its navigation. */
1353
1473
  label: string;
1474
+ /** Wide screens, expanded: its inner edge drags (or, focused, arrow-keys; Shift is faster, Home/End go to the limits) the width between min-width and max-width. */
1475
+ resizable: boolean | undefined;
1476
+ /** Narrowest width when resizing, in px. */
1477
+ minWidth: number;
1478
+ /** Widest width when resizing, in px. */
1479
+ maxWidth: number;
1480
+ /** A key: the resized width is saved in localStorage and restored. A later change of width wins. */
1481
+ autosave: string | undefined;
1482
+ /** Accessible name of the resize edge. */
1483
+ resizeLabel: string;
1354
1484
  /** Collapses/expands on wide screens; opens/closes the drawer on narrow ones. */
1355
1485
  toggle(): void;
1356
1486
  /** Whether it is in drawer mode (at or below the breakpoint). */
@@ -1361,6 +1491,8 @@ export declare class RaySidebar extends RayElement {
1361
1491
  removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
1362
1492
  }
1363
1493
  export interface RaySidebarEventMap extends HTMLElementEventMap {
1494
+ /** After a drag or a key resized it (resizable). */
1495
+ "ray-resize": CustomEvent<{ width: number }>;
1364
1496
  /** After toggle(). */
1365
1497
  "ray-toggle": CustomEvent<{ collapsed: boolean; open: boolean; mobile: boolean }>;
1366
1498
  /** The drawer opened (narrow screens). */
@@ -1381,8 +1513,8 @@ export declare class RayStepper extends RayElement {
1381
1513
  active: number;
1382
1514
  /** Steps in a row above the content, or in a column beside it. */
1383
1515
  orientation: "horizontal" | "vertical";
1384
- /** Label beside the number, or under it (narrow screens, many steps). */
1385
- iconPosition: "left" | "top";
1516
+ /** Label beside the number (after it in the reading direction), or under it (narrow screens, many steps). "left", its former name, still works. */
1517
+ iconPosition: "start" | "top" | "left";
1386
1518
  /** Completed steps are buttons that go back to them. */
1387
1519
  allowStepSelect: boolean | undefined;
1388
1520
  /** With allow-step-select off, false lets the user jump to any step. */
@@ -1419,7 +1551,7 @@ export declare class RayStep extends RayElement {
1419
1551
  }
1420
1552
 
1421
1553
  // --- Tabs (tabs)
1422
- /** <ray-tabs> Tabs and panels (WAI-ARIA tabs pattern): arrows, Home/End, automatic or manual activation. */
1554
+ /** <ray-tabs> More tabs than width: the list scrolls sideways, fades the edge that hides tabs, scrolls with a vertical wheel and keeps the selected tab in view. The host then carries data-overflow-start and data-overflow-end (following the writing direction), to style it further. */
1423
1555
  export declare class RayTabs extends RayElement {
1424
1556
  /** Value of the active tab (default: the first enabled one). */
1425
1557
  value: string | undefined;
@@ -1429,6 +1561,8 @@ export declare class RayTabs extends RayElement {
1429
1561
  orientation: "horizontal" | "vertical";
1430
1562
  /** Active indicator color. */
1431
1563
  color: string | undefined;
1564
+ /** Height, font size and padding of the tabs (xs for a compact bar). */
1565
+ size: "xs" | "sm" | "md" | "lg" | "xl";
1432
1566
  /** manual: arrows move focus, Enter/Space activates. */
1433
1567
  activation: "auto" | "manual";
1434
1568
  /** Tabs share the full width. */
@@ -1444,6 +1578,8 @@ export declare class RayTab extends RayElement {
1444
1578
  value: string | undefined;
1445
1579
  /** Cannot be activated. */
1446
1580
  disabled: boolean | undefined;
1581
+ /** A small number after the label ("3", "99+"), lighter than a badge; part of the tab's accessible name. Empty: none. */
1582
+ count: string | undefined;
1447
1583
  }
1448
1584
  /** <ray-tab-panel> Tabs and panels (WAI-ARIA tabs pattern): arrows, Home/End, automatic or manual activation. */
1449
1585
  export declare class RayTabPanel extends RayElement {
@@ -1452,8 +1588,8 @@ export declare class RayTabPanel extends RayElement {
1452
1588
  }
1453
1589
 
1454
1590
  // --- Command palette (command-palette)
1455
- /** An action of ray-command-palette. */
1456
- export type CommandAction = { id?: string; label: string; description?: string; group?: string; keywords?: string | string[]; shortcut?: string; icon?: string | Node; disabled?: boolean; native?: boolean; tag?: string; onSelect?: (action: CommandAction) => void };
1591
+ /** An action of ray-command-palette. icon is a 1.25rem square (a registered icon name, text or a Node); prefix is content of any width before the label (text or a Node, e.g. a ray-badge with an HTTP method), not searched. */
1592
+ export type CommandAction = { id?: string; label: string; description?: string; group?: string; keywords?: string | string[]; shortcut?: string; icon?: string | Node; prefix?: string | Node; disabled?: boolean; native?: boolean; tag?: string; onSelect?: (action: CommandAction) => void };
1457
1593
  /** How well an action matches a query (0 = not at all). */
1458
1594
  export declare function score(action: CommandAction, query: string): number;
1459
1595
  /** <ray-command-palette> Running an action fires ray-select and calls its onSelect. The best matches come first, grouped. */
@@ -1476,6 +1612,12 @@ export declare class RayCommandPalette extends RayElement {
1476
1612
  label: string;
1477
1613
  /** No keyboard hint at the bottom. */
1478
1614
  hideHint: boolean | undefined;
1615
+ /** The keyboard hint's word for ↑↓. */
1616
+ navigateLabel: string;
1617
+ /** The keyboard hint's word for ↵. */
1618
+ runLabel: string;
1619
+ /** The keyboard hint's word for esc. */
1620
+ closeLabel: string;
1479
1621
  /** With a native host (ray-elements/core/raylang.js in a std/ui window, menus declared with elements/bridge), also lists the app's menu bar, grouped by menu with its shortcuts; running one gives the program the menu's own event. */
1480
1622
  nativeMenus: boolean | undefined;
1481
1623
  /** Blur of the page behind: px ("8"), a CSS length or "none". Default: --ray-overlay-blur ([overlay] blur in tokens.toml). */
@@ -1558,8 +1700,8 @@ export declare class RayDrawer extends RayElement {
1558
1700
  label: string | undefined;
1559
1701
  /** A line under the title (the drawer's accessible description). */
1560
1702
  description: string | undefined;
1561
- /** The edge it slides from. */
1562
- position: "right" | "left" | "top" | "bottom";
1703
+ /** The edge it slides from: start/end follow the writing direction; left/right are sides of the screen. */
1704
+ position: "end" | "start" | "right" | "left" | "top" | "bottom";
1563
1705
  /** Width (left/right) or height (top/bottom): xs…xl, full, or any CSS length. */
1564
1706
  size: "xs" | "sm" | "md" | "lg" | "xl" | "full" | (string & {});
1565
1707
  /** No backdrop nor scroll lock: the page stays interactive (a side panel). */
@@ -1597,7 +1739,7 @@ export interface RayDrawerEventMap extends HTMLElementEventMap {
1597
1739
  export declare class RayMenu extends Floating {
1598
1740
  /** Shown. */
1599
1741
  open: boolean | undefined;
1600
- /** Preferred side and alignment. */
1742
+ /** Preferred side and alignment: top/bottom/left/right are sides of the screen; on top and bottom, -start/-end follow the writing direction (right to left, "bottom-start" lines up the right edges). */
1601
1743
  placement: "bottom-start" | "bottom" | "bottom-end" | "top-start" | "top" | "top-end" | "right-start" | "left-start";
1602
1744
  /** Opens on right click (contextmenu) over the trigger area, at the pointer. */
1603
1745
  context: boolean | undefined;
@@ -1625,6 +1767,8 @@ export declare class RayMenu extends Floating {
1625
1767
  export interface RayMenuEventMap extends HTMLElementEventMap {
1626
1768
  /** An item was chosen; detail: { value, item }. */
1627
1769
  "ray-select": CustomEvent<{ value: string; item: RayMenuItem }>;
1770
+ /** Its trigger is about to open it (click, Arrow keys, right click), before the items are read, native menu included: fill items that depend on what was clicked here. Cancelable (preventDefault keeps it closed). Not fired by show() or open = true. detail: { event }. */
1771
+ "ray-request-open": CustomEvent<{ event: Event }>;
1628
1772
  /** After it opened. */
1629
1773
  "ray-open": CustomEvent<unknown>;
1630
1774
  /** After it closed. */
@@ -1638,6 +1782,14 @@ export declare class RayMenuItem extends RayElement {
1638
1782
  disabled: boolean | undefined;
1639
1783
  /** Text and hover color (e.g. red for destructive actions). */
1640
1784
  color: string | undefined;
1785
+ /** checkbox: choosing it toggles checked (menuitemcheckbox); radio: choosing it checks it and unchecks the radio items of the menu with the same name (menuitemradio). Both show a check mark when checked, in the native menu too. */
1786
+ type: "item" | "checkbox" | "radio";
1787
+ /** Checked (checkbox and radio items). Already updated when ray-select fires. */
1788
+ checked: boolean | undefined;
1789
+ /** The group of a radio item: one checked per name in the menu. */
1790
+ name: string | undefined;
1791
+ /** Whether type is checkbox or radio. */
1792
+ readonly checkable: boolean;
1641
1793
  }
1642
1794
  /** <ray-menu-label> A section caption inside the menu. */
1643
1795
  export declare class RayMenuLabel extends RayElement {
@@ -1651,7 +1803,7 @@ export declare class RayMenuDivider extends RayElement {
1651
1803
  export declare class RayPopover extends Floating {
1652
1804
  /** Shown. */
1653
1805
  open: boolean | undefined;
1654
- /** Preferred side and alignment. */
1806
+ /** Preferred side and alignment: top/bottom/left/right are sides of the screen; on top and bottom, -start/-end follow the writing direction (right to left, "bottom-start" lines up the right edges). */
1655
1807
  placement: "bottom" | "bottom-start" | "bottom-end" | "top" | "top-start" | "top-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end";
1656
1808
  /** Gap to the trigger in px. */
1657
1809
  offset: number;
@@ -1688,7 +1840,7 @@ export interface RayPopoverEventMap extends HTMLElementEventMap {
1688
1840
  export declare class RayTooltip extends Floating {
1689
1841
  /** Tooltip text. */
1690
1842
  label: string | undefined;
1691
- /** Preferred side. */
1843
+ /** Preferred side; -start/-end follow the writing direction. */
1692
1844
  placement: "top" | "bottom" | "left" | "right" | "top-start" | "top-end" | "bottom-start" | "bottom-end";
1693
1845
  /** ms before showing. */
1694
1846
  openDelay: number;
@@ -1717,8 +1869,8 @@ export declare class RayAccordion extends RayElement {
1717
1869
  multiple: boolean | undefined;
1718
1870
  /** Visual style. */
1719
1871
  variant: "default" | "contained" | "separated" | "filled";
1720
- /** Side of the chevron. */
1721
- chevronPosition: "right" | "left";
1872
+ /** Side of the chevron: start/end follow the writing direction; left/right are sides of the screen. */
1873
+ chevronPosition: "end" | "start" | "right" | "left";
1722
1874
  /** The items. */
1723
1875
  readonly items: RayAccordionItem[];
1724
1876
  /** The open values as an array, whatever the mode. */
@@ -1885,7 +2037,7 @@ export declare class RayCarousel extends RayElement {
1885
2037
  export declare function setHighlighter(fn: ((code: string, lang: string) => string | Node | null | undefined | Promise<string | Node | null | undefined>) | null): void;
1886
2038
  /** The built-in highlighter: tokens of type keyword, string, number, comment, function, type, tag, attr, punctuation or text. */
1887
2039
  export declare function tokenize(code: string, lang?: string): [type: string, text: string][];
1888
- /** <ray-code> The code comes from the code property, a <script type="text/plain"> child (raw text: anything but a closing script tag), a <template> child (parsed as HTML: the easiest for markup, but a < that is not a tag, as in Promise<void>, breaks it), or the element's text; common indentation and blank edges are removed. Built-in languages: js/ts (jsx, tsx), json, html/xml/svg/vue, css, shell, ray and diff; others show as plain text. Library classes painted with the tokens: Prism's .token.*, highlight.js's .hljs-*, and Shiki's css-variables theme. */
2040
+ /** <ray-code> The code comes from the code property, a <script type="text/plain"> child (raw text: anything but a closing script tag), a <template> child (parsed as HTML: the easiest for markup, but a < that is not a tag, as in Promise<void>, breaks it), or the element's text; common indentation and blank edges are removed (not with verbatim). Built-in languages: js/ts (jsx, tsx), json, html/xml/svg/vue, css, shell, ray and diff; others show as plain text. Library classes painted with the tokens: Prism's .token.*, highlight.js's .hljs-*, and Shiki's css-variables theme. */
1889
2041
  export declare class RayCode extends RayElement {
1890
2042
  /** The code, from script (the most convenient in React and Vue). Wins over the content. */
1891
2043
  code: string | undefined;
@@ -1899,6 +2051,8 @@ export declare class RayCode extends RayElement {
1899
2051
  highlight: string | undefined;
1900
2052
  /** Wraps long lines instead of scrolling sideways. */
1901
2053
  wrap: boolean | undefined;
2054
+ /** Shows and copies the text exactly as given: no common indentation or blank first and last lines removed. For data (a response body, a log) rather than code written in the page. */
2055
+ verbatim: boolean | undefined;
1902
2056
  /** Height before it scrolls: px as a number, or a CSS length. A taller block gets a "Show all N lines" button. */
1903
2057
  maxHeight: string | undefined;
1904
2058
  /** Shown whole, past max-height. */
@@ -1938,6 +2092,8 @@ export declare class RayIcon extends RayElement {
1938
2092
  name: IconName | undefined;
1939
2093
  /** The filled version, for a state (active, selected, favorite, unread); the outline icon when there is none. Built in: user, info, circle-check, alert-triangle, circle-x, folder, bell, star, settings, home, message-circle. */
1940
2094
  filled: boolean | undefined;
2095
+ /** Mirrored in a right-to-left context (dir="rtl"), for an icon that points along the text: back, forward, send, undo. The roles that do (ui.next, ui.previous, ui.first, ui.last, ui.disclosure, ui.separator) mirror by themselves. */
2096
+ mirror: boolean | undefined;
1941
2097
  /** xs…xl or any CSS length. Default: 1em. */
1942
2098
  size: string | undefined;
1943
2099
  /** Accessible name; without it the icon is decorative (hidden from screen readers). */
@@ -2063,8 +2219,8 @@ export interface RayTableEventMap extends HTMLElementEventMap {
2063
2219
  export declare class RayTimeline extends RayElement {
2064
2220
  /** Index of the last reached item (-1: none). */
2065
2221
  active: number;
2066
- /** Side of the line. */
2067
- align: "left" | "right";
2222
+ /** Side of the line: start/end follow the writing direction; left/right are sides of the screen. */
2223
+ align: "start" | "end" | "left" | "right";
2068
2224
  /** Bullet size: px as a number or a CSS length (default 20px). */
2069
2225
  bulletSize: string | undefined;
2070
2226
  /** Line width in px (default 2). */
@@ -2170,8 +2326,8 @@ export interface RayNotificationEventMap extends HTMLElementEventMap {
2170
2326
  }
2171
2327
  /** <ray-toaster> Created by notify() when missing; add one yourself to choose its position. A stack (newest in front, older ones peeking behind) that spreads into a list on hover or keyboard focus; on touch screens a tap expands it, a tap outside collapses it, and a sideways swipe dismisses a toast. Auto-close pauses while expanded. Full width on phones. */
2172
2328
  export declare class RayToaster extends RayElement {
2173
- /** Corner of the stack. */
2174
- position: "bottom-right" | "bottom-left" | "bottom-center" | "top-right" | "top-left" | "top-center";
2329
+ /** Corner of the stack: -start/-end follow the writing direction; -left/-right are sides of the screen. */
2330
+ position: "bottom-end" | "bottom-start" | "bottom-center" | "top-end" | "top-start" | "top-center" | "bottom-right" | "bottom-left" | "top-right" | "top-left";
2175
2331
  /** Maximum kept; the oldest go first. */
2176
2332
  limit: number;
2177
2333
  /** Toasts shown in the collapsed stack (the rest wait, hidden). */
@@ -2430,9 +2586,9 @@ export declare class RayScrollArea extends RayElement {
2430
2586
  label: string | undefined;
2431
2587
  /** The scrolling element (scrollTop, scrollTo…). */
2432
2588
  readonly viewport: HTMLElement;
2433
- /** Scrolls to the top (left). */
2589
+ /** Scrolls to the start: the top, or the left when horizontal (the right right to left). */
2434
2590
  scrollToStart(options?: { behavior?: ScrollBehavior }): void;
2435
- /** Scrolls to the bottom (right when horizontal). */
2591
+ /** Scrolls to the end: the bottom, or the right when horizontal (the left right to left). */
2436
2592
  scrollToEnd(options?: { behavior?: ScrollBehavior }): void;
2437
2593
  addEventListener<K extends keyof RayScrollAreaEventMap>(type: K, listener: (this: RayScrollArea, ev: RayScrollAreaEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
2438
2594
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
@@ -2440,8 +2596,8 @@ export declare class RayScrollArea extends RayElement {
2440
2596
  removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
2441
2597
  }
2442
2598
  export interface RayScrollAreaEventMap extends HTMLElementEventMap {
2443
- /** The end came within threshold (once per arrival). */
2444
- "ray-reach-end": CustomEvent<{ edge: "bottom" | "right" }>;
2599
+ /** The end came within threshold (once per arrival): the bottom, or the right when horizontal (the left right to left). */
2600
+ "ray-reach-end": CustomEvent<{ edge: "bottom" | "right" | "left" }>;
2445
2601
  }
2446
2602
 
2447
2603
  // --- Separator (separator)
@@ -2451,8 +2607,8 @@ export declare class RaySeparator extends RayElement {
2451
2607
  orientation: "horizontal" | "vertical";
2452
2608
  /** Text in the middle of a horizontal rule. */
2453
2609
  label: string | undefined;
2454
- /** Where the label sits. */
2455
- labelPosition: "left" | "center" | "right";
2610
+ /** Where the label sits: start/end follow the writing direction; left/right are sides of the screen. */
2611
+ labelPosition: "start" | "center" | "end" | "left" | "right";
2456
2612
  /** Thickness (1–5px). */
2457
2613
  size: "xs" | "sm" | "md" | "lg" | "xl";
2458
2614
  /** Line style. */
@@ -2474,7 +2630,7 @@ export declare class RaySplit extends RayElement {
2474
2630
  collapsed: boolean | undefined;
2475
2631
  /** The divider cannot be moved. */
2476
2632
  disabled: boolean | undefined;
2477
- /** A key: the size is saved in localStorage and restored. */
2633
+ /** A key: the size and the collapsed state are saved in localStorage and restored (a saved state wins over the collapsed attribute). */
2478
2634
  autosave: string | undefined;
2479
2635
  /** The start pane's size in px. */
2480
2636
  readonly size: number;
@@ -2550,6 +2706,7 @@ declare global {
2550
2706
  "ray-calendar": RayCalendar;
2551
2707
  "ray-file-upload": RayFileUpload;
2552
2708
  "ray-input": RayInput;
2709
+ "ray-mode-input": RayModeInput;
2553
2710
  "ray-number-input": RayNumberInput;
2554
2711
  "ray-password-input": RayPasswordInput;
2555
2712
  "ray-path-input": RayPathInput;
@@ -2566,6 +2723,8 @@ declare global {
2566
2723
  "ray-bottom-nav-item": RayBottomNavItem;
2567
2724
  "ray-breadcrumbs": RayBreadcrumbs;
2568
2725
  "ray-breadcrumb": RayBreadcrumb;
2726
+ "ray-doc-tabs": RayDocTabs;
2727
+ "ray-doc-tab": RayDocTab;
2569
2728
  "ray-nav-link": RayNavLink;
2570
2729
  "ray-pagination": RayPagination;
2571
2730
  "ray-sidebar": RaySidebar;