@synopackageland/ui 0.17.6 → 0.17.7

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.17.7 (2026-10-29)
4
+
5
+ Additive only: existing props, defaults and DOM stay as they were, apart from one new attribute on `Fieldset`.
6
+
7
+ - `AppLayout` takes a `#tabbar` slot, rendered only in the mobile presentation after the content. A filled layout ends its column with it; a layout that scrolls the document pins it to the viewport bottom and keeps the content's end clear of it.
8
+ - Add `AppTabBar`: a phone's bottom navigation of icon-over-label tabs (`items`, `v-model` key, `aria-current="page"`), 56px (`--ui-tab-bar-height`) plus the device safe area. A tab's `badge` shows a count (99+ above 99, none at 0) or, with `true`, a dot, each named for a screen reader. Inside an `AppLayout` with a sidebar it adds a More tab that opens the navigation drawer (`more` turns it on or off and it always emits `more`); while that tab is shown, the phone bar drops its menu button, so the drawer has one way in, and focus returns to More when the drawer closes. With no brand to show, the phone bar is then left out. A layout without a tab bar, or with `:more="false"`, keeps the menu button. It hides while a touch keyboard is open and when `hidden` is set.
9
+ - Add `CompletionToggle`: a round done toggle (`role="checkbox"`, `v-model`) with a 44px touch target (32px with a mouse) that fills and draws its check when it turns done. `pending` dims it and ignores presses while the app saves; `error` marks a failed change. Its click does not reach the row underneath.
10
+ - Add `MentionTextarea`: a plain-text box where `@` at a word start opens a list of people the app supplies (`candidates`, answered from `search`). A chosen person is written `@Label` and kept in `v-model:mentions`; arrows, Enter or Tab choose, Escape closes, and an input method's Enter is left alone. With `maxlength` it counts the stored characters from 90% of the limit and over it, without cutting the text.
11
+ - Add `CommentItem`: avatar, author, time (`<time datetime>`), and a plain-text body keeping line breaks, showing `@[id]` mentions as names (grey for an inactive account) and http(s) addresses as links. `edited` adds Edited; `deleted` keeps the place with "This comment was deleted"; `highlighted` flashes it once; `#actions` sits beside the header.
12
+ - Add `mentionTokens`, `mentionText` and `mentionParts` to turn `@Label` text into `@[id]` tokens, back, and into display parts.
13
+ - New strings in all nine built-in languages: "Quick navigation", "{count} unread", "Unread", "Done", "Edited", "This comment was deleted", "{count} characters left", "{count} characters over the limit", "People" and "No matching people".
14
+ - Add `FormGroup`: the options under a parent checkbox or switch, as DSM draws them. It indents its content one 28px level (`indent` takes levels or a CSS length) and, with `disabled` (usually `!parentOn`), disables everything inside: it is a native `<fieldset>`, and `Input`, `Textarea`, `Select`, `Combobox`, `SearchField`, `Checkbox`, `CheckboxGroup`, `RadioGroup`, `Switch`, `InputSteppers`, `Button` and `FormItem` labels read the state, so they look disabled too. Groups nest; the indent adds up. A `FormItem` inside gives the group's indent up from its label column, so its control stays on the form's column (`data-ui-form-group`, `data-disabled`). `useFormGroup()` and `useGroupDisabled()` let a custom control follow it.
15
+ - Add `FormNote`: DSM's teal "Note:" heading over a bulleted list (`items`) or a sentence (slot), set apart from the fields above it (`role="note"`, `data-ui-form-note`). The heading is in the UI language; `title` replaces it.
16
+ - Add `InfoBox`: DSM's flat blue box for facts to read or copy, such as addresses (`data-ui-info-box`), with an optional `title`.
17
+ - `Form` takes `labelWidth`: one label column for every `FormItem`, `SettingsRow` and `FormActions inset` in it, still capped at 40% of a narrow row.
18
+ - Fields, `FormGroup`s, `FormNote`s and `InfoBox`es inside a form keep the form's field gap; a note or info box after fields starts 16px down. `Fieldset` sections one after another are 20px apart (`data-ui-fieldset`).
19
+ - A `DataGrid` or `DataTable` inside a `FormItem` no longer lets a checkbox or select in a cell take over the field: the label keeps its own id and stays at full strength when a cell control is disabled.
20
+ - New theme tokens `--ui-note-title` and `--ui-info-box-bg`, with dark values.
21
+ - New string in all nine built-in languages: "Note:".
22
+
3
23
  ## 0.17.6 (2026-10-29)
