@synopackageland/ui 0.17.5 → 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 +24 -0
- package/README.md +53 -1
- package/dist/CollaborationDemo.vue.d.ts +6 -0
- package/dist/components/app/app-layout/AppLayout.vue.d.ts +2 -0
- package/dist/components/app/app-tab-bar/AppTabBar.vue.d.ts +37 -0
- package/dist/components/composite/comment-item/CommentItem.vue.d.ts +46 -0
- package/dist/components/composite/completion-toggle/CompletionToggle.vue.d.ts +26 -0
- package/dist/components/composite/form/Form.vue.d.ts +2 -0
- package/dist/components/composite/form/FormGroup.vue.d.ts +22 -0
- package/dist/components/composite/form-note/FormNote.vue.d.ts +19 -0
- package/dist/components/composite/info-box/InfoBox.vue.d.ts +17 -0
- package/dist/components/composite/mention-textarea/MentionTextarea.vue.d.ts +52 -0
- package/dist/components/composite/mention-textarea/PersonInitials.vue.d.ts +13 -0
- package/dist/composables/formGroup.d.ts +12 -0
- package/dist/composables/softKeyboard.d.ts +6 -0
- package/dist/i18n/text.d.ts +11 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +10498 -9741
- package/dist/json-preview/preview.js +6826 -6688
- package/dist/lib/adaptiveLayout.d.ts +12 -0
- package/dist/lib/mentions.d.ts +38 -0
- package/dist/reka-runtime.json +1 -1
- package/dist/theme.css +1 -1
- package/dist/themes/dsm7-embedded-theme.css +1 -1
- package/dist/themes/dsm7-embedded.css +1 -1
- package/dist/themes/dsm7.css +1 -1
- package/docs/layout-rules.md +3 -0
- package/docs/theme-hooks.md +10 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
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
|
+
|
|
23
|
+
## 0.17.6 (2026-10-29)
|
|
24
|
+
|
|
25
|
+
- The `syno-pkg-land-ui` bin path is written without a leading `./`, so npm keeps the command in the published registry metadata.
|
|
26
|
+
|
|
3
27
|
## 0.17.5 (2026-10-29)
|
|
4
28
|
|
|
5
29
|
Additive only: existing props, defaults and DOM stay as they were.
|
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>;
|
package/dist/i18n/text.d.ts
CHANGED
|
@@ -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';
|