@wirecore/wirelayer-vue 0.7.0 → 0.8.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 (68) hide show
  1. package/dist/{Checkbox-D175nhKK.js → Checkbox-DS2qfQK1.js} +2 -8
  2. package/dist/ContextMenu-B6agwyf_.js +2311 -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-CeZbSy6K.js} +111 -95
  7. package/dist/Tree-DgHt0P5P.js +807 -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/Checkbox/Checkbox.vue.d.ts +26 -23
  11. package/dist/components/Checkbox/Checkbox.vue.d.ts.map +1 -1
  12. package/dist/components/Combobox/Combobox.vue.d.ts +9 -1
  13. package/dist/components/Combobox/Combobox.vue.d.ts.map +1 -1
  14. package/dist/components/CommandPalette/CommandPalette.vue.d.ts +1 -1
  15. package/dist/components/ContextMenu/ContextMenu.vue.d.ts +17 -1
  16. package/dist/components/ContextMenu/ContextMenu.vue.d.ts.map +1 -1
  17. package/dist/components/Dialog/Dialog.vue.d.ts +1 -1
  18. package/dist/components/Dialog/DialogContent.vue.d.ts +5 -0
  19. package/dist/components/Dialog/DialogContent.vue.d.ts.map +1 -1
  20. package/dist/components/Drawer/Drawer.vue.d.ts +1 -1
  21. package/dist/components/Fieldset/Fieldset.vue.d.ts +1 -1
  22. package/dist/components/FilterPanel/FilterPanel.vue.d.ts +1 -1
  23. package/dist/components/HoverCard/HoverCard.vue.d.ts +1 -1
  24. package/dist/components/Input/Input.vue.d.ts +3 -1
  25. package/dist/components/Input/Input.vue.d.ts.map +1 -1
  26. package/dist/components/MaskInput/MaskInput.vue.d.ts +2 -1
  27. package/dist/components/MaskInput/MaskInput.vue.d.ts.map +1 -1
  28. package/dist/components/Menu/Menu.vue.d.ts +9 -1
  29. package/dist/components/Menu/Menu.vue.d.ts.map +1 -1
  30. package/dist/components/Menu/state.d.ts +22 -0
  31. package/dist/components/Menu/state.d.ts.map +1 -1
  32. package/dist/components/NativeSelect/NativeSelect.vue.d.ts +26 -17
  33. package/dist/components/NativeSelect/NativeSelect.vue.d.ts.map +1 -1
  34. package/dist/components/NumberInput/NumberInput.vue.d.ts +1 -1
  35. package/dist/components/NumberInput/NumberInput.vue.d.ts.map +1 -1
  36. package/dist/components/Panel/Panel.vue.d.ts +1 -1
  37. package/dist/components/PasswordInput/PasswordInput.vue.d.ts +9 -3
  38. package/dist/components/PasswordInput/PasswordInput.vue.d.ts.map +1 -1
  39. package/dist/components/Popover/Popover.vue.d.ts +1 -1
  40. package/dist/components/Progress/Progress.vue.d.ts +11 -0
  41. package/dist/components/Progress/Progress.vue.d.ts.map +1 -1
  42. package/dist/components/RadioGroup/RadioGroup.vue.d.ts +24 -25
  43. package/dist/components/RadioGroup/RadioGroup.vue.d.ts.map +1 -1
  44. package/dist/components/RadioGroup/RadioGroupItem.vue.d.ts +2 -1
  45. package/dist/components/RadioGroup/RadioGroupItem.vue.d.ts.map +1 -1
  46. package/dist/components/RadioGroup/context.d.ts +4 -0
  47. package/dist/components/RadioGroup/context.d.ts.map +1 -0
  48. package/dist/components/SegmentedControl/SegmentedControl.vue.d.ts +23 -22
  49. package/dist/components/SegmentedControl/SegmentedControl.vue.d.ts.map +1 -1
  50. package/dist/components/Select/Select.vue.d.ts +9 -1
  51. package/dist/components/Select/Select.vue.d.ts.map +1 -1
  52. package/dist/components/Textarea/Textarea.vue.d.ts +3 -1
  53. package/dist/components/Textarea/Textarea.vue.d.ts.map +1 -1
  54. package/dist/data-table.js +4 -4
  55. package/dist/editor.js +1 -1
  56. package/dist/form.js +2 -2
  57. package/dist/index.d.ts +1 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +2691 -2636
  60. package/dist/pdf.js +3 -3
  61. package/dist/utils/text-field.d.ts +16 -0
  62. package/dist/utils/text-field.d.ts.map +1 -0
  63. package/llms-full.txt +66 -20
  64. package/llms.txt +5 -4
  65. package/package.json +2 -2
  66. package/dist/ContextMenu-BEOEyUa6.js +0 -2235
  67. package/dist/Input-Cn5q0yVE.js +0 -181
  68. 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-CeZbSy6K.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-DgHt0P5P.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,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
 
