@toife/vue 3.0.0 → 3.0.1
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/README.md +54 -1
- package/package.json +4 -7
- package/src/components/action/action.md +115 -0
- package/src/components/action/action.scss +1 -2
- package/src/components/action/action.vue +9 -21
- package/src/components/app/app.md +77 -0
- package/src/components/app/app.scss +3 -3
- package/src/components/app/app.vue +1 -1
- package/src/components/avatar/avatar.md +64 -0
- package/src/components/avatar/avatar.scss +2 -2
- package/src/components/avatar/avatar.vue +1 -1
- package/src/components/button/button.md +66 -0
- package/src/components/button/button.scss +13 -13
- package/src/components/button/button.vue +6 -11
- package/src/components/cable/cable.md +57 -0
- package/src/components/cable/cable.vue +1 -1
- package/src/components/card/card/card.md +57 -0
- package/src/components/card/card/card.scss +3 -3
- package/src/components/card/card/card.vue +1 -1
- package/src/components/card/card-body/card-body.md +34 -0
- package/src/components/card/card-body/card-body.scss +3 -3
- package/src/components/card/card-body/card-body.vue +3 -8
- package/src/components/card/card-footer/card-footer.md +42 -0
- package/src/components/card/card-footer/card-footer.scss +4 -4
- package/src/components/card/card-footer/card-footer.vue +2 -5
- package/src/components/card/card-header/card-header.md +44 -0
- package/src/components/card/card-header/card-header.scss +4 -4
- package/src/components/card/card-header/card-header.vue +2 -5
- package/src/components/checkbox/checkbox.md +60 -0
- package/src/components/checkbox/checkbox.scss +8 -8
- package/src/components/checkbox/checkbox.vue +11 -24
- package/src/components/collapse/collapse.md +59 -0
- package/src/components/collapse/collapse.scss +2 -2
- package/src/components/collapse/collapse.vue +1 -1
- package/src/components/container/container.md +38 -0
- package/src/components/container/container.vue +3 -8
- package/src/components/decision-modal/decision-modal.md +79 -0
- package/src/components/decision-modal/decision-modal.scss +3 -3
- package/src/components/decision-modal/decision-modal.vue +1 -1
- package/src/components/divider/divider.md +42 -0
- package/src/components/divider/divider.scss +1 -1
- package/src/components/divider/divider.vue +3 -6
- package/src/components/field/field.md +68 -0
- package/src/components/field/outline/outline-field.md +44 -0
- package/src/components/field/outline/outline.scss +8 -8
- package/src/components/field/outline/outline.vue +2 -2
- package/src/components/form-group/form-group.md +41 -0
- package/src/components/gesture-indicator/gesture-indicator.md +42 -0
- package/src/components/gesture-indicator/gesture-indicator.scss +2 -2
- package/src/components/gesture-indicator/gesture-indicator.vue +3 -6
- package/src/components/image/image.md +41 -0
- package/src/components/modal/modal.md +65 -0
- package/src/components/modal/modal.scss +2 -2
- package/src/components/modal/modal.vue +1 -1
- package/src/components/page/page.md +39 -0
- package/src/components/page/page.vue +3 -8
- package/src/components/present/present.md +60 -0
- package/src/components/present/present.vue +1 -1
- package/src/components/radio/radio/radio.md +53 -0
- package/src/components/radio/radio/radio.scss +8 -8
- package/src/components/radio/radio/radio.vue +7 -11
- package/src/components/radio/radio-group/radio-group.md +62 -0
- package/src/components/radio/radio-group/radio-group.vue +1 -6
- package/src/components/refresher/refresher.md +53 -0
- package/src/components/route/route-navigator/route-navigator.md +50 -0
- package/src/components/route/route-navigator/route-navigator.scss +1 -1
- package/src/components/route/route-navigator/route-navigator.vue +14 -9
- package/src/components/route/route-outlet/route-outlet.md +30 -0
- package/src/components/route/route-provider/route-provider.md +46 -0
- package/src/components/route/route-wrapper/route-wrapper.composable.ts +29 -14
- package/src/components/route/route-wrapper/route-wrapper.md +45 -0
- package/src/components/route/route-wrapper/route-wrapper.type.ts +4 -0
- package/src/components/route/route-wrapper/route-wrapper.vue +13 -5
- package/src/components/route/route.type.ts +1 -0
- package/src/components/segmented-field/segmented-field.md +58 -0
- package/src/components/segmented-field/segmented-field.scss +3 -3
- package/src/components/segmented-field/segmented-field.vue +20 -26
- package/src/components/skeleton/skeleton.md +47 -0
- package/src/components/skeleton/skeleton.scss +3 -3
- package/src/components/skeleton/skeleton.vue +1 -1
- package/src/components/switch/switch.md +57 -0
- package/src/components/switch/switch.scss +8 -8
- package/src/components/switch/switch.vue +9 -20
- package/src/components/tabs/tab/tab.md +52 -0
- package/src/components/tabs/tabs/tabs.md +59 -0
- package/src/components/tabs/tabs/tabs.scss +4 -6
- package/src/components/tabs/tabs/tabs.vue +4 -6
- package/src/components/toast/toast/toast.md +56 -0
- package/src/components/toast/toast-content/toast-content.md +41 -0
- package/src/components/toast/toast-content/toast-content.scss +4 -4
- package/src/components/toast/toast-content/toast-content.vue +5 -11
- package/src/components/toolbar/toolbar.md +57 -0
- package/src/components/toolbar/toolbar.scss +2 -2
- package/src/components/toolbar/toolbar.vue +5 -11
- package/src/factory.ts +2 -0
- package/src/utils/element.md +33 -0
- package/src/utils/events.md +29 -0
- package/src/utils/style.md +49 -0
package/README.md
CHANGED
|
@@ -2,6 +2,59 @@
|
|
|
2
2
|
|
|
3
3
|
Vue 3 component library for Toife. The package ships **source** (`src/`): your app bundles it and compiles Sass with your own configuration.
|
|
4
4
|
|
|
5
|
+
## Documentation
|
|
6
|
+
|
|
7
|
+
Usage docs live **next to source** under `src/`. Authoring scaffold: [docs/template.md](docs/template.md).
|
|
8
|
+
|
|
9
|
+
### Components
|
|
10
|
+
|
|
11
|
+
| Doc | Tag / export |
|
|
12
|
+
|-----|----------------|
|
|
13
|
+
| [action.md](src/components/action/action.md) | `t-action` |
|
|
14
|
+
| [app.md](src/components/app/app.md) | `t-app` |
|
|
15
|
+
| [avatar.md](src/components/avatar/avatar.md) | `t-avatar` |
|
|
16
|
+
| [button.md](src/components/button/button.md) | `t-button` |
|
|
17
|
+
| [cable.md](src/components/cable/cable.md) | `t-cable` |
|
|
18
|
+
| [card.md](src/components/card/card/card.md) | `t-card` |
|
|
19
|
+
| [card-header.md](src/components/card/card-header/card-header.md) | `t-card-header` |
|
|
20
|
+
| [card-body.md](src/components/card/card-body/card-body.md) | `t-card-body` |
|
|
21
|
+
| [card-footer.md](src/components/card/card-footer/card-footer.md) | `t-card-footer` |
|
|
22
|
+
| [checkbox.md](src/components/checkbox/checkbox.md) | `t-checkbox` |
|
|
23
|
+
| [collapse.md](src/components/collapse/collapse.md) | `t-collapse` |
|
|
24
|
+
| [container.md](src/components/container/container.md) | `t-container` |
|
|
25
|
+
| [decision-modal.md](src/components/decision-modal/decision-modal.md) | `t-decision-modal` |
|
|
26
|
+
| [divider.md](src/components/divider/divider.md) | `t-divider` |
|
|
27
|
+
| [field.md](src/components/field/field.md) | `t-field` |
|
|
28
|
+
| [form-group.md](src/components/form-group/form-group.md) | `t-form-group` |
|
|
29
|
+
| [gesture-indicator.md](src/components/gesture-indicator/gesture-indicator.md) | `t-gesture-indicator` |
|
|
30
|
+
| [image.md](src/components/image/image.md) | `t-image` |
|
|
31
|
+
| [modal.md](src/components/modal/modal.md) | `t-modal` |
|
|
32
|
+
| [page.md](src/components/page/page.md) | `t-page` |
|
|
33
|
+
| [present.md](src/components/present/present.md) | `Present` (named import; not in `createToife`) |
|
|
34
|
+
| [radio.md](src/components/radio/radio/radio.md) | `t-radio` |
|
|
35
|
+
| [radio-group.md](src/components/radio/radio-group/radio-group.md) | `t-radio-group` |
|
|
36
|
+
| [refresher.md](src/components/refresher/refresher.md) | `t-refresher` |
|
|
37
|
+
| [route-navigator.md](src/components/route/route-navigator/route-navigator.md) | `t-route-navigator` |
|
|
38
|
+
| [route-wrapper.md](src/components/route/route-wrapper/route-wrapper.md) | `t-route-wrapper` |
|
|
39
|
+
| [route-provider.md](src/components/route/route-provider/route-provider.md) | `t-route-provider` |
|
|
40
|
+
| [route-outlet.md](src/components/route/route-outlet/route-outlet.md) | `t-route-outlet` |
|
|
41
|
+
| [segmented-field.md](src/components/segmented-field/segmented-field.md) | `t-segmented-field` |
|
|
42
|
+
| [skeleton.md](src/components/skeleton/skeleton.md) | `t-skeleton` |
|
|
43
|
+
| [switch.md](src/components/switch/switch.md) | `t-switch` |
|
|
44
|
+
| [tab.md](src/components/tabs/tab/tab.md) | `Tab` (named import; not in `createToife`) |
|
|
45
|
+
| [tabs.md](src/components/tabs/tabs/tabs.md) | `t-tabs` |
|
|
46
|
+
| [toast.md](src/components/toast/toast/toast.md) | `t-toast` |
|
|
47
|
+
| [toast-content.md](src/components/toast/toast-content/toast-content.md) | `t-toast-content` |
|
|
48
|
+
| [toolbar.md](src/components/toolbar/toolbar.md) | `t-toolbar` |
|
|
49
|
+
|
|
50
|
+
### Utils
|
|
51
|
+
|
|
52
|
+
| Doc | Contents |
|
|
53
|
+
|-----|----------|
|
|
54
|
+
| [element.md](src/utils/element.md) | `isFormElement`, `blurCurrentActive` |
|
|
55
|
+
| [events.md](src/utils/events.md) | `preventDefault` |
|
|
56
|
+
| [style.md](src/utils/style.md) | `withPrefix`, `property`, `variable`, … |
|
|
57
|
+
|
|
5
58
|
## Requirements
|
|
6
59
|
|
|
7
60
|
| Package | Notes |
|
|
@@ -160,7 +213,7 @@ import { utils } from "@toife/vue";
|
|
|
160
213
|
// utils.* — see exports under src/utils
|
|
161
214
|
```
|
|
162
215
|
|
|
163
|
-
See
|
|
216
|
+
See [src/utils/element.md](src/utils/element.md), [src/utils/events.md](src/utils/events.md), [src/utils/style.md](src/utils/style.md) and `src/utils/*.ts` for concrete APIs.
|
|
164
217
|
|
|
165
218
|
## Sass / theming
|
|
166
219
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toife/vue",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "A Frontend framework for Vue",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"frontend",
|
|
21
21
|
"web"
|
|
22
22
|
],
|
|
23
|
-
"author": "
|
|
23
|
+
"author": "Toivibe",
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"publishConfig": {
|
|
26
26
|
"access": "public",
|
|
@@ -34,12 +34,10 @@
|
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"dev": "vite",
|
|
37
|
-
"typecheck": "tsc
|
|
37
|
+
"typecheck": "tsc",
|
|
38
38
|
"build": "vite build",
|
|
39
39
|
"format": "prettier . --write",
|
|
40
|
-
"prepare": "husky"
|
|
41
|
-
"test:dev": "vite --config test/vite.config.ts",
|
|
42
|
-
"test:build": "vite build --config test/vite.config.ts"
|
|
40
|
+
"prepare": "husky"
|
|
43
41
|
},
|
|
44
42
|
"lint-staged": {
|
|
45
43
|
"*.{js,ts,vue,json,css,scss,sass,md,html}": "prettier --write"
|
|
@@ -56,7 +54,6 @@
|
|
|
56
54
|
"sass": "^1.90.0",
|
|
57
55
|
"typescript": "^5.9.2",
|
|
58
56
|
"vite": "^7.0.6",
|
|
59
|
-
"vite-plugin-dts": "^4.5.4",
|
|
60
57
|
"vue": "^3.5.0",
|
|
61
58
|
"vue-router": "^4.0.0"
|
|
62
59
|
},
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# `<t-action>`
|
|
2
|
+
|
|
3
|
+
> Default prefix is `t-` — change via `createToife({ prefix: "..." })`.
|
|
4
|
+
|
|
5
|
+
## Description
|
|
6
|
+
|
|
7
|
+
Action sheet: groups of buttons rendered inside `Present`, typically for quick choices or secondary menus. Control via props or the `useAction()` composable wired by `t-app`.
|
|
8
|
+
|
|
9
|
+
## Requirements / dependencies
|
|
10
|
+
|
|
11
|
+
| Item | Notes |
|
|
12
|
+
| ----- | ----------------------------------------------------------------------------------------- |
|
|
13
|
+
| Vue | ^3.5 |
|
|
14
|
+
| Other | Prefer `t-app` for theme/context (`inject`). Depends on `Present`, `FormGroup`, `Button`. |
|
|
15
|
+
|
|
16
|
+
## Basic usage
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<template>
|
|
20
|
+
<t-action
|
|
21
|
+
:visible="show"
|
|
22
|
+
:actions="[[{ text: 'Confirm', variant: 'fill', handler: onOk }]]"
|
|
23
|
+
placement="bottom"
|
|
24
|
+
@close="show = false"
|
|
25
|
+
@choose="onChoose"
|
|
26
|
+
/>
|
|
27
|
+
</template>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Or open via `useAction()` (wired by `t-app`):
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { useAction } from "@toife/vue";
|
|
34
|
+
|
|
35
|
+
const action = useAction();
|
|
36
|
+
action.open({
|
|
37
|
+
actions: [[{ text: "OK", handler: () => {} }]],
|
|
38
|
+
onClose: () => {},
|
|
39
|
+
onChoose: (btn) => {},
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Props
|
|
44
|
+
|
|
45
|
+
| Prop | Type | Default | Description |
|
|
46
|
+
| ----------- | ----------------------- | ------------ | -------------------------------------------------------------- |
|
|
47
|
+
| `visible` | `boolean` | `false` | Show the action layer. |
|
|
48
|
+
| `dismiss` | `string[]` | — | `Present` close reasons that emit `close` (e.g. `'backdrop'`). |
|
|
49
|
+
| `actions` | `Array<ActionButton[]>` | _(required)_ | Rows of button groups; each row is an array of buttons. |
|
|
50
|
+
| `role` | `string` | — | Theme role override; default from `t-app`. |
|
|
51
|
+
| `shape` | `string` | — | Shape override; default from `t-app`. |
|
|
52
|
+
| `divider` | `boolean` | — | Divider; default from `t-app`. |
|
|
53
|
+
| `shadow` | `boolean` | — | Shadow; default from `t-app`. |
|
|
54
|
+
| `placement` | `PresentPlacement` | `"bottom"` | `Present` placement (`top`, `bottom`, …). |
|
|
55
|
+
|
|
56
|
+
**Type source:** `src/components/action/action.type.ts`
|
|
57
|
+
|
|
58
|
+
`ActionButton`: `text`, `role`, `variant`, `shadow`, `handler`, `data`.
|
|
59
|
+
|
|
60
|
+
## Events (emits)
|
|
61
|
+
|
|
62
|
+
| Event | Payload | Description |
|
|
63
|
+
| -------- | ------------------- | --------------------------------------------------------- |
|
|
64
|
+
| `close` | `type?: string` | When `dismiss` matches the close reason. |
|
|
65
|
+
| `choose` | `btn: ActionButton` | After a button is chosen (after that button’s `handler`). |
|
|
66
|
+
|
|
67
|
+
## Slots
|
|
68
|
+
|
|
69
|
+
| Slot | Slot props | Description |
|
|
70
|
+
| ------ | ---------- | -------------------------------------------- |
|
|
71
|
+
| `body` | — | Replaces the default button layout entirely. |
|
|
72
|
+
|
|
73
|
+
## `v-model`
|
|
74
|
+
|
|
75
|
+
No `v-model` support.
|
|
76
|
+
|
|
77
|
+
## Provide / inject / context
|
|
78
|
+
|
|
79
|
+
Injects `APP_PROVIDER_STATE_KEY` from `t-app` for `divider`, `shadow`, `shape`, `role` when props are omitted.
|
|
80
|
+
|
|
81
|
+
## Expose (template ref)
|
|
82
|
+
|
|
83
|
+
Nothing exposed.
|
|
84
|
+
|
|
85
|
+
## Special behavior
|
|
86
|
+
|
|
87
|
+
- Backdrop close: if the payload is not in `dismiss`, a short `pop` animation runs instead of emitting `close`.
|
|
88
|
+
|
|
89
|
+
## Accessibility (a11y)
|
|
90
|
+
|
|
91
|
+
Inherits from `Present` (backdrop, focus). Buttons use inner `Button`.
|
|
92
|
+
|
|
93
|
+
## Style / class notes
|
|
94
|
+
|
|
95
|
+
BEM-style classes via `withPrefix`: `action`, `layer`, `surface`, `role`, `shape`, placement, `pop`, `divider`, `shadow`.
|
|
96
|
+
|
|
97
|
+
## Advanced example
|
|
98
|
+
|
|
99
|
+
```vue
|
|
100
|
+
<t-action
|
|
101
|
+
:visible="open"
|
|
102
|
+
:dismiss="['backdrop']"
|
|
103
|
+
:actions="[
|
|
104
|
+
[{ text: 'Cancel', variant: 'text', handler: cancel }],
|
|
105
|
+
[{ text: 'Delete', variant: 'fill', role: 'danger', handler: remove }],
|
|
106
|
+
]"
|
|
107
|
+
placement="bottom"
|
|
108
|
+
@close="(t) => console.log(t)"
|
|
109
|
+
/>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## See also
|
|
113
|
+
|
|
114
|
+
- Source: `src/components/action`
|
|
115
|
+
- Composable: `action.composable.ts` (`useAction`)
|
|
@@ -11,14 +11,13 @@ $width: sass.fn-naming-var("viewport", "width");
|
|
|
11
11
|
$max-width: sass.fn-naming-var("overlay", "max-width");
|
|
12
12
|
$height: sass.fn-naming-var("viewport", "height");
|
|
13
13
|
$max-height: sass.fn-naming-var("overlay", "max-height");
|
|
14
|
-
$background-color: sass.fn-naming-var("surface", "background-color");
|
|
15
14
|
$transition-duration: sass.fn-naming-var("motion", "duration");
|
|
16
15
|
$safe-area-bottom: sass.fn-naming-var("safe-area", "bottom");
|
|
17
16
|
$safe-area-top: sass.fn-naming-var("safe-area", "top");
|
|
18
17
|
$safe-area-left: sass.fn-naming-var("safe-area", "left");
|
|
19
18
|
$safe-area-right: sass.fn-naming-var("safe-area", "right");
|
|
20
19
|
$border-width: sass.fn-naming-var("stroke", "width");
|
|
21
|
-
$border-color: sass.fn-naming-var("
|
|
20
|
+
$border-color: sass.fn-naming-var("action", "border-color");
|
|
22
21
|
|
|
23
22
|
.#{$action} {
|
|
24
23
|
// Styles
|
|
@@ -28,34 +28,22 @@ const pop = ref(false);
|
|
|
28
28
|
|
|
29
29
|
/// Computed
|
|
30
30
|
/// ------------------------------------------------------------
|
|
31
|
-
const divider = computed(() => {
|
|
32
|
-
return (props?.divider !== undefined ? props.divider : appState?.divider.value) ?? false;
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
const shadow = computed(() => {
|
|
36
|
-
return (props?.shadow !== undefined ? props.shadow : appState?.shadow.value) ?? false;
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
const shape = computed(() => {
|
|
40
|
-
return props.shape ?? appState?.shape.value ?? "";
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
const role = computed(() => {
|
|
44
|
-
return props.role ?? appState?.role.value ?? "";
|
|
45
|
-
});
|
|
46
|
-
|
|
47
31
|
const actionAttrs = computed(() => {
|
|
32
|
+
const divider = (props?.divider !== undefined ? props.divider : appState?.divider.value) ?? false;
|
|
33
|
+
const shadow = (props?.shadow !== undefined ? props.shadow : appState?.shadow.value) ?? false;
|
|
34
|
+
const shape = props.shape ?? appState?.shape.value ?? "";
|
|
35
|
+
const role = props.role ?? appState?.role.value ?? "";
|
|
48
36
|
return {
|
|
49
37
|
class: [
|
|
50
38
|
withPrefix("action"),
|
|
51
|
-
withPrefix(["layer", "
|
|
52
|
-
withPrefix(["role", role
|
|
53
|
-
withPrefix(["shape", shape
|
|
39
|
+
withPrefix(["layer", "action"]),
|
|
40
|
+
withPrefix(["role", role]),
|
|
41
|
+
withPrefix(["shape", shape]),
|
|
54
42
|
props.placement,
|
|
55
43
|
{
|
|
56
44
|
pop: pop.value,
|
|
57
|
-
divider
|
|
58
|
-
shadow
|
|
45
|
+
divider,
|
|
46
|
+
shadow,
|
|
59
47
|
},
|
|
60
48
|
],
|
|
61
49
|
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# `<t-app>`
|
|
2
|
+
|
|
3
|
+
> Default prefix is `t-` — change via `createToife({ prefix: "..." })`.
|
|
4
|
+
|
|
5
|
+
## Description
|
|
6
|
+
|
|
7
|
+
Library root layout: provides theme/context (`provide`) for descendants, mounts multiple `Toast` regions by placement, and hosts `Action` / `DecisionModal` when using `useAction` / `useDecisionModal`.
|
|
8
|
+
|
|
9
|
+
## Requirements / dependencies
|
|
10
|
+
|
|
11
|
+
| Item | Notes |
|
|
12
|
+
| ----- | -------------------- |
|
|
13
|
+
| Vue | ^3.5 |
|
|
14
|
+
| Other | Router not required. |
|
|
15
|
+
|
|
16
|
+
## Basic usage
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<template>
|
|
20
|
+
<t-app>
|
|
21
|
+
<t-page>App content</t-page>
|
|
22
|
+
</t-app>
|
|
23
|
+
</template>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
| Prop | Type | Default | Description |
|
|
29
|
+
| ----------- | ------------------- | -------- | ------------------------------------------------ |
|
|
30
|
+
| `shape` | `string` | `"pill"` | Default shape for children (buttons, fields, …). |
|
|
31
|
+
| `divider` | `boolean` | `false` | Default divider flag. |
|
|
32
|
+
| `role` | `string` | `"mode"` | Default theme role. |
|
|
33
|
+
| `shadow` | `boolean` | `false` | Default shadow. |
|
|
34
|
+
| `triple` | `boolean` | `false` | Layout flag (provided to children). |
|
|
35
|
+
| `direction` | `"left" \| "right"` | `"left"` | Direction (fields, …). |
|
|
36
|
+
|
|
37
|
+
**Type source:** `src/components/app/app.type.ts`
|
|
38
|
+
|
|
39
|
+
## Events (emits)
|
|
40
|
+
|
|
41
|
+
_No public emits._
|
|
42
|
+
|
|
43
|
+
## Slots
|
|
44
|
+
|
|
45
|
+
| Slot | Description |
|
|
46
|
+
| --------- | ----------------------------------------------------- |
|
|
47
|
+
| `default` | Main app content. |
|
|
48
|
+
| `global` | Extra slot (after default, before internal overlays). |
|
|
49
|
+
|
|
50
|
+
## `v-model`
|
|
51
|
+
|
|
52
|
+
No.
|
|
53
|
+
|
|
54
|
+
## Provide / inject / context
|
|
55
|
+
|
|
56
|
+
`provide(APP_PROVIDER_STATE_KEY)`: `{ shape, divider, role, shadow, triple, direction }` — children inject for consistent theming.
|
|
57
|
+
|
|
58
|
+
## Expose
|
|
59
|
+
|
|
60
|
+
Nothing.
|
|
61
|
+
|
|
62
|
+
## Special behavior
|
|
63
|
+
|
|
64
|
+
- Renders several `Toast` instances with fixed placements (top/bottom × start/center/end).
|
|
65
|
+
- When `useAction()` / `useDecisionModal()` has `data`, renders the matching `Action` / `DecisionModal`.
|
|
66
|
+
|
|
67
|
+
## Accessibility (a11y)
|
|
68
|
+
|
|
69
|
+
Wrapper only; no special root role.
|
|
70
|
+
|
|
71
|
+
## Style / class notes
|
|
72
|
+
|
|
73
|
+
Classes: `layer`, `base`, `shape`, `app`.
|
|
74
|
+
|
|
75
|
+
## See also
|
|
76
|
+
|
|
77
|
+
- Source: `src/components/app`
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
// Class name
|
|
4
4
|
$app: sass.fn-naming-prefix("app");
|
|
5
5
|
|
|
6
|
-
// Property name - layer:
|
|
7
|
-
$background-color: sass.fn-naming-var("
|
|
8
|
-
$color: sass.fn-naming-var("
|
|
6
|
+
// Property name - layer: app
|
|
7
|
+
$background-color: sass.fn-naming-var("app", "background-color");
|
|
8
|
+
$color: sass.fn-naming-var("app", "color");
|
|
9
9
|
$transition-duration: sass.fn-naming-var("motion", "duration");
|
|
10
10
|
|
|
11
11
|
.#{$app} {
|
|
@@ -28,7 +28,7 @@ const action = useAction();
|
|
|
28
28
|
// Present attributes
|
|
29
29
|
const appAttrs = computed(() => {
|
|
30
30
|
return {
|
|
31
|
-
class: [withPrefix(["layer", "
|
|
31
|
+
class: [withPrefix(["layer", "app"]), withPrefix(["shape", shape.value]), withPrefix("app")],
|
|
32
32
|
};
|
|
33
33
|
});
|
|
34
34
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# `<t-avatar>`
|
|
2
|
+
|
|
3
|
+
> Default prefix is `t-` — change via `createToife({ prefix: "..." })`.
|
|
4
|
+
|
|
5
|
+
## Description
|
|
6
|
+
|
|
7
|
+
Displays an avatar image as a CSS `background-image` inside a themed frame (shape/role from app when omitted).
|
|
8
|
+
|
|
9
|
+
## Requirements / dependencies
|
|
10
|
+
|
|
11
|
+
| Item | Notes |
|
|
12
|
+
| ----- | ------------------------------------------------- |
|
|
13
|
+
| Vue | ^3.5 |
|
|
14
|
+
| Other | `t-app` recommended for default `role` / `shape`. |
|
|
15
|
+
|
|
16
|
+
## Basic usage
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<t-avatar src="/user.png" size="40px" />
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
| ------- | ------------------ | -------- | ------------------------------------- |
|
|
26
|
+
| `shape` | `string` | — | Shape override; default from `t-app`. |
|
|
27
|
+
| `size` | `string \| number` | `"22px"` | Size (number is treated as px). |
|
|
28
|
+
| `src` | `string` | `""` | Image URL for background. |
|
|
29
|
+
|
|
30
|
+
**Type source:** `src/components/avatar/avatar.type.ts`
|
|
31
|
+
|
|
32
|
+
## Events (emits)
|
|
33
|
+
|
|
34
|
+
_None._
|
|
35
|
+
|
|
36
|
+
## Slots
|
|
37
|
+
|
|
38
|
+
| Slot | Description |
|
|
39
|
+
| --------- | ------------------------------ |
|
|
40
|
+
| `default` | Optional inner content (rare). |
|
|
41
|
+
|
|
42
|
+
## `v-model`
|
|
43
|
+
|
|
44
|
+
No.
|
|
45
|
+
|
|
46
|
+
## Provide / inject
|
|
47
|
+
|
|
48
|
+
Injects `AppProviderState` for `role` / `shape`.
|
|
49
|
+
|
|
50
|
+
## Expose
|
|
51
|
+
|
|
52
|
+
Nothing.
|
|
53
|
+
|
|
54
|
+
## Accessibility (a11y)
|
|
55
|
+
|
|
56
|
+
Decorative background image — add `aria-label` on a parent if a name must be announced.
|
|
57
|
+
|
|
58
|
+
## Style / class notes
|
|
59
|
+
|
|
60
|
+
CSS variable `--<prefix>-width` via `property("width")`.
|
|
61
|
+
|
|
62
|
+
## See also
|
|
63
|
+
|
|
64
|
+
- Source: `src/components/avatar`
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
$avatar: sass.fn-naming-prefix("avatar");
|
|
5
5
|
$shape-pill: sass.fn-naming-prefix("shape-pill");
|
|
6
6
|
|
|
7
|
-
// Property - layer:
|
|
7
|
+
// Property - layer: avatar
|
|
8
8
|
$border-radius: sass.fn-naming-var("border-radius");
|
|
9
|
-
$background-color: sass.fn-naming-var("
|
|
9
|
+
$background-color: sass.fn-naming-var("avatar", "background-color");
|
|
10
10
|
$width: sass.fn-naming-var("width");
|
|
11
11
|
$transition-duration: sass.fn-naming-var("motion", "duration");
|
|
12
12
|
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# `<t-button>`
|
|
2
|
+
|
|
3
|
+
> Default prefix is `t-` — change via `createToife({ prefix: "..." })`.
|
|
4
|
+
|
|
5
|
+
## Description
|
|
6
|
+
|
|
7
|
+
Button with variants, sizes, loading state, and theming from `t-app`.
|
|
8
|
+
|
|
9
|
+
## Requirements / dependencies
|
|
10
|
+
|
|
11
|
+
| Item | Notes |
|
|
12
|
+
| ----- | ---------------------------------------------------- |
|
|
13
|
+
| Vue | ^3.5 |
|
|
14
|
+
| Other | `t-app` recommended for `shape` / `role` / `shadow`. |
|
|
15
|
+
|
|
16
|
+
## Basic usage
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<t-button variant="fill" @click="save">Save</t-button>
|
|
20
|
+
<t-button loading>Loading</t-button>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| Prop | Type | Default | Description |
|
|
26
|
+
| --------- | ---------------------------------- | ------------ | ---------------------------------------- |
|
|
27
|
+
| `role` | `string` | — | Theme role; default from app. |
|
|
28
|
+
| `size` | `"small" \| "standard" \| "large"` | `"standard"` | Size. |
|
|
29
|
+
| `shape` | `string` | — | Shape; default from app. |
|
|
30
|
+
| `block` | `boolean` | `false` | Full-width button. |
|
|
31
|
+
| `loading` | `boolean` | `false` | Hides label, shows `loading` slot. |
|
|
32
|
+
| `variant` | `ButtonVariant` | `"fill"` | `fill` \| `outline` \| `text` \| `link`. |
|
|
33
|
+
| `shadow` | `boolean` | — | Default from app if unset. |
|
|
34
|
+
|
|
35
|
+
**Type source:** `src/components/button/button.type.ts`
|
|
36
|
+
|
|
37
|
+
## Events (emits)
|
|
38
|
+
|
|
39
|
+
_No declared emits_ — use native DOM listeners (`@click`).
|
|
40
|
+
|
|
41
|
+
## Slots
|
|
42
|
+
|
|
43
|
+
| Slot | Description |
|
|
44
|
+
| --------- | ------------------------------------- |
|
|
45
|
+
| `default` | Button label (hidden when `loading`). |
|
|
46
|
+
| `loading` | Content when `loading`. |
|
|
47
|
+
|
|
48
|
+
## `v-model`
|
|
49
|
+
|
|
50
|
+
No.
|
|
51
|
+
|
|
52
|
+
## Provide / inject
|
|
53
|
+
|
|
54
|
+
Injects theme from `t-app`.
|
|
55
|
+
|
|
56
|
+
## Expose
|
|
57
|
+
|
|
58
|
+
Nothing.
|
|
59
|
+
|
|
60
|
+
## Accessibility (a11y)
|
|
61
|
+
|
|
62
|
+
Native `<button>`; focus/blur styling handled internally.
|
|
63
|
+
|
|
64
|
+
## See also
|
|
65
|
+
|
|
66
|
+
- Source: `src/components/button`
|
|
@@ -11,14 +11,14 @@ $transition-duration: sass.fn-naming-var("motion", "duration");
|
|
|
11
11
|
$spacing-x: sass.fn-naming-var("spacing", "x");
|
|
12
12
|
$spacing-y: sass.fn-naming-var("spacing", "y");
|
|
13
13
|
|
|
14
|
-
$color: sass.fn-naming-var("
|
|
14
|
+
$color: sass.fn-naming-var("button", "color");
|
|
15
15
|
|
|
16
|
-
$border-color: sass.fn-naming-var("
|
|
17
|
-
$border-color-hover: sass.fn-naming-var("
|
|
18
|
-
$border-color-focus: sass.fn-naming-var("
|
|
19
|
-
$border-color-active: sass.fn-naming-var("
|
|
20
|
-
$border-color-disabled: sass.fn-naming-var("
|
|
21
|
-
$border-color-inactive: sass.fn-naming-var("
|
|
16
|
+
$border-color: sass.fn-naming-var("button", "border-color");
|
|
17
|
+
$border-color-hover: sass.fn-naming-var("button", "border-color", "strong");
|
|
18
|
+
$border-color-focus: sass.fn-naming-var("button", "border-color", "heavy");
|
|
19
|
+
$border-color-active: sass.fn-naming-var("button", "border-color", "heavy");
|
|
20
|
+
$border-color-disabled: sass.fn-naming-var("button", "border-color");
|
|
21
|
+
$border-color-inactive: sass.fn-naming-var("button", "border-color", "soft");
|
|
22
22
|
|
|
23
23
|
$size-font-size: sass.fn-naming-var("font-size");
|
|
24
24
|
$size-height: sass.fn-naming-var("height");
|
|
@@ -26,12 +26,12 @@ $size-coefficient-x: sass.fn-naming-var("coefficient-x");
|
|
|
26
26
|
$size-coefficient-y: sass.fn-naming-var("coefficient-y");
|
|
27
27
|
$size-line-height: sass.fn-naming-var("line-height");
|
|
28
28
|
|
|
29
|
-
$background-color: sass.fn-naming-var("
|
|
30
|
-
$background-color-hover: sass.fn-naming-var("
|
|
31
|
-
$background-color-focus: sass.fn-naming-var("
|
|
32
|
-
$background-color-active: sass.fn-naming-var("
|
|
33
|
-
$background-color-disabled: sass.fn-naming-var("
|
|
34
|
-
$background-color-inactive: sass.fn-naming-var("
|
|
29
|
+
$background-color: sass.fn-naming-var("button", "background-color");
|
|
30
|
+
$background-color-hover: sass.fn-naming-var("button", "background-color", "strong");
|
|
31
|
+
$background-color-focus: sass.fn-naming-var("button", "background-color", "heavy");
|
|
32
|
+
$background-color-active: sass.fn-naming-var("button", "background-color", "heavy");
|
|
33
|
+
$background-color-disabled: sass.fn-naming-var("button", "background-color");
|
|
34
|
+
$background-color-inactive: sass.fn-naming-var("button", "background-color", "soft");
|
|
35
35
|
|
|
36
36
|
.#{$button} {
|
|
37
37
|
display: inline-flex;
|
|
@@ -23,17 +23,14 @@ const isFocused = ref(false);
|
|
|
23
23
|
|
|
24
24
|
/// Computed
|
|
25
25
|
/// ------------------------------------------------------------
|
|
26
|
-
const shadow = computed(() => {
|
|
27
|
-
return (props?.shadow !== undefined ? props.shadow : appState?.shadow.value) ?? false;
|
|
28
|
-
});
|
|
29
|
-
|
|
30
26
|
const buttonAttrs = computed(() => {
|
|
31
27
|
const shape = props.shape || appState?.shape.value || "";
|
|
32
28
|
const role = props.role || appState?.role.value || "";
|
|
29
|
+
const shadow = (props?.shadow !== undefined ? props.shadow : appState?.shadow.value) ?? false;
|
|
33
30
|
|
|
34
31
|
return {
|
|
35
32
|
class: [
|
|
36
|
-
withPrefix(["layer", "
|
|
33
|
+
withPrefix(["layer", "button"]),
|
|
37
34
|
withPrefix(["role", role]),
|
|
38
35
|
withPrefix(["shape", shape]),
|
|
39
36
|
withPrefix("button"),
|
|
@@ -41,18 +38,16 @@ const buttonAttrs = computed(() => {
|
|
|
41
38
|
props.variant,
|
|
42
39
|
{
|
|
43
40
|
block: props.block,
|
|
44
|
-
shadow
|
|
41
|
+
shadow,
|
|
45
42
|
focus: isFocused.value,
|
|
46
43
|
},
|
|
47
44
|
],
|
|
48
45
|
};
|
|
49
46
|
});
|
|
50
47
|
|
|
51
|
-
const loaderAttrs =
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
};
|
|
55
|
-
});
|
|
48
|
+
const loaderAttrs = {
|
|
49
|
+
class: [withPrefix("loader")],
|
|
50
|
+
} as const;
|
|
56
51
|
|
|
57
52
|
/// Methods
|
|
58
53
|
/// ------------------------------------------------------------
|