@wirecore/wirelayer-vue 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 (92) hide show
  1. package/dist/{Checkbox-D175nhKK.js → Checkbox-DS2qfQK1.js} +2 -8
  2. package/dist/ContextMenu-CBE9YnDW.js +2321 -0
  3. package/dist/{Field-B1EsNF84.js → Field-Cqe2BG_x.js} +1 -1
  4. package/dist/Input-C5dyvZfJ.js +183 -0
  5. package/dist/{InputStatus-D7kBGlew.js → InputStatus-Cgarj-yu.js} +16 -3
  6. package/dist/{Select-Bd2Vpr7G.js → Select-q8FUIWLi.js} +141 -124
  7. package/dist/Tree-B-0NXpUq.js +839 -0
  8. package/dist/components/Alert/Alert.vue.d.ts +5 -3
  9. package/dist/components/Alert/Alert.vue.d.ts.map +1 -1
  10. package/dist/components/Avatar/Avatar.vue.d.ts +2 -0
  11. package/dist/components/Avatar/Avatar.vue.d.ts.map +1 -1
  12. package/dist/components/Card/Card.vue.d.ts +2 -0
  13. package/dist/components/Card/Card.vue.d.ts.map +1 -1
  14. package/dist/components/Checkbox/Checkbox.vue.d.ts +26 -23
  15. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  16. package/dist/components/Code/Code.vue.d.ts +21 -0
  17. package/dist/components/Code/Code.vue.d.ts.map +1 -0
  18. package/dist/components/Combobox/Combobox.vue.d.ts +9 -1
  19. package/dist/components/Combobox/Combobox.vue.d.ts.map +1 -1
  20. package/dist/components/CommandPalette/CommandPalette.vue.d.ts +1 -1
  21. package/dist/components/ContextMenu/ContextMenu.vue.d.ts +18 -2
  22. package/dist/components/ContextMenu/ContextMenu.vue.d.ts.map +1 -1
  23. package/dist/components/Dialog/Dialog.vue.d.ts +1 -1
  24. package/dist/components/Dialog/Dialog.vue.d.ts.map +1 -1
  25. package/dist/components/Dialog/DialogContent.vue.d.ts +12 -1
  26. package/dist/components/Dialog/DialogContent.vue.d.ts.map +1 -1
  27. package/dist/components/Dialog/context.d.ts +3 -1
  28. package/dist/components/Dialog/context.d.ts.map +1 -1
  29. package/dist/components/Drawer/Drawer.vue.d.ts +1 -1
  30. package/dist/components/Fieldset/Fieldset.vue.d.ts +1 -1
  31. package/dist/components/FilterPanel/FilterPanel.vue.d.ts +1 -1
  32. package/dist/components/HoverCard/HoverCard.vue.d.ts +1 -1
  33. package/dist/components/Input/Input.vue.d.ts +3 -1
  34. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  35. package/dist/components/MaskInput/MaskInput.vue.d.ts +2 -1
  36. package/dist/components/MaskInput/MaskInput.vue.d.ts.map +1 -1
  37. package/dist/components/Menu/Menu.vue.d.ts +9 -1
  38. package/dist/components/Menu/Menu.vue.d.ts.map +1 -1
  39. package/dist/components/Menu/state.d.ts +22 -0
  40. package/dist/components/Menu/state.d.ts.map +1 -1
  41. package/dist/components/NativeSelect/NativeSelect.vue.d.ts +31 -19
  42. package/dist/components/NativeSelect/NativeSelect.vue.d.ts.map +1 -1
  43. package/dist/components/NumberInput/NumberInput.vue.d.ts +27 -20
  44. package/dist/components/NumberInput/NumberInput.vue.d.ts.map +1 -1
  45. package/dist/components/Panel/Panel.vue.d.ts +1 -1
  46. package/dist/components/PasswordInput/PasswordInput.vue.d.ts +9 -3
  47. package/dist/components/PasswordInput/PasswordInput.vue.d.ts.map +1 -1
  48. package/dist/components/Popover/Popover.vue.d.ts +1 -1
  49. package/dist/components/Progress/Progress.vue.d.ts +14 -0
  50. package/dist/components/Progress/Progress.vue.d.ts.map +1 -1
  51. package/dist/components/RadioGroup/RadioGroup.vue.d.ts +32 -26
  52. package/dist/components/RadioGroup/RadioGroup.vue.d.ts.map +1 -1
  53. package/dist/components/RadioGroup/RadioGroupItem.vue.d.ts +2 -1
  54. package/dist/components/RadioGroup/RadioGroupItem.vue.d.ts.map +1 -1
  55. package/dist/components/RadioGroup/context.d.ts +4 -0
  56. package/dist/components/RadioGroup/context.d.ts.map +1 -0
  57. package/dist/components/SegmentedControl/SegmentedControl.vue.d.ts +31 -22
  58. package/dist/components/SegmentedControl/SegmentedControl.vue.d.ts.map +1 -1
  59. package/dist/components/Select/Select.vue.d.ts +21 -7
  60. package/dist/components/Select/Select.vue.d.ts.map +1 -1
  61. package/dist/components/Stepper/Stepper.vue.d.ts +2 -0
  62. package/dist/components/Stepper/Stepper.vue.d.ts.map +1 -1
  63. package/dist/components/Tabs/Tabs.vue.d.ts +6 -3
  64. package/dist/components/Tabs/Tabs.vue.d.ts.map +1 -1
  65. package/dist/components/Tabs/TabsTrigger.vue.d.ts +6 -0
  66. package/dist/components/Tabs/TabsTrigger.vue.d.ts.map +1 -1
  67. package/dist/components/Tabs/context.d.ts +4 -0
  68. package/dist/components/Tabs/context.d.ts.map +1 -0
  69. package/dist/components/Textarea/Textarea.vue.d.ts +3 -1
  70. package/dist/components/Textarea/Textarea.vue.d.ts.map +1 -1
  71. package/dist/components/Wizard/Wizard.vue.d.ts +10 -2
  72. package/dist/components/Wizard/Wizard.vue.d.ts.map +1 -1
  73. package/dist/composables/index.d.ts +1 -1
  74. package/dist/composables/index.d.ts.map +1 -1
  75. package/dist/composables/media.d.ts +8 -1
  76. package/dist/composables/media.d.ts.map +1 -1
  77. package/dist/data-table.js +4 -4
  78. package/dist/editor.js +1 -1
  79. package/dist/form.js +2 -2
  80. package/dist/index.d.ts +6 -3
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +2751 -2649
  83. package/dist/pdf.js +3 -3
  84. package/dist/sources/Code.css +2 -0
  85. package/dist/utils/text-field.d.ts +16 -0
  86. package/dist/utils/text-field.d.ts.map +1 -0
  87. package/llms-full.txt +117 -27
  88. package/llms.txt +6 -4
  89. package/package.json +3 -3
  90. package/dist/ContextMenu-BEOEyUa6.js +0 -2235
  91. package/dist/Input-Cn5q0yVE.js +0 -181
  92. package/dist/Tree-fd9LXqgZ.js +0 -792