4
24
 
5
25
  - The `syno-pkg-land-ui` bin path is written without a leading `./`, so npm keeps the command in the published registry metadata.
package/README.md CHANGED
@@ -522,13 +522,14 @@ DSM-style application building blocks:
522
522
 
523
523
  - SearchField
524
524
  - SettingsRow / SettingsSection
525
+ - Form / FormItem / FormGroup / FormNote / InfoBox / FormActions / Fieldset (DSM-native settings structure, see [docs/layout-rules.md](docs/layout-rules.md))
525
526
  - Callout (see [docs/callout.md](docs/callout.md) for when to use a Callout, a toast or an inline note) / EmptyState / StepList
526
527
  - ConnectionTopology
527
528
  - DataTable / DataGrid
528
529
  - TreeView
529
530
  - FilePicker
530
531
  - AppRoot (DSM-embedded app root)
531
- - AppLayout / AppSidebar / AppToolbar / AppActionBar
532
+ - AppLayout / AppSidebar / AppToolbar / AppActionBar / AppTabBar
532
533
  - PageHeader / SectionTabs
533
534
  - Statistic / StatTile / StatTileGroup
534
535
  - SplitPane / StorageMeter / StackedBar (see [docs/size-and-split.md](docs/size-and-split.md))
@@ -597,6 +598,57 @@ narrower.
597
598
  </StatTileGroup>
598
599
  ```
599
600
 
601
+ ### AppTabBar: a phone's bottom navigation
602
+
603
+ Put an `AppTabBar` in `AppLayout`'s `#tabbar` slot. It shows only in the mobile
604
+ presentation: four or so tabs of an icon over a short label, 56px tall plus the
605
+ device's safe area, the selected one `aria-current="page"`. A tab's `badge` is
606
+ a count (99+ above 99, nothing at 0) or `true` for a dot. In a layout with a
607
+ sidebar a last More tab opens the navigation drawer and takes the place of the
608
+ phone bar's menu button (a layout without a tab bar keeps it). The bar hides while a
609
+ touch keyboard is open; set `hidden` while a full-screen drawer covers the page.
610
+
611
+ ```vue
612
+ <AppLayout height="fill">
613
+ <template #sidebar><AppSidebar v-model="page" :groups="groups" /></template>
614
+ <template #tabbar>
615
+ <AppTabBar v-model="tab" :items="[
616
+ { key: 'home', label: 'Home', icon: House },
617
+ { key: 'work', label: 'My work', icon: Bell, badge: unread },
618
+ ]" />
619
+ </template>
620
+ <RouterView />
621
+ </AppLayout>
622
+ ```
623
+
624
+ ### Collaboration: CompletionToggle, MentionTextarea, CommentItem
625
+
626
+ `CompletionToggle` is the round done toggle of a task row, card or detail
627
+ header: a `role="checkbox"` with a 44px touch target. Show the new state at
628
+ once, set `pending` while it saves, and on failure put the old state back and
629
+ set `error`. Its click does not reach the row, so it never also opens the item.
630
+ Name it after the item: `label="Done: Send the quote"`.
631
+
632
+ `MentionTextarea` opens a list of people on `@`. The app owns the people: it
633
+ answers `search` (the text after `@`) by setting `candidates`, and turns
634
+ `filter` off when its server already matched them. A chosen person is written
635
+ `@Label` in the text and kept in `v-model:mentions`; `mentionTokens(text,
636
+ mentions).body` is what to store, with `@[id]` tokens, and `mentionText(body,
637
+ people)` turns a stored body back for editing. With `maxlength` the box counts
638
+ the stored characters near and over the limit; it never cuts text, so disable
639
+ sending while it is over (`data-over`).
640
+
641
+ `CommentItem` shows one comment: avatar, author, the time as the app formats
642
+ it, and the stored body with its line breaks, mentions as names and http(s)
643
+ links. `edited`, `deleted` and `highlighted` (a one-time flash for a comment
644
+ opened from a notification) cover the rest; edit and delete controls go in
645
+ `#actions`.
646
+
647
+ ```vue
648
+ <CommentItem v-for="c in comments" :key="c.id" :author="c.author.name" :time="c.when" :body="c.body" :mentions="c.mentions" :edited="!!c.editedAt" :deleted="c.deleted" />
649
+ <MentionTextarea v-model="text" v-model:mentions="mentions" :candidates="people" :filter="false" :maxlength="4000" @search="findPeople" />
650
+ ```
651
+
600
652
  ### Status: StatusDot, StepList, ConnectionTopology