@@ -973,8 +977,8 @@ Checkbox with label (also indeterminate), works inside Field
973
977
 
974
978
  | Prop | Type | Description |
975
979
  | --- | --- | --- |
976
- | v-model:checked? | `CheckedState` | Controlled state – use with v-model:checked |
977
- | default-checked? | `CheckedState` | |
980
+ | v-model:checked? | `C` | Controlled state – use with v-model:checked |
981
+ | default-checked? | `C` | |
978
982
  | disabled? | `boolean` | |
979
983
  | invalid? | `boolean` | |
980
984
  | required? | `boolean` | |
@@ -985,7 +989,7 @@ Checkbox with label (also indeterminate), works inside Field
985
989
 
986
990
  | Event | Payload | Description |
987
991
  | --- | --- | --- |
988
- | v-model:checked | `checked: CheckedState` | |
992
+ | v-model:checked | `checked: C` | |
989
993
 
990
994
 
991
995
  ### CheckboxCard
@@ -1307,6 +1311,8 @@ Text field with suggestions (autocomplete): type to filter, arrow keys to choose
1307
1311
  | min-search-length? | `number` | Fewest characters typed before the data source is asked |
1308
1312
  | page-size? | `number` | Options per request of the data source (default 50) |
1309
1313
  | id? | `string` | Id of the input, e.g. for a `<label for>` |
1314
+ | v-model:open? | `boolean` | Whether the list is open – use with v-model:open, or listen to update:open |
1315
+ | 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
1316
  | classes? | `RecipeClasses<typeof comboboxRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
1311
1317
 
1312
1318
  | Event | Payload | Description |
@@ -1315,6 +1321,7 @@ Text field with suggestions (autocomplete): type to filter, arrow keys to choose
1315
1321
  | @input-value-change | `inputValue: string` | Every change of the text (typing, choosing, clearing) |
1316
1322
  | @filter-change | `text: string` | Typed text – e.g. to load matching items from a server (manualFilter) |
1317
1323
  | @load-more | – | The end of the list was scrolled into view (hasMore) |
1324
+ | v-model:open | `open: boolean` | The list opened or closed |
1318
1325
 
1319
1326
  | Slot | Slot props | Description |
1320
1327
  | --- | --- | --- |
@@ -1522,13 +1529,18 @@ Opens at the pointer on right click, on touch screens with a long press (and wit
1522
1529
  - Import: `import { ContextMenu } from '@wirecore/wirelayer-vue'`
1523
1530
  - Category: Overlays
1524
1531
  - Example: https://wirecore.github.io/WireLayer/?path=/story/vue_overlays-contextmenu--playground
1525
- - Also takes the props of: MenuItemOptions
1532
+ - Also takes the props of: MenuItemOptions, MenuBehaviorOptions
1526
1533
 
1527
1534
  | Prop | Type | Description |
1528
1535
  | --- | --- | --- |
1529
1536
  | items | `readonly MenuEntry[]` | Items, groups, separators, checkbox items, radio groups and submenus – as in Menu |
1530
1537
  | label? | `string` | Accessible name of the menu – without it the menu is named by the area's content |
1531
1538
  | link-as? | `Component \| string` | Component for link items, e.g. RouterLink or NuxtLink (gets `to` for items with `to`, else `href`); default <a> |
1539
+ | 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) |
1540
+ | close-on-scroll? | `boolean` | Closes when the page (or a container) scrolls |
1541
+ | close-on-resize? | `boolean` | Closes when the window is resized |
1542
+ | close-on-blur? | `boolean` | Closes when the window loses the focus (switching to another window) |
1543
+ | highlight-first? | `boolean` | Highlights the first item when the menu opens, so Enter takes it (as in desktop context menus) |
1532
1544
  | classes? | `RecipeClasses<typeof menuRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
1533
1545
 
1534
1546
  | Event | Payload | Description |