package/dist/pdf.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { a as e, i as t, n } from "./recipes-BlM9aKyt.js";
2
2
  import { t as r } from "./Button-BpMOPs8b.js";
3
- import { t as i } from "./Field-B1EsNF84.js";
4
- import { i as a, t as o } from "./Select-Bd2Vpr7G.js";
5
- import { c as s, i as c, l, n as u, o as d, r as ee, s as te, t as ne } from "./Tree-fd9LXqgZ.js";
3
+ import { t as i } from "./Field-Cqe2BG_x.js";
4
+ import { i as a, t as o } from "./Select-q8FUIWLi.js";
5
+ import { c as s, i as c, l, n as u, o as d, r as ee, s as te, t as ne } from "./Tree-B-0NXpUq.js";
6
6
  import { Fragment as f, computed as p, createBlock as re, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createTextVNode as _, createVNode as v, defineComponent as y, mergeProps as ie, nextTick as ae, normalizeClass as b, normalizeStyle as oe, onBeforeUnmount as se, onMounted as ce, openBlock as x, reactive as le, ref as S, renderList as ue, resolveDynamicComponent as de, toDisplayString as C, unref as w, useAttrs as fe, useId as pe, useTemplateRef as T, vModelText as me, watch as E, withCtx as D, withDirectives as he, withModifiers as ge } from "vue";
7
7
  import { CaseSensitive as _e, ChevronDown as ve, ChevronUp as ye, Download as be, FileWarning as xe, Maximize as Se, Minimize as Ce, PanelLeft as we, Printer as Te, RotateCw as Ee, Search as De, X as Oe, ZoomIn as ke, ZoomOut as Ae } from "@lucide/vue";
8
8
  import { PDF_ZOOM_MAX as je, PDF_ZOOM_MIN as Me, clampPdfPage as Ne, clampPdfZoom as Pe, downloadBytes as Fe, input as Ie, normalizePdfRotation as O, parsePdfPage as Le, pdfFileName as Re, pdfKeyAction as ze, pdfPrintDocument as k, pdfSearchText as Be, pdfThumbnailSize as Ve, pdfTools as A, pdfViewer as He, pdfZoomFromKey as Ue, pdfZoomKey as We, pdfZoomStep as Ge, pdfZoomSteps as j, pdfZoomSteps as Ke, resolvePdfTools as qe, setupToolbar as Je } from "@wirecore/wirelayer-recipes";
@@ -0,0 +1,2 @@
1
+ /* Classes of Code – generated by scripts/sources.ts, do not edit */
2
+ @import '@wirecore/wirelayer-recipes/sources/inlineCode.css';
@@ -0,0 +1,16 @@
1
+ /**
2
+ * What the text fields expose (Input, PasswordInput, NumberInput, Textarea, MaskInput): the native element and its
3
+ * focus and selection methods – the root of these components is a wrapper, not the input
4
+ */
5
+ export interface TextFieldHandle<E extends HTMLInputElement | HTMLTextAreaElement = HTMLInputElement> {
6
+ /** The native input (or textarea); null before mounting */
7
+ readonly element: E | null;
8
+ focus(options?: FocusOptions): void;
9
+ blur(): void;
10
+ /** Selects the whole text */
11
+ select(): void;
12
+ setSelectionRange(start: number | null, end: number | null, direction?: 'forward' | 'backward' | 'none'): void;
13
+ }
14
+ /** The handle for a component's defineExpose, reading the element when called */
15
+ export declare function textFieldHandle<E extends HTMLInputElement | HTMLTextAreaElement>(element: () => E | null | undefined): TextFieldHandle<E>;
16
+ //# sourceMappingURL=text-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-field.d.ts","sourceRoot":"","sources":["../../src/utils/text-field.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB;IAChG,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACpC,IAAI,IAAI,IAAI,CAAC;IACb,6BAA6B;IAC7B,MAAM,IAAI,IAAI,CAAC;IACf,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;CAClH;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,CAAC,SAAS,gBAAgB,GAAG,mBAAmB,EAC5E,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,GACpC,eAAe,CAAC,CAAC,CAAC,CAUpB"}
package/llms-full.txt CHANGED
@@ -139,6 +139,10 @@ Message box with status colour, icon, title and text; role="alert" for errors an
139
139
  | --- | --- | --- |
140
140
  | @dismiss | – | |
141
141
 
142
+ | Slot | Slot props | Description |
143
+ | --- | --- | --- |
144
+ | #default | – | The message text |
145
+ | #actions | – | Buttons in the message, e.g. "Unlock" or "Reconnect" – beside the text, below it when there is little room |
142
146
 
143
147
  ### AngleSlider
144
148
 
@@ -352,6 +356,7 @@ Image, initials or icon of a person or organisation; `as="button"` makes it a tr
352
356
  | Prop | Type | Description |
353
357
  | --- | --- | --- |
354
358
  | name? | `string` | Person or organisation – accessible name of the avatar and source of the initials |
359
+ | initials? | `string` | Own initials instead of the ones taken from `name`, e.g. "MS" for "my-server" |
355
360
  | src? | `string` | Image URL; initials (or the icon) are shown while it loads or if it fails |
356
361
  | icon? | `Component` | Icon shown when there is neither an image nor a name (default: user icon) |
357
362
  | variant? | `AvatarVariant` | |