601
653
 
602
654
  `StatusDot` is an 8px tone dot; `pulse` ripples a ring out of it for a state
@@ -0,0 +1,6 @@
1
+ type __VLS_Props = {
2
+ part: 'tasks' | 'comments';
3
+ };
4
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
5
+ declare const _default: typeof __VLS_export;
6
+ export default _default;
@@ -32,6 +32,8 @@ type __VLS_Slots = {
32
32
  toolbar?: () => unknown;
33
33
  default?: () => unknown;
34
34
  footer?: () => unknown;
35
+ /** A phone's bottom tab bar (AppTabBar), shown only in the mobile presentation. */
36
+ tabbar?: () => unknown;
35
37
  };
36
38
  declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
37
39
  brand: (event: MouseEvent) => any;
@@ -0,0 +1,37 @@
1
+ import { Component } from 'vue';
2
+ export type AppTabBarItem = {
3
+ key: string;
4
+ label: string;
5
+ icon?: Component;
6
+ /** A count shows as a number (99+ above 99) and 0 as nothing; `true` shows a dot. */
7
+ badge?: number | boolean;
8
+ disabled?: boolean;
9
+ };
10
+ type __VLS_Props = {
11
+ items: AppTabBarItem[];
12
+ /** The selected tab's key. */
13
+ modelValue?: string;
14
+ /**
15
+ * Adds a last More tab. Defaults to on inside an AppLayout with a sidebar,
16
+ * where it opens the navigation drawer; it always emits `more`.
17
+ */
18
+ more?: boolean;
19
+ /** Hides the bar, for example while a full-screen drawer covers the page. */
20
+ hidden?: boolean;
21
+ /** Accessible name of the bar. */
22
+ ariaLabel?: string;
23
+ };
24
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
25
+ "update:modelValue": (key: string) => any;
26
+ more: () => any;
27
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
28
+ "onUpdate:modelValue"?: ((key: string) => any) | undefined;
29
+ onMore?: (() => any) | undefined;
30
+ }>, {
31
+ modelValue: string;
32
+ ariaLabel: string;
33
+ hidden: boolean;
34
+ more: boolean;
35
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
36
+ declare const _default: typeof __VLS_export;
37
+ export default _default;
@@ -0,0 +1,46 @@
1
+ import { MentionCandidate } from '../../../lib/mentions';
2
+ type __VLS_Props = {
3
+ author: string;
4
+ /** Keeps the avatar colour stable across renamed accounts. */
5
+ authorId?: string;
6
+ /** Avatar picture; the author's first character otherwise. */
7
+ avatar?: string;
8
+ /** The time as shown, formatted by the app: `Yesterday 17:20`. */
9
+ time?: string;
10
+ /** The same time for machines (`<time datetime>`), such as an ISO string. */
11
+ datetime?: string;
12
+ /** Plain text with `@[id]` mention tokens. */
13
+ body?: string;
14
+ /** Names for the mention tokens; an unknown id shows as itself. */
15
+ mentions?: MentionCandidate[];
16
+ edited?: boolean;
17
+ deleted?: boolean;
18
+ highlighted?: boolean;
19
+ };
20
+ declare var __VLS_1: {}, __VLS_8: {}, __VLS_10: {};
21
+ type __VLS_Slots = {} & {
22
+ avatar?: (props: typeof __VLS_1) => any;
23
+ } & {
24
+ actions?: (props: typeof __VLS_8) => any;
25
+ } & {
26
+ default?: (props: typeof __VLS_10) => any;
27
+ };
28
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
29
+ body: string;
30
+ time: string;
31
+ avatar: string;
32
+ mentions: MentionCandidate[];
33
+ authorId: string;
34
+ datetime: string;
35
+ edited: boolean;
36
+ deleted: boolean;
37
+ highlighted: boolean;
38
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
39
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
40
+ declare const _default: typeof __VLS_export;
41
+ export default _default;
42
+ type __VLS_WithSlots<T, S> = T & {
43
+ new (): {
44
+ $slots: S;
45
+ };
46
+ };
@@ -0,0 +1,26 @@
1
+ type __VLS_Props = {
2
+ /** Done. */
3
+ modelValue?: boolean;
4
+ /** Saving: the ring dims and ignores presses but keeps focus. */
5
+ pending?: boolean;
6
+ /** The last change failed; the ring turns red and shakes once. */
7
+ error?: boolean;
8
+ disabled?: boolean;
9
+ /** Accessible name, best naming the item: `Done: Send the quote`. Defaults to "Done". */
10
+ label?: string;
11
+ };
12
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
13
+ change: (done: boolean) => any;
14
+ "update:modelValue": (done: boolean) => any;
15
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
16
+ onChange?: ((done: boolean) => any) | undefined;
17
+ "onUpdate:modelValue"?: ((done: boolean) => any) | undefined;
18
+ }>, {
19
+ label: string;
20
+ disabled: boolean;
21
+ pending: boolean;
22
+ error: boolean;
23
+ modelValue: boolean;
24
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
25
+ declare const _default: typeof __VLS_export;
26
+ export default _default;
@@ -12,6 +12,8 @@ type __VLS_Props = {
12
12
  fieldWidth?: FieldWidth;
13
13
  /** Default message placement; a FormItem can override it. */
14
14
  validateMessageDisplayMode?: ValidateMessageDisplayMode;
15
+ /** One label column for every FormItem, FormActions `inset` and SettingsRow in the form (a CSS length); still capped at 40% of a narrow row. */
16
+ labelWidth?: string;
15
17
  };
16
18
  /** Validates every field; resolves `true` only when all of them pass. */
17
19
  declare function validate(trigger?: ValidateTrigger | null, options?: {
@@ -0,0 +1,22 @@
1
+ type __VLS_Props = {
2
+ /** Indent levels (multiples of 28px) or any CSS length. */
3
+ indent?: number | string;
4
+ /** Disables every control in the group, usually `!parentOn`. */
5
+ disabled?: boolean;
6
+ };
7
+ declare var __VLS_1: {};
8
+ type __VLS_Slots = {} & {
9
+ default?: (props: typeof __VLS_1) => any;
10
+ };
11
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
12
+ disabled: boolean;
13
+ indent: number | string;
14
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
15
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
16
+ declare const _default: typeof __VLS_export;
17
+ export default _default;
18
+ type __VLS_WithSlots<T, S> = T & {
19
+ new (): {
20
+ $slots: S;
21
+ };
22
+ };
@@ -0,0 +1,19 @@
1
+ type __VLS_Props = {
2
+ /** Replaces the "Note:" heading. */
3
+ title?: string;
4
+ /** One bullet each; the default slot follows them. */
5
+ items?: string[];
6
+ };
7
+ declare var __VLS_1: {};
8
+ type __VLS_Slots = {} & {
9
+ default?: (props: typeof __VLS_1) => any;
10
+ };
11
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
15
+ type __VLS_WithSlots<T, S> = T & {
16
+ new (): {
17
+ $slots: S;
18
+ };
19
+ };
@@ -0,0 +1,17 @@
1
+ type __VLS_Props = {
2
+ /** One line over the content. */
3
+ title?: string;
4
+ };
5
+ declare var __VLS_1: {};
6
+ type __VLS_Slots = {} & {
7
+ default?: (props: typeof __VLS_1) => any;
8
+ };
9
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
10
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
11
+ declare const _default: typeof __VLS_export;
12
+ export default _default;
13
+ type __VLS_WithSlots<T, S> = T & {
14
+ new (): {
15
+ $slots: S;
16
+ };
17
+ };
@@ -0,0 +1,52 @@
1
+ import { MentionCandidate } from '../../../lib/mentions';
2
+ type __VLS_Props = {
3
+ modelValue?: string;
4
+ /** The people mentioned so far, each still written as `@Label` in the text. */
5
+ mentions?: MentionCandidate[];
6
+ /** People to offer for the current query. */
7
+ candidates?: MentionCandidate[];
8
+ /** Narrows `candidates` by the query here; turn off when the server already did. */
9
+ filter?: boolean;
10
+ /** Shows "Loading…" in the list while the caller fetches. */
11
+ loading?: boolean;
12
+ /** Characters the stored body may hold; the count shows from 90% and over. */
13
+ maxlength?: number;
14
+ /** Where the list opens; `top` suits a box pinned to the bottom of a screen. */
15
+ side?: 'top' | 'bottom';
16
+ placeholder?: string;
17
+ /** Visible lines before it grows; it grows with its text to about eight lines where the browser supports it. */
18
+ rows?: number;
19
+ disabled?: boolean;
20
+ invalid?: boolean;
21
+ id?: string;
22
+ ariaLabel?: string;
23
+ };
24
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {
25
+ focus: () => void | undefined;
26
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
27
+ search: (query: string) => any;
28
+ select: (person: MentionCandidate) => any;
29
+ "update:modelValue": (text: string) => any;
30
+ "update:mentions": (mentions: MentionCandidate[]) => any;
31
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
32
+ onSearch?: ((query: string) => any) | undefined;
33
+ onSelect?: ((person: MentionCandidate) => any) | undefined;
34
+ "onUpdate:modelValue"?: ((text: string) => any) | undefined;
35
+ "onUpdate:mentions"?: ((mentions: MentionCandidate[]) => any) | undefined;
36
+ }>, {
37
+ filter: boolean;
38
+ loading: boolean;
39
+ disabled: boolean;
40
+ id: string;
41
+ modelValue: string;
42
+ placeholder: string;
43
+ invalid: boolean;
44
+ ariaLabel: string;
45
+ rows: number;
46
+ side: "top" | "bottom";
47
+ mentions: MentionCandidate[];
48
+ candidates: MentionCandidate[];
49
+ maxlength: number;
50
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
51
+ declare const _default: typeof __VLS_export;
52
+ export default _default;
@@ -0,0 +1,13 @@
1
+ type __VLS_Props = {
2
+ name: string;
3
+ id?: string;
4
+ src?: string;
5
+ size?: 'sm' | 'md';
6
+ };
7
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
8
+ size: "sm" | "md";
9
+ id: string;
10
+ src: string;
11
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
+ declare const _default: typeof __VLS_export;
13
+ export default _default;
@@ -0,0 +1,12 @@
1
+ import { ComputedRef, InjectionKey } from 'vue';
2
+ /** What a FormGroup hands to the fields and controls inside it. */
3
+ export interface FormGroupContext {
4
+ /** True while this group, or a group around it, is disabled. */
5
+ disabled: boolean;
6
+ /** The total indent of this group and every group around it, as a CSS length. */
7
+ indent: string;
8
+ }
9
+ export declare const FORM_GROUP_KEY: InjectionKey<FormGroupContext | null>;
10
+ export declare function useFormGroup(): FormGroupContext | null;
11
+ /** A control's own `disabled`, or-ed with the FormGroup it sits in. */
12
+ export declare function useGroupDisabled(own: () => boolean | undefined): ComputedRef<boolean>;
@@ -0,0 +1,6 @@
1
+ export declare function raisesKeyboard(element: Element | null): boolean;
2
+ /**
3
+ * True while a text field has focus on a touch device, where the on-screen
4
+ * keyboard is then open. A mouse-and-keyboard device never reports one.
5
+ */
6
+ export declare function useSoftKeyboard(): import('vue').Ref<boolean, boolean>;
@@ -28,6 +28,16 @@ export declare const englishUiText: {
28
28
  readonly "Toggle content": "Toggle content";
29
29
  readonly "More options": "More options";
30
30
  readonly More: "More";
31
+ readonly "Quick navigation": "Quick navigation";
32
+ readonly "{count} unread": "{count} unread";
33
+ readonly Unread: "Unread";
34
+ readonly Done: "Done";
35
+ readonly Edited: "Edited";
36
+ readonly "This comment was deleted": "This comment was deleted";
37
+ readonly "{count} characters left": "{count} characters left";
38
+ readonly "{count} characters over the limit": "{count} characters over the limit";
39
+ readonly People: "People";
40
+ readonly "No matching people": "No matching people";
31
41
  readonly "Close notification": "Close notification";
32
42
  readonly Notifications: "Notifications";
33
43
  readonly "Press F6 to access notifications": "Press F6 to access notifications";
@@ -163,6 +173,7 @@ export declare const englishUiText: {
163
173
  readonly "Hide password": "Hide password";
164
174
  readonly "Learn more": "Learn more";
165
175
  readonly "Show less": "Show less";
176
+ readonly "Note:": "Note:";
166
177
  readonly "Copy path": "Copy path";
167
178
  readonly "Path: {path}": "Path: {path}";
168
179
  readonly Copied: "Copied";
package/dist/index.d.ts CHANGED
@@ -130,6 +130,11 @@ export { default as Statistic } from './components/composite/statistic/Statistic
130
130
  export { default as StatTile } from './components/composite/stat-tile/StatTile.vue';
131
131
  export type { StatTileTone } from './components/composite/stat-tile/StatTile.vue';
132
132
  export { default as StatTileGroup } from './components/composite/stat-tile/StatTileGroup.vue';
133
+ export { default as CompletionToggle } from './components/composite/completion-toggle/CompletionToggle.vue';
134
+ export { default as MentionTextarea } from './components/composite/mention-textarea/MentionTextarea.vue';
135
+ export { default as CommentItem } from './components/composite/comment-item/CommentItem.vue';
136
+ export { mentionParts, mentionText, mentionTokens } from './lib/mentions';
137
+ export type { MentionCandidate, MentionPart } from './lib/mentions';
133
138
  export type { DataTableColumn } from './components/composite/data-table/DataTable.vue';
134
139
  export { default as DataGrid } from './components/composite/data-grid/DataGrid.vue';
135
140
  export type { DataGridColumn, DataGridColumnWidths, DataGridLabels, ResolvedDataGridLabels, DataGridSort, DataGridGroup, DataGridExpandable, DataGridDraggable, DataGridReorder, DataGridCellUpdate, DataGridAdapter, DataGridCellSlotProps } from './components/composite/data-grid/DataGrid.vue';
@@ -192,6 +197,8 @@ export { default as AppLayout } from './components/app/app-layout/AppLayout.vue'
192
197
  export { default as ResponsiveView } from './components/app/responsive-view/ResponsiveView.vue';
193
198
  export { appPresentationForWidth, MOBILE_LAYOUT_MAX, WEB_LAYOUT_MIN } from './lib/adaptiveLayout';
194
199
  export type { AppNavigation, AppPresentation, WideLayout } from './lib/adaptiveLayout';
200
+ export { default as AppTabBar } from './components/app/app-tab-bar/AppTabBar.vue';
201
+ export type { AppTabBarItem } from './components/app/app-tab-bar/AppTabBar.vue';
195
202
  export { ensureDeviceViewport } from './lib/deviceViewport';
196
203
  export { default as AppSidebar } from './components/app/app-sidebar/AppSidebar.vue';
197
204
  export { default as AppSidebarUser } from './components/app/app-sidebar/AppSidebarUser.vue';
@@ -212,6 +219,11 @@ export { useProps, provideConfigManager } from './composables/configCascade';
212
219
  export type { ConfigEntry, ConfigKey, ConfigProviderProps, ConfigRecord } from './composables/configCascade';
213
220
  export { default as Form } from './components/composite/form/Form.vue';
214
221
  export { default as FormItem } from './components/composite/form/FormItem.vue';
222
+ export { default as FormGroup } from './components/composite/form/FormGroup.vue';
223
+ export { useFormGroup, useGroupDisabled } from './composables/formGroup';
224
+ export type { FormGroupContext } from './composables/formGroup';
225
+ export { default as FormNote } from './components/composite/form-note/FormNote.vue';
226
+ export { default as InfoBox } from './components/composite/info-box/InfoBox.vue';
215
227
  export { useFormContext, useFormField } from './components/composite/form/context';
216
228
  export { normalizeRules, validateWithRules } from './components/composite/form/rules';
217
229
  export type { FormContext, FormFieldContext, FormFieldHandle } from './components/composite/form/context';