@@ -1536,6 +1548,8 @@ Opens at the pointer on right click, on touch screens with a long press (and wit
1536
1548
  | @select | `value: string` | |
1537
1549
  | @checked-change | `value: string, checked: boolean` | A checkbox item was switched |
1538
1550
  | @value-change | `name: string, value: string` | A radio group got a new value |
1551
+ | v-model:open | `open: boolean` | |
1552
+ | @before-open | `target: Element` | 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) |
1539
1553
 
1540
1554
  | Slot | Slot props | Description |
1541
1555
  | --- | --- | --- |
@@ -1997,6 +2011,7 @@ The modal window of a Dialog: title, description, focus trap, Escape closes
1997
2011
  | --- | --- | --- |
1998
2012
  | title | `string` | |
1999
2013
  | hide-title? | `boolean` | The title only for screen readers – it still names the dialog (e.g. a video in a dialog) |
2014
+ | 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
2015
  | description? | `string` | |
2001
2016
  | icon? | `Component` | Icon component in the coloured box at the top |
2002
2017
  | status? | `DialogStatus` | |
@@ -3019,7 +3034,7 @@ Shows a value as a button; activating it swaps in the editor (Escape closes it)
3019
3034
 
3020
3035
  ### Input
3021
3036
 
3022
- Text field with sizes, leading icon, prefix and suffix; works inside Field
3037
+ Text field with sizes, leading icon, prefix and suffix; works inside Field. `ref` reaches the native input (focus, select, setSelectionRange)
3023
3038
 
3024
3039
  - Import: `import { Input } from '@wirecore/wirelayer-vue'`
3025
3040
 
@@ -3038,6 +3053,7 @@ Text field with sizes, leading icon, prefix and suffix; works inside Field
3038
3053
  | leading-icon? | `Component` | Icon component rendered inside the field, before the text |
3039
3054
  | prefix? | `string` | Static text segment before the input, e.g. `https://` |
3040
3055
  | suffix? | `string` | Static text segment after the input, e.g. `.de` |
3056
+ | mono? | `boolean` | Monospace font of the theme (JetBrains Mono) – for paths, tokens, codes, URLs and keys |
3041
3057
  | classes? | `RecipeClasses<typeof inputRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
3042
3058
 
3043
3059
  | Event | Payload | Description |
@@ -3553,7 +3569,7 @@ The trigger is the slotted element (e.g. a Button or IconButton)
3553
3569
  - Import: `import { Menu } from '@wirecore/wirelayer-vue'`
3554
3570
  - Category: Overlays
3555
3571
  - Example: https://wirecore.github.io/WireLayer/?path=/story/vue_overlays-menu--playground
3556
- - Also takes the props of: MenuItemOptions
3572
+ - Also takes the props of: MenuItemOptions, MenuBehaviorOptions
3557
3573
 
3558
3574
  | Prop | Type | Description |
3559
3575
  | --- | --- | --- |
@@ -3566,6 +3582,10 @@ The trigger is the slotted element (e.g. a Button or IconButton)
3566
3582
  | 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
3583
  | arrow? | `boolean` | Arrow pointing at the trigger, as on the Popover |
3568
3584
  | link-as? | `Component \| string` | Component for link items, e.g. RouterLink or NuxtLink (gets `to` for items with `to`, else `href`); default <a> |
3585
+ | close-on-scroll? | `boolean` | Closes when the page (or a container) scrolls – e.g. for a menu opened at a point |
3586
+ | close-on-resize? | `boolean` | Closes when the window is resized |
3587
+ | close-on-blur? | `boolean` | Closes when the window loses the focus (switching to another window) |
3588
+ | highlight-first? | `boolean` | Highlights the first item also when the menu opens by pointer, so Enter takes it (as in desktop menus) |
3569
3589
  | classes? | `RecipeClasses<typeof menuRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
3570
3590
 
3571
3591
  | Event | Payload | Description |
@@ -3775,8 +3795,8 @@ The browser's select: its own keyboard and mobile pickers; inside a Field it is
3775
3795
 
3776
3796
  | Prop | Type | Description |
3777
3797
  | --- | --- | --- |
3778
- | items | `readonly NativeSelectOption[]` | |
3779
- | v-model? (modelValue) | `string` | Chosen value – use with v-model |
3798
+ | items | `readonly NativeSelectOption<V>[]` | |
3799
+ | v-model? (modelValue) | `V \| ''` | Chosen value – use with v-model; the placeholder option gives an empty string |
3780
3800
  | placeholder? | `string` | First, empty option, e.g. "Please choose" |