@@ -694,6 +699,7 @@ Surface for grouped content, optionally with title, media and footer; interactiv
694
699
  | subtitle? | `string` | Line below the title (also via #subtitle) |
695
700
  | title-tag? | `'h2' \| 'h3' \| 'h4' \| 'h5' \| 'h6' \| 'p'` | Element of the title – pick the level that fits the page outline |
696
701
  | orientation? | `'vertical' \| 'horizontal'` | `horizontal`: media at the start, the content beside it |
702
+ | size? | `'sm' \| 'md'` | `sm`: smaller radius, padding and title, e.g. for cards in a list inside a dialog |
697
703
  | classes? | `RecipeClasses<typeof cardRecipe> & RecipeClasses<typeof cardPartsRecipe>` | Extra classes per part of the component, e.g. { base: "…", title: "…" } (see the recipes card and cardParts) |
698
704
 
699
705
  | Slot | Slot props | Description |
@@ -973,8 +979,8 @@ Checkbox with label (also indeterminate), works inside Field
973
979
 
974
980
  | Prop | Type | Description |
975
981
  | --- | --- | --- |
976
- | v-model:checked? | `CheckedState` | Controlled state – use with v-model:checked |
977
- | default-checked? | `CheckedState` | |
982
+ | v-model:checked? | `C` | Controlled state – use with v-model:checked |
983
+ | default-checked? | `C` | |
978
984
  | disabled? | `boolean` | |
979
985
  | invalid? | `boolean` | |
980
986
  | required? | `boolean` | |
@@ -985,7 +991,7 @@ Checkbox with label (also indeterminate), works inside Field
985
991
 
986
992
  | Event | Payload | Description |
987
993
  | --- | --- | --- |
988
- | v-model:checked | `checked: CheckedState` | |
994
+ | v-model:checked | `checked: C` | |
989
995
 
990
996
 
991
997
  ### CheckboxCard
@@ -1100,6 +1106,21 @@ Filter chips: one or several options as toggle buttons
1100
1106
  | v-model | `value: string[]` | |
1101
1107
 
1102
1108
 
1109
+ ### Code
1110
+
1111
+ Code inside a sentence, without syntax colours: the look of InlineCode (/code) without shiki
1112
+
1113
+ - Import: `import { Code } from '@wirecore/wirelayer-vue'`
1114
+ - Category: Data
1115
+ - Example: https://wirecore.github.io/WireLayer/?path=/story/vue_data-code--playground
1116
+ - Other attributes go to the root element (<code>)
1117
+
1118
+ | Prop | Type | Description |
1119
+ | --- | --- | --- |
1120
+ | code? | `string` | The code (one line) – or pass it as the content |
1121
+ | classes? | `RecipeClasses<typeof inlineCodeRecipe>` | Extra classes of the recipe (see the recipe inlineCode) |
1122
+
1123
+
1103
1124
  ### CodeHighlight
1104
1125
 
1105
1126
  Code block with syntax colours; the scroll area is focusable, the copy button copies the plain code
@@ -1307,6 +1328,8 @@ Text field with suggestions (autocomplete): type to filter, arrow keys to choose
1307
1328
  | min-search-length? | `number` | Fewest characters typed before the data source is asked |
1308
1329
  | page-size? | `number` | Options per request of the data source (default 50) |
1309
1330
  | id? | `string` | Id of the input, e.g. for a `<label for>` |
1331
+ | v-model:open? | `boolean` | Whether the list is open – use with v-model:open, or listen to update:open |
1332
+ | stop-key-propagation? | `boolean` | Keeps the keys the open list handles itself (Enter choosing, Escape closing, Tab leaving) from bubbling up – e.g. in a dialog with window shortcuts for Enter (save) and Escape (cancel) |
1310
1333
  | classes? | `RecipeClasses<typeof comboboxRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
1311
1334
 
1312
1335
  | Event | Payload | Description |
@@ -1315,6 +1338,7 @@ Text field with suggestions (autocomplete): type to filter, arrow keys to choose
1315
1338
  | @input-value-change | `inputValue: string` | Every change of the text (typing, choosing, clearing) |
1316
1339
  | @filter-change | `text: string` | Typed text – e.g. to load matching items from a server (manualFilter) |
1317
1340
  | @load-more | – | The end of the list was scrolled into view (hasMore) |
1341
+ | v-model:open | `open: boolean` | The list opened or closed |
1318
1342
 
1319
1343
  | Slot | Slot props | Description |
1320
1344
  | --- | --- | --- |
@@ -1522,13 +1546,18 @@ Opens at the pointer on right click, on touch screens with a long press (and wit
1522
1546
  - Import: `import { ContextMenu } from '@wirecore/wirelayer-vue'`
1523
1547
  - Category: Overlays
1524
1548
  - Example: https://wirecore.github.io/WireLayer/?path=/story/vue_overlays-contextmenu--playground
1525
- - Also takes the props of: MenuItemOptions
1549
+ - Also takes the props of: MenuItemOptions, MenuBehaviorOptions
1526
1550
 
1527
1551
  | Prop | Type | Description |
1528
1552
  | --- | --- | --- |
1529
1553
  | items | `readonly MenuEntry[]` | Items, groups, separators, checkbox items, radio groups and submenus – as in Menu |
1530
1554
  | label? | `string` | Accessible name of the menu – without it the menu is named by the area's content |
1531
1555
  | link-as? | `Component \| string` | Component for link items, e.g. RouterLink or NuxtLink (gets `to` for items with `to`, else `href`); default <a> |
1556
+ | v-model:open? | `boolean` | Whether the menu is open – use with v-model:open, or listen to update:open (e.g. to pause list shortcuts) |
1557
+ | close-on-scroll? | `boolean` | Closes when the page (or a container) scrolls |
1558
+ | close-on-resize? | `boolean` | Closes when the window is resized |
1559
+ | close-on-blur? | `boolean` | Closes when the window loses the focus (switching to another window) |
1560
+ | highlight-first? | `boolean` | Highlights the first item when the menu opens, so Enter takes it (as in desktop context menus) |
1532
1561
  | classes? | `RecipeClasses<typeof menuRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
1533
1562
 
1534
1563
  | Event | Payload | Description |
@@ -1536,6 +1565,8 @@ Opens at the pointer on right click, on touch screens with a long press (and wit
1536
1565
  | @select | `value: string` | |
1537
1566
  | @checked-change | `value: string, checked: boolean` | A checkbox item was switched |
1538
1567
  | @value-change | `name: string, value: string` | A radio group got a new value |
1568
+ | v-model:open | `open: boolean` | |
1569
+ | @before-open | `target: Element, details: ContextMenuOpenDetails` | A right click, long press or the menu key is opening the menu, on this element (e.g. the row under the pointer – select it before the menu shows); `details.source` tells pointer from keyboard, with the keyboard `details.focused` is the focused element (e.g. the row with the focus) |
1539
1570
 
1540
1571
  | Slot | Slot props | Description |
1541
1572
  | --- | --- | --- |
@@ -1997,6 +2028,7 @@ The modal window of a Dialog: title, description, focus trap, Escape closes
1997
2028
  | --- | --- | --- |
1998
2029
  | title | `string` | |
1999
2030
  | hide-title? | `boolean` | The title only for screen readers – it still names the dialog (e.g. a video in a dialog) |
2031
+ | title-position? | `'body' \| 'header'` | `body` (default): the title below the header row; `header`: in the row of the close button, after a smaller icon, the header separated by a line (as on the Drawer) |
2000
2032
  | description? | `string` | |
2001
2033
  | icon? | `Component` | Icon component in the coloured box at the top |
2002
2034
  | status? | `DialogStatus` | |
@@ -3019,7 +3051,7 @@ Shows a value as a button; activating it swaps in the editor (Escape closes it)
3019
3051
 
3020
3052
  ### Input
3021
3053
 
3022
- Text field with sizes, leading icon, prefix and suffix; works inside Field
3054
+ Text field with sizes, leading icon, prefix and suffix; works inside Field. `ref` reaches the native input (focus, select, setSelectionRange)
3023
3055
 
3024
3056
  - Import: `import { Input } from '@wirecore/wirelayer-vue'`
3025
3057
 
@@ -3038,6 +3070,7 @@ Text field with sizes, leading icon, prefix and suffix; works inside Field
3038
3070
  | leading-icon? | `Component` | Icon component rendered inside the field, before the text |
3039
3071
  | prefix? | `string` | Static text segment before the input, e.g. `https://` |
3040
3072
  | suffix? | `string` | Static text segment after the input, e.g. `.de` |
3073
+ | mono? | `boolean` | Monospace font of the theme (JetBrains Mono) – for paths, tokens, codes, URLs and keys |
3041
3074
  | classes? | `RecipeClasses<typeof inputRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
3042
3075
 
3043
3076
  | Event | Payload | Description |
@@ -3553,7 +3586,7 @@ The trigger is the slotted element (e.g. a Button or IconButton)
3553
3586
  - Import: `import { Menu } from '@wirecore/wirelayer-vue'`
3554
3587
  - Category: Overlays
3555
3588
  - Example: https://wirecore.github.io/WireLayer/?path=/story/vue_overlays-menu--playground
3556
- - Also takes the props of: MenuItemOptions
3589
+ - Also takes the props of: MenuItemOptions, MenuBehaviorOptions
3557
3590
 
3558
3591
  | Prop | Type | Description |
3559
3592
  | --- | --- | --- |
@@ -3566,6 +3599,10 @@ The trigger is the slotted element (e.g. a Button or IconButton)
3566
3599
  | placement? | `PopoverPlacement` | Side of the trigger the menu opens on, e.g. `bottom-end` for a menu at the right edge (default bottom-start) |
3567
3600
  | arrow? | `boolean` | Arrow pointing at the trigger, as on the Popover |
3568
3601
  | link-as? | `Component \| string` | Component for link items, e.g. RouterLink or NuxtLink (gets `to` for items with `to`, else `href`); default <a> |
3602
+ | close-on-scroll? | `boolean` | Closes when the page (or a container) scrolls – e.g. for a menu opened at a point |
3603
+ | close-on-resize? | `boolean` | Closes when the window is resized |
3604
+ | close-on-blur? | `boolean` | Closes when the window loses the focus (switching to another window) |
3605
+ | highlight-first? | `boolean` | Highlights the first item also when the menu opens by pointer, so Enter takes it (as in desktop menus) |
3569
3606
  | classes? | `RecipeClasses<typeof menuRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
3570
3607
 
3571
3608
  | Event | Payload | Description |
@@ -3775,9 +3812,9 @@ The browser's select: its own keyboard and mobile pickers; inside a Field it is
3775
3812
 
3776
3813
  | Prop | Type | Description |
3777
3814
  | --- | --- | --- |
3778
- | items | `readonly NativeSelectOption[]` | |
3779
- | v-model? (modelValue) | `string` | Chosen value – use with v-model |
3780
- | placeholder? | `string` | First, empty option, e.g. "Please choose" |
3815
+ | items | `readonly NativeSelectOption<V>[]` | |
3816
+ | v-model? (modelValue) | `V \| ''` | Chosen value – use with v-model; the placeholder option gives an empty string |
3817
+ | placeholder? | `P` | First, empty option, e.g. "Please choose" – without it v-model only gets values (typed `V`, not `V \| ''`) |
3781
3818
  | size? | `Size` | |
3782
3819
  | invalid? | `boolean` | |
3783
3820
  | disabled? | `boolean` | |
@@ -3785,7 +3822,7 @@ The browser's select: its own keyboard and mobile pickers; inside a Field it is
3785
3822
 
3786
3823
  | Event | Payload | Description |
3787
3824
  | --- | --- | --- |
3788
- | v-model | `value: string` | |
3825
+ | v-model | `value: P extends string ? V \| '' : V` | |
3789
3826
 
3790
3827
 
3791
3828
  ### NavigationMenu
@@ -3872,7 +3909,7 @@ A number in the format of the locale ("€1,234.50")
3872
3909
 
3873
3910
  ### NumberInput
3874
3911
 
3875
- Number field with − / + buttons, arrow keys and locale formatting ("1,234.5")
3912
+ Number field with − / + buttons, arrow keys and locale formatting ("1,234.5"); `ref` reaches the native input
3876
3913
 
3877
3914
  - Import: `import { NumberInput } from '@wirecore/wirelayer-vue'`
3878
3915
  - Category: Forms
@@ -3903,6 +3940,7 @@ Number field with − / + buttons, arrow keys and locale formatting ("1,234.5")
3903
3940
  | allow-decimal? | `boolean` | Allows decimals (default); false blocks the decimal separator and rounds to whole numbers |
3904
3941
  | decimals? | `number` | Exactly this many decimals, e.g. 2 → "12.50" |
3905
3942
  | clamp-behavior? | `'blur' \| 'strict' \| 'none'` | Out of min/max: `blur` corrects the value when the field is left (default), `strict` does not let it leave the range, `none` keeps it (mark it invalid yourself) |
3943
+ | empty-fallback? | `F` | A number is always set: an emptied field falls back to `min` (or 0) or to the last valid number (`previous`) when it is left or Enter is pressed – v-model then only gets numbers (typed `number`, not `number \| null`) |
3906
3944
  | select-on-focus? | `boolean` | Selects the whole number when the field gets the focus |
3907
3945
  | loading? | `boolean` | Shows a spinner in the field and marks it busy (aria-busy) |
3908
3946
  | clearable? | `boolean` | Shows a button that empties the field while it has a value |
@@ -3912,7 +3950,7 @@ Number field with − / + buttons, arrow keys and locale formatting ("1,234.5")
3912
3950
 
3913
3951
  | Event | Payload | Description |
3914
3952
  | --- | --- | --- |
3915
- | v-model | `value: number \| null` | |
3953
+ | v-model | `value: F extends string ? number : number \| null` | |
3916
3954
 
3917
3955
 
3918
3956
  ### OrderList
@@ -4112,7 +4150,7 @@ Card with a heading (and actions); toggleable: the heading holds a button with a
4112
4150
 
4113
4151
  ### PasswordInput
4114
4152
 
4115
- Password field with a button that shows/hides the password (named "Show/Hide password")
4153
+ Password field with a button that shows/hides the password (named "Show/Hide password"); `ref` reaches the native input
4116
4154
 
4117
4155
  - Import: `import { PasswordInput } from '@wirecore/wirelayer-vue'`
4118
4156
  - Category: Forms
@@ -4131,7 +4169,7 @@ Password field with a button that shows/hides the password (named "Show/Hide pas
4131
4169
  | name? | `string` | |
4132
4170
  | default-visible? | `boolean` | Initially show the password in plain text |
4133
4171
  | v-model:visible? | `boolean` | Whether the password is shown in plain text – use with v-model:visible |
4134
- | autocomplete? | `'current-password' \| 'new-password'` | |
4172
+ | autocomplete? | `'current-password' \| 'new-password' \| 'off' \| 'one-time-code'` | `current-password` (default) or `new-password` for the browser's password manager; `off` or `one-time-code` for secrets it should not offer to save (tokens, passphrases, master passwords, one-time codes) |
4135
4173
  | strength? | `boolean` | Strength meter below the field – for choosing a new password |
4136
4174
  | requirements? | `readonly PasswordRequirement[]` | Checklist below the field, updated while typing: each rule with its state (icon and text), linked to the input as its description |
4137
4175
  | loading? | `boolean` | Shows a spinner in the field and marks it busy (aria-busy) |
@@ -4139,6 +4177,7 @@ Password field with a button that shows/hides the password (named "Show/Hide pas
4139
4177
  | clear-label? | `string` | Accessible name of the clear button (default "Clear input") |
4140
4178
  | default-value? | `string` | Initial value without v-model |
4141
4179
  | id? | `string` | Id of the input, e.g. for a `<label for>` |
4180
+ | mono? | `boolean` | Monospace font of the theme (JetBrains Mono) – for tokens, passphrases and keys |
4142
4181
  | classes? | `RecipeClasses<typeof passwordInputRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4143
4182
 
4144
4183
  | Event | Payload | Description |
@@ -4408,6 +4447,10 @@ Ark names the progressbar after its value; the label is the name, the value its
4408
4447
  | striped? | `boolean` | Diagonal stripes on the filled part |
4409
4448
  | animated? | `boolean` | Moving stripes (only without reduced motion) |
4410
4449
  | orientation? | `'horizontal' \| 'vertical'` | Vertical bar (fills the height of its parent) |
4450
+ | size? | `'xs' \| 'md'` | `xs`: a thin bar with small text, e.g. in a list or a status bar |
4451
+ | status? | `'info' \| 'success' \| 'warn' \| 'danger' \| 'neutral'` | Colour of the filled part by its state, e.g. `danger` for a failed transfer, `neutral` (grey) for a cancelled one |
4452
+ | hide-label? | `boolean` | The label only for screen readers – it still names the progress bar |
4453
+ | bar-text? | `string` | Short text in the bar, e.g. "42 %", "waiting" or "failed" (a taller bar; horizontal, without segments or steps) – screen readers get it after the value |
4411
4454
  | classes? | `RecipeClasses<typeof progressRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4412
4455
 
4413
4456
 
@@ -4535,20 +4578,20 @@ One choice out of several (role="radiogroup", arrow keys), horizontal or vertica
4535
4578
 
4536
4579
  | Prop | Type | Description |
4537
4580
  | --- | --- | --- |
4538
- | v-model? (modelValue) | `string \| null` | Selected value – use with v-model |
4539
- | default-value? | `string \| null` | |
4581
+ | v-model? (modelValue) | `V \| null` | Selected value – use with v-model; numbers when the items have number values |
4582
+ | default-value? | `V \| null` | |
4540
4583
  | label? | `string` | Visible group label (otherwise pass aria-label – or place the group in a Field with a label) |
4541
4584
  | orientation? | `RadioGroupOrientation` | |
4542
4585
  | columns? | `number` | Cards in a grid with this many columns (one column on small screens) – for RadioCard |
4543
4586
  | disabled? | `boolean` | |
4544
4587
  | invalid? | `boolean` | |
4545
- | required? | `boolean` | |
4588
+ | required? | `R & boolean` | A choice is required (aria-required). v-model then only gets values (typed `V`, not `V \| null`): a form reset back to an empty start is not passed on |
4546
4589
  | name? | `string` | |
4547
4590
  | classes? | `RecipeClasses<typeof radioGroupRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4548
4591
 
4549
4592
  | Event | Payload | Description |
4550
4593
  | --- | --- | --- |
4551
- | v-model | `value: string \| null` | |
4594
+ | v-model | `value: R extends true ? V : V \| null` | |
4552
4595
 
4553
4596
 
4554
4597
  ### RadioGroupItem
@@ -4562,7 +4605,7 @@ One option of a RadioGroup
4562
4605
 
4563
4606
  | Prop | Type | Description |
4564
4607
  | --- | --- | --- |
4565
- | value | `string` | |
4608
+ | value | `string \| number` | Value of the option – a number makes the group's v-model a number |
4566
4609
  | disabled? | `boolean` | |
4567
4610
  | classes? | `RecipeClasses<typeof radioGroupRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4568
4611
 
@@ -4864,17 +4907,18 @@ Few exclusive options as a segmented switch (radio group)
4864
4907
 
4865
4908
  | Prop | Type | Description |
4866
4909
  | --- | --- | --- |
4867
- | v-model? (modelValue) | `string \| null` | Selected value – use with v-model |
4868
- | default-value? | `string` | |
4910
+ | v-model? (modelValue) | `V \| null` | Selected value – use with v-model |
4911
+ | default-value? | `V` | |
4869
4912
  | label? | `string` | Accessible name of the group (visually hidden) – inside a Field with a label, the Field's label names it |
4870
4913
  | size? | `SegmentedControlSize` | |
4871
4914
  | disabled? | `boolean` | |
4915
+ | required? | `R & boolean` | A value is required (aria-required). v-model then only gets values (typed `V`, not `V \| null`): a form reset back to an empty start is not passed on |
4872
4916
  | name? | `string` | |
4873
4917
  | classes? | `RecipeClasses<typeof segmentedControlRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4874
4918
 
4875
4919
  | Event | Payload | Description |
4876
4920
  | --- | --- | --- |
4877
- | v-model | `value: string \| null` | |
4921
+ | v-model | `value: R extends true ? V : V \| null` | |
4878
4922
 
4879
4923
 
4880
4924
  ### SegmentedControlItem
@@ -4906,8 +4950,9 @@ Dropdown list for one option: arrow keys, typeahead, Escape; native select hidde
4906
4950
  | Prop | Type | Description |
4907
4951
  | --- | --- | --- |
4908
4952
  | items | `readonly T[]` | Options: SelectItem objects – or any objects or values, read with itemValue/itemLabel/itemDisabled/itemGroup |
4909
- | v-model? (modelValue) | `V \| null` | Selected value – use with v-model; any type (string, number, boolean, object) |
4910
- | default-value? | `V \| null` | |
4953
+ | v-model? (modelValue) | `V \| NoInfer<E> \| null` | Selected value – use with v-model; any type (string, number, boolean, object) |
4954
+ | default-value? | `V \| NoInfer<E> \| null` | |
4955
+ | empty-value? | `E` | The value that means "nothing chosen" instead of null, e.g. `""`: it shows the placeholder, and clearing gives it back (v-model is then typed `V \| E`, without null) |
4911
4956
  | placeholder? | `string` | |
4912
4957
  | disabled? | `boolean` | |
4913
4958
  | invalid? | `boolean` | |
@@ -4931,14 +4976,17 @@ Dropdown list for one option: arrow keys, typeahead, Escape; native select hidde
4931
4976
  | min-search-length? | `number` | Fewest characters the search needs before the data source is asked |
4932
4977
  | page-size? | `number` | Options per request of the data source (default 50) |
4933
4978
  | standalone? | `boolean` | Not labelled by a surrounding Field – for a second control inside it (e.g. PhoneInput's country) |
4979
+ | v-model:open? | `boolean` | Whether the list is open – use with v-model:open, or listen to update:open |
4980
+ | stop-key-propagation? | `boolean` | Keeps the keys the list handles itself (Enter choosing or opening, Escape closing, Tab leaving) from bubbling up – e.g. in a dialog with window shortcuts for Enter (save) and Escape (cancel) |
4934
4981
  | id? | `string` | Id of the field (the trigger), e.g. for a `<label for>` |
4935
4982
  | classes? | `RecipeClasses<typeof selectRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4936
4983
 
4937
4984
  | Event | Payload | Description |
4938
4985
  | --- | --- | --- |
4939
- | v-model | `value: V \| null` | |
4986
+ | v-model | `value: V \| NoInfer<E>` | |
4940
4987
  | @filter-change | `text: string` | Text of the search field (filter) – e.g. to load matching items from a server (manualFilter) |
4941
4988
  | @load-more | – | The end of the list was scrolled into view (hasMore) |
4989
+ | v-model:open | `open: boolean` | The list opened or closed |
4942
4990
 
4943
4991
  | Slot | Slot props | Description |
4944
4992
  | --- | --- | --- |
@@ -5389,6 +5437,7 @@ Steps list (tabs) with one panel per step and back/next buttons; the last "Next"
5389
5437
  | is-step-valid? | `(index: number) => boolean` | Blocks "Next" while a step is not valid (with linear) |
5390
5438
  | orientation? | `'horizontal' \| 'vertical'` | Steps listed top to bottom beside the content |
5391
5439
  | label-placement? | `'end' \| 'bottom'` | Label beside the number (default) or below it |
5440
+ | finish-label? | `string` | Text of the last "Next" button, e.g. "Create" (default "Finish") |
5392
5441
  | classes? | `RecipeClasses<typeof stepperRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
5393
5442
 
5394
5443
  | Event | Payload | Description |
@@ -5523,7 +5572,7 @@ Tab panels: tab list with arrow keys, one panel visible
5523
5572
 
5524
5573
  | Prop | Type | Description |
5525
5574
  | --- | --- | --- |
5526
- | v-model? (modelValue) | `string` | Selected tab – use with v-model |
5575
+ | v-model? (modelValue) | `string \| null` | Selected tab – use with v-model; `null`: no tab selected (e.g. tabs of panels that live elsewhere – the first tab stays reachable with Tab) |
5527
5576
  | default-value? | `string` | |
5528
5577
  | label? | `string` | Accessible name of the tab list |
5529
5578
  | orientation? | `'horizontal' \| 'vertical'` | Tab list above (default) or beside the panels |
@@ -5581,6 +5630,7 @@ One tab button
5581
5630
  | icon? | `Component` | Icon component before the label |
5582
5631
  | disabled? | `boolean` | |
5583
5632
  | closable? | `boolean` | Shows a close button (pointer) and closes with the Delete key; `close` reports it – remove the tab (and select another one) yourself. The focus moves to the neighbouring tab |
5633
+ | controls? | `string \| null` | Id of the element the tab shows, when it is not a TabsContent of these Tabs (e.g. a pane elsewhere shown with v-show) – `null`: none (tabs without panels) |
5584
5634
  | classes? | `RecipeClasses<typeof tabsRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
5585
5635
 
5586
5636
  | Event | Payload | Description |
@@ -5627,7 +5677,7 @@ Free entries: Enter or "," adds, Backspace on the empty field selects the last e
5627
5677
 
5628
5678
  ### Textarea
5629
5679
 
5630
- Multi-line text field, optionally growing with the text (autoResize) and with a counter; works inside Field
5680
+ Multi-line text field, optionally growing with the text (autoResize) and with a counter; works inside Field. `ref` reaches the native textarea
5631
5681
 
5632
5682
  - Import: `import { Textarea } from '@wirecore/wirelayer-vue'`
5633
5683
  - Category: Forms
@@ -5649,6 +5699,7 @@ Multi-line text field, optionally growing with the text (autoResize) and with a
5649
5699
  | loading? | `boolean` | Shows a spinner in the corner and marks the field busy (aria-busy) |
5650
5700
  | clearable? | `boolean` | Shows a button that empties the field while it has text |
5651
5701
  | clear-label? | `string` | Accessible name of the clear button (default "Clear input") |
5702
+ | mono? | `boolean` | Monospace font of the theme (JetBrains Mono) – for keys, codes and logs |
5652
5703
  | classes? | `RecipeClasses<typeof textareaRecipe> & RecipeClasses<typeof textareaPartsRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipes textarea and textareaParts) |
5653
5704
 
5654
5705
  | Event | Payload | Description |
@@ -6297,6 +6348,8 @@ Multi-step form on the Stepper: "Next" checks the step (async with a spinner), "
6297
6348
  | default-step? | `number` | |
6298
6349
  | summary-label? | `string` | Name of the summary step – the step appears with the #summary slot (default "Summary") |
6299
6350
  | orientation? | `'horizontal' \| 'vertical'` | Steps listed top to bottom beside the content |
6351
+ | finish-label? | `string` | Text of the last button, e.g. "Create" (default "Finish") |
6352
+ | focus-on-step-change? | `boolean` | Moves the focus into a new step when the step changes: to the element marked data-autoselect (text selected), data-autofocus or autofocus, otherwise to the step's first field |
6300
6353
  | classes? | `RecipeClasses<typeof wizardRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
6301
6354
 
6302
6355
  | Event | Payload | Description |
@@ -6368,6 +6421,7 @@ Year field ("2026"): type the digits, or pick from the year grid; range: start
6368
6421
  - `emptyConditionGroup` (`@wirecore/wirelayer-vue`): –
6369
6422
  - `expandRecurrence` (`@wirecore/wirelayer-vue`): –
6370
6423
  - `firstError` (`@wirecore/wirelayer-vue/form`): First readable message of TanStack Form errors (strings or Standard Schema issues).
6424
+ - `focusFirst` (`@wirecore/wirelayer-vue`): –
6371
6425
  - `formatColor` (`@wirecore/wirelayer-vue`): –
6372
6426
  - `formatHotkey` (`@wirecore/wirelayer-vue`): –
6373
6427
  - `formatHotkeyText` (`@wirecore/wirelayer-vue`): –
@@ -6400,6 +6454,7 @@ Year field ("2026"): type the digits, or pick from the year grid; range: start
6400
6454
  - `provideRecipes` (`@wirecore/wirelayer-vue`): Adds overrides for the components below (inner ones win) – used by RecipesProvider
6401
6455
  - `registerLocale` (`@wirecore/wirelayer-vue`): –
6402
6456
  - `removeTreeNode` (`@wirecore/wirelayer-vue`): –
6457
+ - `resolveTokens` (`@wirecore/wirelayer-vue`): –
6403
6458
  - `rowsToDataSource` (`@wirecore/wirelayer-vue/data-table`): –
6404
6459
  - `toast` (`@wirecore/wirelayer-vue`): –
6405
6460
  - `toaster` (`@wirecore/wirelayer-vue`): –
@@ -6437,6 +6492,7 @@ Year field ("2026"): type the digits, or pick from the year grid; range: start
6437
6492
  - `useReducedMotion` (`@wirecore/wirelayer-vue`): Whether the user asked for less motion (prefers-reduced-motion: reduce)
6438
6493
  - `useRegisteredHotkeys` (`@wirecore/wirelayer-vue`): The registered shortcuts (enabled, with a description), updated as components register them
6439
6494
  - `useResizeObserver` (`@wirecore/wirelayer-vue`): The content box of an element as it changes (bind `ref` to it)
6495
+ - `useResolvedTokens` (`@wirecore/wirelayer-vue`): The token colours as fixed values (hex, see resolveTokens) – for canvas libraries like xterm.js that cannot read CSS variables; new values when the mode, the theme or the system colour scheme changes. On the server: the light base colours as written
6440
6496
  - `useScrollSpy` (`@wirecore/wirelayer-vue`): The id of the section being read: the last of `ids` whose top passed `offset` px (e.g. a sticky header) – for a table of contents
6441
6497
  - `useSelection` (`@wirecore/wirelayer-vue`): Selected items of a list: toggle, select all, clear – with "all"/"some" for a header checkbox
6442
6498
  - `useSessionStorage` (`@wirecore/wirelayer-vue`): Like useLocalStorage, in sessionStorage (this tab only, gone when it closes)
@@ -6448,6 +6504,7 @@ Year field ("2026"): type the digits, or pick from the year grid; range: start
6448
6504
  - `useWindowScroll` (`@wirecore/wirelayer-vue`): Scroll position of the window and `scrollTo` (0 on the server)
6449
6505
  - `validateFields` (`@wirecore/wirelayer-vue/form`): Validates some fields of a TanStack form (e.g. one Wizard step) and marks them touched, so their errors show. Resolves with true when none has an error.
6450
6506
  - `virtualRows` (`@wirecore/wirelayer-vue/virtual`): DataTable feature: only the visible rows are rendered with `virtual` – `<DataTable :features="[virtualRows]" virtual>`
6507
+ - `watchTokens` (`@wirecore/wirelayer-vue`): –
6451
6508
 
6452
6509
  ## Guides
6453
6510
 
@@ -7139,6 +7196,39 @@ as `pdfjs-dist` (Apache-2.0), Chart.js, Tiptap and Shiki are installed by the ap
7139
7196
  - **Brand colours:** `checkTheme` lists the pairs below WCAG AA, `suggestThemeFixes` the nearest colours (and `on-*`
7140
7197
  colours) that meet them – an orange `primary` with white text, common in PrimeVue themes, does not.
7141
7198
 
7199
+ ### Desktop apps (dense UI, many dialogs)
7200
+
7201
+ - **Focus from code:** the text fields expose `focus()`, `select()`, `setSelectionRange()` and the native input
7202
+ (`element`) through a template ref – no `$el.querySelector('input')`. In a dialog, mark the first field with
7203
+ `data-autofocus`: a `focus()` in `onMounted` is overridden by the dialog's focus trap.
7204
+ - **Window shortcuts in dialogs:** Enter/Escape listeners on `window` also get the keys of an open list. `Select` and
7205
+ `Combobox` take `stop-key-propagation` and report `v-model:open`; `ContextMenu` reports `v-model:open` and the
7206
+ right-clicked element (`@before-open`).
7207
+ - **Menus at a point:** `close-on-scroll`, `close-on-resize`, `close-on-blur`, and `highlight-first` so Enter takes the
7208
+ first item.
7209
+ - **Closable tabs** are built in: `TabsTrigger closable @close` – the close button is not nested in the tab, Delete
7210
+ closes the focused tab and the focus moves to its neighbour.
7211
+ - **Typed values:** `RadioGroup`, `SegmentedControl` and `NativeSelect` keep the type of the bound value (unions,
7212
+ numbers); `Checkbox` with a boolean model gives booleans.
7213
+ - **Compact parts:** `Progress size="xs"` with `hide-label`, `bar-text` and `status`; `Alert #actions`; `mono` on text
7214
+ fields; `DialogContent title-position="header"` puts the title next to the close button.
7215
+ - **Values that are never empty:** with `required`, `RadioGroup` and `SegmentedControl` give v-model `V` instead of
7216
+ `V | null`; `NativeSelect` without `placeholder` gives `V` instead of `V | ''`; `NumberInput empty-fallback="min"` or
7217
+ `"previous"` refills an emptied field when it is left (typed `number`). `Select empty-value=""` treats an empty string
7218
+ like null – the placeholder shows, clearing gives `""` back.
7219
+ - **Focus in dialogs and wizards:** `data-autoselect` focuses a field and selects its text when the dialog opens (e.g. a
7220
+ prefilled name). For content that changes while it is open, `DialogContent` exposes `focusFirst()` (React:
7221
+ `focusFirst(element)`), and `Wizard focus-on-step-change` moves the focus into each new step. `Wizard finish-label`
7222
+ names the last button; `validate` may return a text, shown as the step's error.
7223
+ - **Panels elsewhere:** `TabsTrigger controls="pane-id"` points a tab at a pane outside the Tabs (`:controls="null"`
7224
+ for none); `Tabs` takes `null` for "no tab selected" – the first tab stays reachable with Tab.
7225
+ - **Context menus by keyboard:** `@before-open` gets a second argument `{ source: 'pointer' | 'keyboard', focused }` –
7226
+ with Shift+F10 or the menu key `focused` is the element with the focus (e.g. the list row).
7227
+ - **Canvas libraries** (xterm.js, charts): `resolveTokens()` gives the token colours of the current mode and theme as hex;
7228
+ `useResolvedTokens()` updates when the mode, the theme or the system colour scheme changes.
7229
+ - **More compact parts:** `Card size="sm"` for lists in dialogs, `Progress status="neutral"` for cancelled work,
7230
+ `Avatar initials="MS"`, and `Code` for code in a sentence without shiki (the look of `InlineCode` from `/code`).
7231
+
7142
7232
  ### Custom theme
7143
7233
 
7144
7234
  A theme overrides any colors per mode. `themeToCss` generates the CSS for it,
package/llms.txt CHANGED
@@ -58,6 +58,7 @@ Full API (props, events, slots, examples) in llms-full.txt next to this file. MC
58
58
  - [ChatThinking](https://wirecore.github.io/WireLayer/?path=/story/vue_data-chat--playground): The reasoning of an answer: collapsed by default, "Thinking …" while it is being written (`@wirecore/wirelayer-vue`)
59
59
  - [ChatToolCall](https://wirecore.github.io/WireLayer/?path=/story/vue_data-chat--playground): A tool call of an assistant: name and status in the summary, arguments and result inside (`@wirecore/wirelayer-vue`)
60
60
  - [Chip](https://wirecore.github.io/WireLayer/?path=/story/vue_data-chip--playground): One option of a ChipGroup (a toggle button); outside a ChipGroup a standalone chip, optionally removable (`@wirecore/wirelayer-vue`)
61
+ - [Code](https://wirecore.github.io/WireLayer/?path=/story/vue_data-code--playground): Code inside a sentence, without syntax colours: the look of InlineCode (/code) without shiki (`@wirecore/wirelayer-vue`)
61
62
  - [CodeHighlight](https://wirecore.github.io/WireLayer/?path=/story/vue_data-codehighlight--playground): Code block with syntax colours; the scroll area is focusable, the copy button copies the plain code (`@wirecore/wirelayer-vue/code`)
62
63
  - [CodeHighlightTabs](https://wirecore.github.io/WireLayer/?path=/story/vue_data-codehighlight--playground): Several files: tabs with the file names (and an icon by type) above the shown code (`@wirecore/wirelayer-vue/code`)
63
64
  - [CompositeChart](https://wirecore.github.io/WireLayer/?path=/story/vue_data-compositechart--playground): Bars and lines in one chart (series[].type), e.g. revenue as bars and margin as a line on a second axis (`@wirecore/wirelayer-vue/chart`)
@@ -169,8 +170,8 @@ Full API (props, events, slots, examples) in llms-full.txt next to this file. MC
169
170
  - [MonthPicker](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-monthpicker--playground): Month field ("10.2026"): type the digits in one go, or pick from the month grid; range: start – end (`@wirecore/wirelayer-vue`)
170
171
  - [MultiSelect](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-multiselect--playground): Select with several values: the list stays open while choosing, Space/Enter toggle an option (`@wirecore/wirelayer-vue`)
171
172
  - [NativeSelect](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-nativeselect--playground): The browser's select: its own keyboard and mobile pickers; inside a Field it is labelled and described (`@wirecore/wirelayer-vue`)
172
- - [NumberInput](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-numberinput--playground): Number field with − / + buttons, arrow keys and locale formatting ("1,234.5") (`@wirecore/wirelayer-vue`)
173
- - [PasswordInput](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-passwordinput--playground): Password field with a button that shows/hides the password (named "Show/Hide password") (`@wirecore/wirelayer-vue`)
173
+ - [NumberInput](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-numberinput--playground): Number field with − / + buttons, arrow keys and locale formatting ("1,234.5"); `ref` reaches the native input (`@wirecore/wirelayer-vue`)
174
+ - [PasswordInput](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-passwordinput--playground): Password field with a button that shows/hides the password (named "Show/Hide password"); `ref` reaches the native input (`@wirecore/wirelayer-vue`)
174
175
  - [PhoneInput](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-phoneinput--playground): Country (flag and calling code, searchable) and the number, formatted for the country; the value is E.164 (`@wirecore/wirelayer-vue`)
175
176
  - [PinInput](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-pininput--playground): Code input (OTP, PIN): one box per character, typing moves on, pasting fills all boxes (`@wirecore/wirelayer-vue`)
176
177
  - [QuarterPicker](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-quarterpicker--playground): Quarter field: type "Q4 2026" (also "2026-Q4", "4/2026") or pick from the four quarters of a year; with range a start and an end quarter. Arrow keys move between the quarters and on into the next or previous year. (`@wirecore/wirelayer-vue`)
@@ -185,7 +186,7 @@ Full API (props, events, slots, examples) in llms-full.txt next to this file. MC
185
186
  - [Switch](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-switch--playground): Without a text the label is left out: Ark names the input by it, an empty one would hide a <label for> (`@wirecore/wirelayer-vue`)
186
187
  - [SwitchGroup](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-switchgroup--playground): role="group" named by its label, described by helper and error text; Switches with a value inside (`@wirecore/wirelayer-vue`)
187
188
  - [TagsInput](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-tagsinput--playground): Free entries: Enter or "," adds, Backspace on the empty field selects the last entry (again removes it), arrow keys move between entries; additions and removals are announced. With suggestions the field is a combobox: Arrow down opens them, Enter adds the highlighted one. (`@wirecore/wirelayer-vue`)
188
- - [Textarea](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-textarea--auto-resize): Multi-line text field, optionally growing with the text (autoResize) and with a counter; works inside Field (`@wirecore/wirelayer-vue`)
189
+ - [Textarea](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-textarea--auto-resize): Multi-line text field, optionally growing with the text (autoResize) and with a counter; works inside Field. `ref` reaches the native textarea (`@wirecore/wirelayer-vue`)
189
190
  - [TimeGrid](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-timegrid--playground): Free time slots for a booking: radio buttons for one time (arrow keys move and choose), toggle buttons for a range (start, then end). Taken slots stay visible but cannot be chosen. (`@wirecore/wirelayer-vue`)
190
191
  - [TimePicker](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-timepicker--playground): Time field: type the digits one after another ("1430"), arrow keys change hour or minute – or pick from the list of times (every `step` minutes). Gives "HH:mm". (`@wirecore/wirelayer-vue`)
191
192
  - [TimeRangePicker](https://wirecore.github.io/WireLayer/?path=/story/vue_forms-timerangepicker--playground): Start and end time in one field ("09:00 – 17:30"): typing runs on from start to end (`@wirecore/wirelayer-vue`)
@@ -274,7 +275,7 @@ Full API (props, events, slots, examples) in llms-full.txt next to this file. MC
274
275
  ## Other
275
276
 
276
277
  - FilterChips: The active filters as a list of chips with remove buttons ("Remove filter Location: Frankfurt") (`@wirecore/wirelayer-vue`)
277
- - Input: Text field with sizes, leading icon, prefix and suffix; works inside Field (`@wirecore/wirelayer-vue`)
278
+ - Input: Text field with sizes, leading icon, prefix and suffix; works inside Field. `ref` reaches the native input (focus, select, setSelectionRange) (`@wirecore/wirelayer-vue`)
278
279
  - KeyValueEditor: Key-value pairs (FormList preset): two inputs per row, duplicate keys marked (`@wirecore/wirelayer-vue/form`)
279
280
  - LocaleProvider: Renders nothing itself; Ark's provider passes locale and direction (keyboard order) on to Ark (`@wirecore/wirelayer-vue`)
280
281
 
@@ -310,5 +311,6 @@ Full API (props, events, slots, examples) in llms-full.txt next to this file. MC
310
311
  - License
311
312
  - Components and APIs side by side
312
313
  - Pitfalls
314
+ - Desktop apps (dense UI, many dialogs)
313
315
  - Custom theme
314
316
  - Component sizes and shapes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wirecore/wirelayer-vue",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "WireLayer components for Vue 3",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -166,8 +166,8 @@
166
166
  "@ark-ui/vue": "^5.39.3",
167
167
  "@internationalized/date": "^3.12.4",
168
168
  "@lucide/vue": "^1.59.0",
169
- "@wirecore/wirelayer-recipes": "^0.6.0",
170
- "@wirecore/wirelayer-tokens": "^0.4.0"
169
+ "@wirecore/wirelayer-recipes": "^0.8.0",
170
+ "@wirecore/wirelayer-tokens": "^0.5.0"
171
171
  },
172
172
  "devDependencies": {
173
173
  "@storybook/addon-a11y": "^10.6.2",