3781
3801
  | size? | `Size` | |
3782
3802
  | invalid? | `boolean` | |
@@ -3785,7 +3805,7 @@ The browser's select: its own keyboard and mobile pickers; inside a Field it is
3785
3805
 
3786
3806
  | Event | Payload | Description |
3787
3807
  | --- | --- | --- |
3788
- | v-model | `value: string` | |
3808
+ | v-model | `value: V \| ''` | |
3789
3809
 
3790
3810
 
3791
3811
  ### NavigationMenu
@@ -3872,7 +3892,7 @@ A number in the format of the locale ("€1,234.50")
3872
3892
 
3873
3893
  ### NumberInput
3874
3894
 
3875
- Number field with − / + buttons, arrow keys and locale formatting ("1,234.5")
3895
+ Number field with − / + buttons, arrow keys and locale formatting ("1,234.5"); `ref` reaches the native input
3876
3896
 
3877
3897
  - Import: `import { NumberInput } from '@wirecore/wirelayer-vue'`
3878
3898
  - Category: Forms
@@ -4112,7 +4132,7 @@ Card with a heading (and actions); toggleable: the heading holds a button with a
4112
4132
 
4113
4133
  ### PasswordInput
4114
4134
 
4115
- Password field with a button that shows/hides the password (named "Show/Hide password")
4135
+ Password field with a button that shows/hides the password (named "Show/Hide password"); `ref` reaches the native input
4116
4136
 
4117
4137
  - Import: `import { PasswordInput } from '@wirecore/wirelayer-vue'`
4118
4138
  - Category: Forms
@@ -4131,7 +4151,7 @@ Password field with a button that shows/hides the password (named "Show/Hide pas
4131
4151
  | name? | `string` | |
4132
4152
  | default-visible? | `boolean` | Initially show the password in plain text |
4133
4153
  | v-model:visible? | `boolean` | Whether the password is shown in plain text – use with v-model:visible |
4134
- | autocomplete? | `'current-password' \| 'new-password'` | |
4154
+ | 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
4155
  | strength? | `boolean` | Strength meter below the field – for choosing a new password |
4136
4156
  | 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
4157
  | loading? | `boolean` | Shows a spinner in the field and marks it busy (aria-busy) |
@@ -4139,6 +4159,7 @@ Password field with a button that shows/hides the password (named "Show/Hide pas
4139
4159
  | clear-label? | `string` | Accessible name of the clear button (default "Clear input") |
4140
4160
  | default-value? | `string` | Initial value without v-model |
4141
4161
  | id? | `string` | Id of the input, e.g. for a `<label for>` |
4162
+ | mono? | `boolean` | Monospace font of the theme (JetBrains Mono) – for tokens, passphrases and keys |
4142
4163
  | classes? | `RecipeClasses<typeof passwordInputRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4143
4164
 
4144
4165
  | Event | Payload | Description |
@@ -4408,6 +4429,10 @@ Ark names the progressbar after its value; the label is the name, the value its
4408
4429
  | striped? | `boolean` | Diagonal stripes on the filled part |
4409
4430
  | animated? | `boolean` | Moving stripes (only without reduced motion) |
4410
4431
  | orientation? | `'horizontal' \| 'vertical'` | Vertical bar (fills the height of its parent) |
4432
+ | size? | `'xs' \| 'md'` | `xs`: a thin bar with small text, e.g. in a list or a status bar |
4433
+ | status? | `'info' \| 'success' \| 'warn' \| 'danger'` | Colour of the filled part by its state, e.g. `danger` for a failed transfer |
4434
+ | hide-label? | `boolean` | The label only for screen readers – it still names the progress bar |
4435
+ | 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
4436
  | classes? | `RecipeClasses<typeof progressRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4412
4437
 
4413
4438
 
@@ -4535,8 +4560,8 @@ One choice out of several (role="radiogroup", arrow keys), horizontal or vertica
4535
4560
 
4536
4561
  | Prop | Type | Description |
4537
4562
  | --- | --- | --- |
4538
- | v-model? (modelValue) | `string \| null` | Selected value – use with v-model |
4539
- | default-value? | `string \| null` | |
4563
+ | v-model? (modelValue) | `V \| null` | Selected value – use with v-model; numbers when the items have number values |
4564
+ | default-value? | `V \| null` | |
4540
4565
  | label? | `string` | Visible group label (otherwise pass aria-label – or place the group in a Field with a label) |
4541
4566
  | orientation? | `RadioGroupOrientation` | |
4542
4567
  | columns? | `number` | Cards in a grid with this many columns (one column on small screens) – for RadioCard |
@@ -4548,7 +4573,7 @@ One choice out of several (role="radiogroup", arrow keys), horizontal or vertica
4548
4573
 
4549
4574
  | Event | Payload | Description |
4550
4575
  | --- | --- | --- |
4551
- | v-model | `value: string \| null` | |
4576
+ | v-model | `value: V \| null` | |
4552
4577
 
4553
4578
 
4554
4579
  ### RadioGroupItem
@@ -4562,7 +4587,7 @@ One option of a RadioGroup
4562
4587
 
4563
4588
  | Prop | Type | Description |
4564
4589
  | --- | --- | --- |
4565
- | value | `string` | |
4590
+ | value | `string \| number` | Value of the option – a number makes the group's v-model a number |
4566
4591
  | disabled? | `boolean` | |
4567
4592
  | classes? | `RecipeClasses<typeof radioGroupRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4568
4593
 
@@ -4864,8 +4889,8 @@ Few exclusive options as a segmented switch (radio group)
4864
4889
 
4865
4890
  | Prop | Type | Description |
4866
4891
  | --- | --- | --- |
4867
- | v-model? (modelValue) | `string \| null` | Selected value – use with v-model |
4868
- | default-value? | `string` | |
4892
+ | v-model? (modelValue) | `V \| null` | Selected value – use with v-model |
4893
+ | default-value? | `V` | |
4869
4894
  | label? | `string` | Accessible name of the group (visually hidden) – inside a Field with a label, the Field's label names it |
4870
4895
  | size? | `SegmentedControlSize` | |
4871
4896
  | disabled? | `boolean` | |
@@ -4874,7 +4899,7 @@ Few exclusive options as a segmented switch (radio group)
4874
4899
 
4875
4900
  | Event | Payload | Description |
4876
4901
  | --- | --- | --- |
4877
- | v-model | `value: string \| null` | |
4902
+ | v-model | `value: V \| null` | |
4878
4903
 
4879
4904
 
4880
4905
  ### SegmentedControlItem
@@ -4931,6 +4956,8 @@ Dropdown list for one option: arrow keys, typeahead, Escape; native select hidde
4931
4956
  | min-search-length? | `number` | Fewest characters the search needs before the data source is asked |
4932
4957
  | page-size? | `number` | Options per request of the data source (default 50) |
4933
4958
  | standalone? | `boolean` | Not labelled by a surrounding Field – for a second control inside it (e.g. PhoneInput's country) |
4959
+ | v-model:open? | `boolean` | Whether the list is open – use with v-model:open, or listen to update:open |
4960
+ | 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
4961
  | id? | `string` | Id of the field (the trigger), e.g. for a `<label for>` |
4935
4962
  | classes? | `RecipeClasses<typeof selectRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipe) |
4936
4963
 
@@ -4939,6 +4966,7 @@ Dropdown list for one option: arrow keys, typeahead, Escape; native select hidde
4939
4966
  | v-model | `value: V \| null` | |
4940
4967
  | @filter-change | `text: string` | Text of the search field (filter) – e.g. to load matching items from a server (manualFilter) |
4941
4968
  | @load-more | – | The end of the list was scrolled into view (hasMore) |
4969
+ | v-model:open | `open: boolean` | The list opened or closed |
4942
4970
 
4943
4971
  | Slot | Slot props | Description |
4944
4972
  | --- | --- | --- |
@@ -5627,7 +5655,7 @@ Free entries: Enter or "," adds, Backspace on the empty field selects the last e
5627
5655
 
5628
5656
  ### Textarea
5629
5657
 
5630
- Multi-line text field, optionally growing with the text (autoResize) and with a counter; works inside Field
5658
+ Multi-line text field, optionally growing with the text (autoResize) and with a counter; works inside Field. `ref` reaches the native textarea
5631
5659
 
5632
5660
  - Import: `import { Textarea } from '@wirecore/wirelayer-vue'`
5633
5661
  - Category: Forms
@@ -5649,6 +5677,7 @@ Multi-line text field, optionally growing with the text (autoResize) and with a
5649
5677
  | loading? | `boolean` | Shows a spinner in the corner and marks the field busy (aria-busy) |
5650
5678
  | clearable? | `boolean` | Shows a button that empties the field while it has text |
5651
5679
  | clear-label? | `string` | Accessible name of the clear button (default "Clear input") |
5680
+ | mono? | `boolean` | Monospace font of the theme (JetBrains Mono) – for keys, codes and logs |
5652
5681
  | classes? | `RecipeClasses<typeof textareaRecipe> & RecipeClasses<typeof textareaPartsRecipe>` | Extra classes per part of the component, e.g. { base: "…" } (see the recipes textarea and textareaParts) |
5653
5682
 
5654
5683
  | Event | Payload | Description |
@@ -7139,6 +7168,23 @@ as `pdfjs-dist` (Apache-2.0), Chart.js, Tiptap and Shiki are installed by the ap
7139
7168
  - **Brand colours:** `checkTheme` lists the pairs below WCAG AA, `suggestThemeFixes` the nearest colours (and `on-*`
7140
7169
  colours) that meet them – an orange `primary` with white text, common in PrimeVue themes, does not.
7141
7170
 
7171
+ ### Desktop apps (dense UI, many dialogs)
7172
+
7173
+ - **Focus from code:** the text fields expose `focus()`, `select()`, `setSelectionRange()` and the native input
7174
+ (`element`) through a template ref – no `$el.querySelector('input')`. In a dialog, mark the first field with
7175
+ `data-autofocus`: a `focus()` in `onMounted` is overridden by the dialog's focus trap.
7176
+ - **Window shortcuts in dialogs:** Enter/Escape listeners on `window` also get the keys of an open list. `Select` and
7177
+ `Combobox` take `stop-key-propagation` and report `v-model:open`; `ContextMenu` reports `v-model:open` and the
7178
+ right-clicked element (`@before-open`).
7179
+ - **Menus at a point:** `close-on-scroll`, `close-on-resize`, `close-on-blur`, and `highlight-first` so Enter takes the
7180
+ first item.
7181
+ - **Closable tabs** are built in: `TabsTrigger closable @close` – the close button is not nested in the tab, Delete
7182
+ closes the focused tab and the focus moves to its neighbour.
7183
+ - **Typed values:** `RadioGroup`, `SegmentedControl` and `NativeSelect` keep the type of the bound value (unions,
7184
+ numbers); `Checkbox` with a boolean model gives booleans.
7185
+ - **Compact parts:** `Progress size="xs"` with `hide-label`, `bar-text` and `status`; `Alert #actions`; `mono` on text
7186
+ fields; `DialogContent title-position="header"` puts the title next to the close button.
7187
+
7142
7188
  ### Custom theme
7143
7189
 
7144
7190
  A theme overrides any colors per mode. `themeToCss` generates the CSS for it,
package/llms.txt CHANGED
@@ -169,8 +169,8 @@ Full API (props, events, slots, examples) in llms-full.txt next to this file. MC
169
169
  - [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
170
  - [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
171
  - [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`)
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"); `ref` reaches the native input (`@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"); `ref` reaches the native input (`@wirecore/wirelayer-vue`)
174
174
  - [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
175
  - [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
176
  - [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 +185,7 @@ Full API (props, events, slots, examples) in llms-full.txt next to this file. MC
185
185
  - [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
186
  - [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
187
  - [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`)
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. `ref` reaches the native textarea (`@wirecore/wirelayer-vue`)
189
189
  - [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
190
  - [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
191
  - [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 +274,7 @@ Full API (props, events, slots, examples) in llms-full.txt next to this file. MC
274
274
  ## Other
275
275
 
276
276
  - 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`)
277
+ - 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
278
  - KeyValueEditor: Key-value pairs (FormList preset): two inputs per row, duplicate keys marked (`@wirecore/wirelayer-vue/form`)
279
279
  - LocaleProvider: Renders nothing itself; Ark's provider passes locale and direction (keyboard order) on to Ark (`@wirecore/wirelayer-vue`)
280
280
 
@@ -310,5 +310,6 @@ Full API (props, events, slots, examples) in llms-full.txt next to this file. MC
310
310
  - License
311
311
  - Components and APIs side by side
312
312
  - Pitfalls
313
+ - Desktop apps (dense UI, many dialogs)
313
314
  - Custom theme
314
315
  - 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.8.0",
4
4
  "description": "WireLayer components for Vue 3",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -166,7 +166,7 @@
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",
169
+ "@wirecore/wirelayer-recipes": "^0.7.0",
170
170
  "@wirecore/wirelayer-tokens": "^0.4.0"
171
171
  },
172
172
  "devDependencies": {