@todovue/tv-ui 0.1.0 → 0.1.2
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 +20 -20
- package/dist/entry.d.ts +2 -2
- package/dist/tv-ui.cjs.js +1 -1
- package/dist/tv-ui.css +1 -1
- package/dist/tv-ui.es.js +50 -49
- package/package.json +4 -2
- package/dist/.htaccess +0 -8
- package/dist/demos/tv-alert/CHANGELOG.md +0 -127
- package/dist/demos/tv-alert/README.md +0 -334
- package/dist/demos/tv-article/CHANGELOG.md +0 -221
- package/dist/demos/tv-article/README.md +0 -258
- package/dist/demos/tv-breadcrumbs/CHANGELOG.md +0 -135
- package/dist/demos/tv-breadcrumbs/README.md +0 -364
- package/dist/demos/tv-button/CHANGELOG.md +0 -158
- package/dist/demos/tv-button/README.md +0 -255
- package/dist/demos/tv-card/CHANGELOG.md +0 -158
- package/dist/demos/tv-card/README.md +0 -332
- package/dist/demos/tv-demo/CHANGELOG.md +0 -352
- package/dist/demos/tv-demo/README.md +0 -229
- package/dist/demos/tv-footer/CHANGELOG.md +0 -67
- package/dist/demos/tv-footer/README.md +0 -760
- package/dist/demos/tv-hero/CHANGELOG.md +0 -137
- package/dist/demos/tv-hero/README.md +0 -410
- package/dist/demos/tv-label/CHANGELOG.md +0 -138
- package/dist/demos/tv-label/README.md +0 -357
- package/dist/demos/tv-menu/CHANGELOG.md +0 -145
- package/dist/demos/tv-menu/README.md +0 -389
- package/dist/demos/tv-modal/CHANGELOG.md +0 -127
- package/dist/demos/tv-modal/README.md +0 -466
- package/dist/demos/tv-pagination/CHANGELOG.md +0 -125
- package/dist/demos/tv-pagination/README.md +0 -275
- package/dist/demos/tv-progress-bar/CHANGELOG.md +0 -84
- package/dist/demos/tv-progress-bar/README.md +0 -894
- package/dist/demos/tv-relative-time/CHANGELOG.md +0 -122
- package/dist/demos/tv-relative-time/README.md +0 -405
- package/dist/demos/tv-scroll-top/CHANGELOG.md +0 -69
- package/dist/demos/tv-scroll-top/README.md +0 -445
- package/dist/demos/tv-search/CHANGELOG.md +0 -155
- package/dist/demos/tv-search/README.md +0 -407
- package/dist/demos/tv-settings/CHANGELOG.md +0 -94
- package/dist/demos/tv-settings/README.md +0 -314
- package/dist/demos/tv-sidebar/CHANGELOG.md +0 -229
- package/dist/demos/tv-sidebar/README.md +0 -592
- package/dist/demos/tv-theme-button/CHANGELOG.md +0 -136
- package/dist/demos/tv-theme-button/README.md +0 -392
- package/dist/demos/tv-toc/CHANGELOG.md +0 -80
- package/dist/demos/tv-toc/README.md +0 -288
- package/dist/favicon.ico +0 -0
|
@@ -1,466 +0,0 @@
|
|
|
1
|
-
<p align="center"><img width="150" src="https://res.cloudinary.com/dcdfhi8qz/image/upload/v1763663056/uqqtkgp1lg3xdplutpga.png" alt="TODOvue logo">
|
|
2
|
-
</p>
|
|
3
|
-
|
|
4
|
-
# TODOvue Modal (TvModal)
|
|
5
|
-
A flexible, customizable Vue 3 modal component with multiple variants (success, error, warning, info), animations, theme support, and accessibility features. Works seamlessly in Single Page Apps and Server-Side Rendered (SSR) environments like Nuxt 3.
|
|
6
|
-
|
|
7
|
-
[](https://www.npmjs.com/package/@todovue/tv-modal)
|
|
8
|
-
[](https://www.npmjs.com/package/@todovue/tv-modal)
|
|
9
|
-
[](https://www.npmjs.com/package/@todovue/tv-modal)
|
|
10
|
-

|
|
11
|
-

|
|
12
|
-

|
|
13
|
-

|
|
14
|
-

|
|
15
|
-

|
|
16
|
-
|
|
17
|
-
> Demo: https://ui.todovue.blog/modal
|
|
18
|
-
|
|
19
|
-
## Table of Contents
|
|
20
|
-
- [Features](#features)
|
|
21
|
-
- [Installation](#installation)
|
|
22
|
-
- [Quick Start (SPA)](#quick-start-spa)
|
|
23
|
-
- [Nuxt 4 / SSR Usage](#nuxt-4--ssr-usage)
|
|
24
|
-
- [Component Registration Options](#component-registration-options)
|
|
25
|
-
- [Props](#props)
|
|
26
|
-
- [Events](#events)
|
|
27
|
-
- [Configuration Object](#configuration-object)
|
|
28
|
-
- [Theme Support](#theme-support)
|
|
29
|
-
- [Theme Support](#theme-support)
|
|
30
|
-
- [Slots](#slots)
|
|
31
|
-
- [Usage Examples](#usage-examples)
|
|
32
|
-
- [Animations](#animations)
|
|
33
|
-
- [Accessibility](#accessibility)
|
|
34
|
-
- [SSR Notes](#ssr-notes)
|
|
35
|
-
- [Development](#development)
|
|
36
|
-
- [Contributing](#contributing)
|
|
37
|
-
- [License](#license)
|
|
38
|
-
|
|
39
|
-
## Features
|
|
40
|
-
- Multiple visual variants: success, error, warning, info
|
|
41
|
-
- Configurable title, description, and action buttons
|
|
42
|
-
- Built-in animations (scale-up, scale-down, rotate shake on overlay click)
|
|
43
|
-
- Theme support: auto-detect dark/light mode or manual override
|
|
44
|
-
- Uses Vue Teleport for proper modal rendering
|
|
45
|
-
- Keyboard navigation (ESC to close)
|
|
46
|
-
- Focus management and restoration
|
|
47
|
-
- Accessible (ARIA attributes, role="dialog")
|
|
48
|
-
- Works in SPA and SSR (Nuxt 3) contexts
|
|
49
|
-
- Integrates with @todovue/tv-button for action buttons
|
|
50
|
-
- Tree-shake friendly (Vue marked external in library build)
|
|
51
|
-
|
|
52
|
-
## Installation
|
|
53
|
-
Using npm:
|
|
54
|
-
```bash
|
|
55
|
-
npm install @todovue/tv-modal
|
|
56
|
-
```
|
|
57
|
-
Using yarn:
|
|
58
|
-
```bash
|
|
59
|
-
yarn add @todovue/tv-modal
|
|
60
|
-
```
|
|
61
|
-
Using pnpm:
|
|
62
|
-
```bash
|
|
63
|
-
pnpm add @todovue/tv-modal
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Importing Styles
|
|
67
|
-
**Important:** Starting from version 1.0.0+, TvModal no longer injects CSS automatically. You must explicitly import the stylesheet in your application.
|
|
68
|
-
|
|
69
|
-
#### For Vue/Vite SPA:
|
|
70
|
-
```ts
|
|
71
|
-
// main.ts
|
|
72
|
-
import { createApp } from 'vue'
|
|
73
|
-
import App from './App.vue'
|
|
74
|
-
|
|
75
|
-
import '@todovue/tv-modal/style.css'
|
|
76
|
-
import '@todovue/tv-button/style.css'
|
|
77
|
-
import { TvModal } from '@todovue/tv-modal'
|
|
78
|
-
|
|
79
|
-
const app = createApp(App)
|
|
80
|
-
app.component('TvModal', TvModal)
|
|
81
|
-
app.mount('#app')
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
#### For Nuxt 3/4:
|
|
85
|
-
```ts
|
|
86
|
-
// nuxt.config.ts
|
|
87
|
-
export default defineNuxtConfig({
|
|
88
|
-
modules: [
|
|
89
|
-
'@todovue/tv-modal/nuxt'
|
|
90
|
-
]
|
|
91
|
-
})
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
Then register the component in a plugin as shown in the [Nuxt 3 / SSR Usage](#nuxt-3--ssr-usage) section.
|
|
95
|
-
|
|
96
|
-
## Quick Start (SPA)
|
|
97
|
-
Global registration (main.js / main.ts):
|
|
98
|
-
```js
|
|
99
|
-
import { createApp } from 'vue'
|
|
100
|
-
import App from './App.vue'
|
|
101
|
-
import '@todovue/tv-modal/style.css'
|
|
102
|
-
import TvModal from '@todovue/tv-modal'
|
|
103
|
-
|
|
104
|
-
createApp(App)
|
|
105
|
-
.use(TvModal) // enables <TvModal /> globally
|
|
106
|
-
.mount('#app')
|
|
107
|
-
```
|
|
108
|
-
Local import inside a component:
|
|
109
|
-
```vue
|
|
110
|
-
<script setup>
|
|
111
|
-
import { ref } from 'vue'
|
|
112
|
-
import { TvModal } from '@todovue/tv-modal'
|
|
113
|
-
|
|
114
|
-
const modal = ref()
|
|
115
|
-
|
|
116
|
-
const modalConfig = {
|
|
117
|
-
title: "Confirm Action",
|
|
118
|
-
description: "Are you sure you want to proceed?",
|
|
119
|
-
confirmButtonText: "Yes",
|
|
120
|
-
cancelButtonText: "No",
|
|
121
|
-
icon: "warning"
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const openModal = () => {
|
|
125
|
-
modal.value.openModal()
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const handleAccepted = () => {
|
|
129
|
-
console.log('User confirmed')
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const handleCanceled = () => {
|
|
133
|
-
console.log('User canceled')
|
|
134
|
-
}
|
|
135
|
-
</script>
|
|
136
|
-
|
|
137
|
-
<template>
|
|
138
|
-
<button @click="openModal">Open Modal</button>
|
|
139
|
-
|
|
140
|
-
<TvModal
|
|
141
|
-
:config-modal="modalConfig"
|
|
142
|
-
@accepted="handleAccepted"
|
|
143
|
-
@canceled="handleCanceled"
|
|
144
|
-
ref="modal"
|
|
145
|
-
/>
|
|
146
|
-
</template>
|
|
147
|
-
```
|
|
148
|
-
**Note:** Don't forget to import the CSS in your main entry file as shown above.
|
|
149
|
-
|
|
150
|
-
## Nuxt 4 / SSR Usage
|
|
151
|
-
First, add the CSS to your `nuxt.config.ts`:
|
|
152
|
-
```ts
|
|
153
|
-
// nuxt.config.ts
|
|
154
|
-
export default defineNuxtConfig({
|
|
155
|
-
css: ['@todovue/tv-modal/style.css'],
|
|
156
|
-
})
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
Then create a plugin file: `plugins/tv-modal.client.ts`:
|
|
160
|
-
```ts
|
|
161
|
-
import { defineNuxtPlugin } from '#app'
|
|
162
|
-
import TvModal from '@todovue/tv-modal'
|
|
163
|
-
|
|
164
|
-
export default defineNuxtPlugin(nuxtApp => {
|
|
165
|
-
nuxtApp.vueApp.use(TvModal)
|
|
166
|
-
})
|
|
167
|
-
```
|
|
168
|
-
Use anywhere in your Nuxt app:
|
|
169
|
-
```vue
|
|
170
|
-
<template>
|
|
171
|
-
<button @click="modal.openModal()">Show Modal</button>
|
|
172
|
-
|
|
173
|
-
<TvModal
|
|
174
|
-
:config-modal="config"
|
|
175
|
-
@accepted="handleAccept"
|
|
176
|
-
ref="modal"
|
|
177
|
-
/>
|
|
178
|
-
</template>
|
|
179
|
-
|
|
180
|
-
<script setup>
|
|
181
|
-
import { ref } from 'vue'
|
|
182
|
-
|
|
183
|
-
const modal = ref()
|
|
184
|
-
const config = {
|
|
185
|
-
title: "Success!",
|
|
186
|
-
description: "Operation completed",
|
|
187
|
-
confirmButtonText: "OK",
|
|
188
|
-
icon: "success"
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const handleAccept = () => {
|
|
192
|
-
// Handle acceptance
|
|
193
|
-
}
|
|
194
|
-
</script>
|
|
195
|
-
```
|
|
196
|
-
Optional direct import (no plugin):
|
|
197
|
-
```vue
|
|
198
|
-
<script setup>
|
|
199
|
-
import { TvModal } from '@todovue/tv-modal'
|
|
200
|
-
</script>
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
## Component Registration Options
|
|
204
|
-
| Approach | When to use |
|
|
205
|
-
|-----------------------------------------------------------------|------------------------------------------------|
|
|
206
|
-
| Global via `app.use(TvModal)` | Many usages across app / design system install |
|
|
207
|
-
| Local named import `{ TvModal }` | Isolated / code-split contexts |
|
|
208
|
-
| Direct default import `import TvModal from '@todovue/tv-modal'` | Single usage or manual registration |
|
|
209
|
-
|
|
210
|
-
## Props
|
|
211
|
-
| Prop | Type | Default | Description |
|
|
212
|
-
|-----------------|---------|---------|-------------------------------------------------------------------------------|
|
|
213
|
-
| configModal | Object | — | **Required.** Configuration object for modal content and buttons (see below). |
|
|
214
|
-
| theme | String | '' | Theme override: `''` (auto-detect), `'dark-mode'`, or `'light-mode'`. |
|
|
215
|
-
| closeOnBackdrop | Boolean | `false` | If `true`, clicking the backdrop closes the modal. Default is `false`. |
|
|
216
|
-
|
|
217
|
-
## Events
|
|
218
|
-
| Event name | Payload | Description |
|
|
219
|
-
|------------|---------|--------------------------------------------------|
|
|
220
|
-
| `accepted` | — | Emitted when user clicks the confirm button. |
|
|
221
|
-
| `canceled` | — | Emitted when user clicks cancel or presses ESC. |
|
|
222
|
-
|
|
223
|
-
Usage:
|
|
224
|
-
```vue
|
|
225
|
-
<TvModal
|
|
226
|
-
:config-modal="config"
|
|
227
|
-
@accepted="onAccept"
|
|
228
|
-
@canceled="onCancel"
|
|
229
|
-
ref="modal"
|
|
230
|
-
/>
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
## Configuration Object
|
|
234
|
-
The `configModal` prop accepts an object with the following properties:
|
|
235
|
-
|
|
236
|
-
| Property | Type | Required | Description |
|
|
237
|
-
|----------------------|--------|----------|------------------------------------------------------------------------|
|
|
238
|
-
| title | String | No* | Modal title text. |
|
|
239
|
-
| description | String | No* | Modal description/body text. |
|
|
240
|
-
| confirmButtonText | String | No | Text for the confirm button. If omitted, button won't show. |
|
|
241
|
-
| confirmButtonVariant | String | No | Variant for confirm button (e.g. `success`, `danger`). Def: `success`. |
|
|
242
|
-
| cancelButtonText | String | No | Text for the cancel button. If omitted, button won't show. |
|
|
243
|
-
| cancelButtonVariant | String | No | Variant for cancel button. (e.g. `success`, `danger`). Def: `success`. |
|
|
244
|
-
| icon | String | No | Icon variant: `'success'`, `'error'`, `'warning'`, or `'info'`. |
|
|
245
|
-
|
|
246
|
-
\* At least one of `title` or `description` is required (validated by prop validator).
|
|
247
|
-
|
|
248
|
-
Example:
|
|
249
|
-
```js
|
|
250
|
-
const modalConfig = {
|
|
251
|
-
title: "Delete Item",
|
|
252
|
-
description: "This action cannot be undone. Are you sure?",
|
|
253
|
-
confirmButtonText: "Delete",
|
|
254
|
-
cancelButtonText: "Cancel",
|
|
255
|
-
icon: "warning"
|
|
256
|
-
}
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
## Theme Support
|
|
260
|
-
TvModal automatically detects the theme from your application:
|
|
261
|
-
- Checks `document.body` for `.dark-mode` or `.light-mode` classes
|
|
262
|
-
- Checks `#app` element for theme classes
|
|
263
|
-
- Falls back to searching for any `.dark-mode` or `.light-mode` element
|
|
264
|
-
- Observes DOM changes to update theme dynamically
|
|
265
|
-
|
|
266
|
-
Manual override:
|
|
267
|
-
```vue
|
|
268
|
-
<TvModal :config-modal="config" theme="dark-mode" ref="modal" />
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
<TvModal :config-modal="config" theme="dark-mode" ref="modal" />
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
## Slots
|
|
275
|
-
TvModal provides slots for full content customization, allowing you to go beyond simple text and standard structures.
|
|
276
|
-
|
|
277
|
-
| Slot Name | Description |
|
|
278
|
-
|-----------|------------------------------------------------------------------------------|
|
|
279
|
-
| `header` | Replaces the default icon and title area. |
|
|
280
|
-
| `default` | The main body of the modal. Replaces the standard description text. |
|
|
281
|
-
| `footer` | Replaces the default action buttons. You must handle closing logic manually. |
|
|
282
|
-
|
|
283
|
-
*Note: You can mix and match configuration props with slots. For example, use `configModal.title` for the title and the `default` slot for a custom form body.*
|
|
284
|
-
|
|
285
|
-
## Usage Examples
|
|
286
|
-
|
|
287
|
-
### Success Modal
|
|
288
|
-
```vue
|
|
289
|
-
<script setup>
|
|
290
|
-
import { ref } from 'vue'
|
|
291
|
-
import { TvModal } from '@todovue/tv-modal'
|
|
292
|
-
|
|
293
|
-
const modal = ref()
|
|
294
|
-
const config = {
|
|
295
|
-
title: "Success!",
|
|
296
|
-
description: "Your operation was completed successfully",
|
|
297
|
-
confirmButtonText: "Great!",
|
|
298
|
-
icon: "success"
|
|
299
|
-
}
|
|
300
|
-
</script>
|
|
301
|
-
|
|
302
|
-
<template>
|
|
303
|
-
<button @click="modal.openModal()">Show Success</button>
|
|
304
|
-
<TvModal :config-modal="config" @accepted="() => {}" ref="modal" />
|
|
305
|
-
</template>
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### Error Modal
|
|
309
|
-
```vue
|
|
310
|
-
<script setup>
|
|
311
|
-
import { ref } from 'vue'
|
|
312
|
-
import { TvModal } from '@todovue/tv-modal'
|
|
313
|
-
|
|
314
|
-
const modal = ref()
|
|
315
|
-
const config = {
|
|
316
|
-
title: "Error occurred",
|
|
317
|
-
description: "Something went wrong. Please try again later.",
|
|
318
|
-
confirmButtonText: "OK",
|
|
319
|
-
cancelButtonText: "Cancel",
|
|
320
|
-
icon: "error"
|
|
321
|
-
}
|
|
322
|
-
</script>
|
|
323
|
-
|
|
324
|
-
<template>
|
|
325
|
-
<button @click="modal.openModal()">Show Error</button>
|
|
326
|
-
<TvModal
|
|
327
|
-
:config-modal="config"
|
|
328
|
-
@accepted="handleRetry"
|
|
329
|
-
@canceled="handleCancel"
|
|
330
|
-
ref="modal"
|
|
331
|
-
/>
|
|
332
|
-
</template>
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
### Warning Modal
|
|
336
|
-
```vue
|
|
337
|
-
<script setup>
|
|
338
|
-
import { ref } from 'vue'
|
|
339
|
-
import { TvModal } from '@todovue/tv-modal'
|
|
340
|
-
|
|
341
|
-
const modal = ref()
|
|
342
|
-
const config = {
|
|
343
|
-
title: "Are you sure?",
|
|
344
|
-
description: "If you delete it there is no step back",
|
|
345
|
-
confirmButtonText: "Yes, delete it",
|
|
346
|
-
cancelButtonText: "No, keep it",
|
|
347
|
-
icon: "warning"
|
|
348
|
-
}
|
|
349
|
-
</script>
|
|
350
|
-
|
|
351
|
-
<template>
|
|
352
|
-
<button @click="modal.openModal()">Delete Item</button>
|
|
353
|
-
<TvModal
|
|
354
|
-
:config-modal="config"
|
|
355
|
-
@accepted="deleteItem"
|
|
356
|
-
@canceled="() => {}"
|
|
357
|
-
ref="modal"
|
|
358
|
-
/>
|
|
359
|
-
</template>
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
### Info Modal
|
|
363
|
-
```vue
|
|
364
|
-
<script setup>
|
|
365
|
-
import { ref } from 'vue'
|
|
366
|
-
import { TvModal } from '@todovue/tv-modal'
|
|
367
|
-
|
|
368
|
-
const modal = ref()
|
|
369
|
-
const config = {
|
|
370
|
-
title: "Information",
|
|
371
|
-
description: "Here is some important information you should know about.",
|
|
372
|
-
confirmButtonText: "Got it",
|
|
373
|
-
icon: "info"
|
|
374
|
-
}
|
|
375
|
-
</script>
|
|
376
|
-
|
|
377
|
-
<template>
|
|
378
|
-
<button @click="modal.openModal()">Show Info</button>
|
|
379
|
-
<TvModal :config-modal="config" @accepted="() => {}" ref="modal" />
|
|
380
|
-
</template>
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
### With Slots (Custom Content)
|
|
384
|
-
```vue
|
|
385
|
-
<script setup>
|
|
386
|
-
import { ref } from 'vue'
|
|
387
|
-
import { TvModal } from '@todovue/tv-modal'
|
|
388
|
-
import { TvButton } from '@todovue/tv-button'
|
|
389
|
-
|
|
390
|
-
const modal = ref()
|
|
391
|
-
// Config is minimal if using full slots, or you can mix them
|
|
392
|
-
const config = { title: "Custom Form" }
|
|
393
|
-
|
|
394
|
-
const handleSave = () => {
|
|
395
|
-
// Logic here
|
|
396
|
-
modal.value.acceptModal() // Manually trigger close/animate
|
|
397
|
-
}
|
|
398
|
-
</script>
|
|
399
|
-
|
|
400
|
-
<template>
|
|
401
|
-
<button @click="modal.openModal()">Open Custom Modal</button>
|
|
402
|
-
|
|
403
|
-
<TvModal :config-modal="config" ref="modal">
|
|
404
|
-
<template #header>
|
|
405
|
-
<h3 class="custom-title">My Custom Header</h3>
|
|
406
|
-
</template>
|
|
407
|
-
|
|
408
|
-
<div class="my-form">
|
|
409
|
-
<input type="text" placeholder="Enter name" />
|
|
410
|
-
</div>
|
|
411
|
-
|
|
412
|
-
<template #footer>
|
|
413
|
-
<TvButton @click="handleSave">Save</TvButton>
|
|
414
|
-
<TvButton variant="danger" @click="modal.cancelModal()">Close</TvButton>
|
|
415
|
-
</template>
|
|
416
|
-
</TvModal>
|
|
417
|
-
</template>
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
## Animations
|
|
421
|
-
TvModal includes built-in animations:
|
|
422
|
-
- **Scale up**: When modal opens
|
|
423
|
-
- **Scale down**: When modal closes
|
|
424
|
-
- **Rotate shake**: When user clicks the overlay (attention grabber)
|
|
425
|
-
|
|
426
|
-
Animations are managed internally via the `useModal` composable and applied via CSS classes.
|
|
427
|
-
|
|
428
|
-
## Accessibility
|
|
429
|
-
- Uses Vue `<Teleport>` to render modal at the body level
|
|
430
|
-
- Proper ARIA attributes: `role="dialog"`, `aria-modal="true"`
|
|
431
|
-
- Dynamic `aria-labelledby` and `aria-describedby` based on title/description
|
|
432
|
-
- Keyboard support: ESC key to close/cancel
|
|
433
|
-
- Focus management:
|
|
434
|
-
- Focuses modal on open
|
|
435
|
-
- Restores focus to triggering element on close
|
|
436
|
-
- Action buttons use the accessible `@todovue/tv-button` component
|
|
437
|
-
|
|
438
|
-
## SSR Notes
|
|
439
|
-
- Safe for SSR (no direct `window`/`document` access during module evaluation)
|
|
440
|
-
- Uses `onMounted` for theme detection and DOM observers
|
|
441
|
-
- Teleport target is `body` (ensure it exists in SSR context)
|
|
442
|
-
- Theme detection gracefully handles `typeof document === 'undefined'`
|
|
443
|
-
- Works seamlessly with Nuxt 3
|
|
444
|
-
|
|
445
|
-
## Development
|
|
446
|
-
```bash
|
|
447
|
-
git clone https://github.com/TODOvue/tv-modal.git
|
|
448
|
-
cd tv-modal
|
|
449
|
-
npm install
|
|
450
|
-
npm run dev # run demo playground
|
|
451
|
-
npm run build # build library
|
|
452
|
-
```
|
|
453
|
-
Local demo served from Vite using `index.html` and demo examples in `src/demo`.
|
|
454
|
-
|
|
455
|
-
## Contributing
|
|
456
|
-
PRs and issues welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md) and [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md).
|
|
457
|
-
|
|
458
|
-
### Dependencies
|
|
459
|
-
- **Runtime**: `@todovue/tv-button` (for action buttons)
|
|
460
|
-
- **Peer**: `vue@^3.0.0`
|
|
461
|
-
|
|
462
|
-
## License
|
|
463
|
-
MIT © TODOvue
|
|
464
|
-
|
|
465
|
-
### Attributions
|
|
466
|
-
Crafted for the TODOvue component ecosystem
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to `@todovue/tv-pagination` will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [1.1.4] - 2026-01-27
|
|
9
|
-
|
|
10
|
-
### Changed
|
|
11
|
-
- Simplified the file list in `package.json` to include only essential assets.
|
|
12
|
-
- Simplified the build configuration by removing demo-specific logic.
|
|
13
|
-
- Enhanced GitHub Actions workflows to automate npm package publishing and GitHub release creation.
|
|
14
|
-
- Moved the `@todovue/tv-demo` component import from main.js to `Demo.vue` to localize its usage.
|
|
15
|
-
- Updated build commands to include `README.md` and `CHANGELOG.md` files in the public directory during the build process.
|
|
16
|
-
|
|
17
|
-
### Added
|
|
18
|
-
- Included the `src` directory in the `package.json` files list to ensure component source files are bundled in the package distribution.
|
|
19
|
-
|
|
20
|
-
### Removed
|
|
21
|
-
- Eliminated the global import of the `@todovue/tv-demo` component from `main.js`.
|
|
22
|
-
|
|
23
|
-
### Dependencies
|
|
24
|
-
- Updated `@todovue/tv-demo` to `^1.4.11`.
|
|
25
|
-
- Updated `@todovue/tv-button` to `^1.2.5`.
|
|
26
|
-
- Updated `vue` to `^3.5.27`.
|
|
27
|
-
- Updated `sass` to `^1.97.3`.
|
|
28
|
-
|
|
29
|
-
## [1.1.3] - 2026-01-21
|
|
30
|
-
|
|
31
|
-
### Added
|
|
32
|
-
- Introduced a summary display feature to provide a condensed overview of component data.
|
|
33
|
-
- Added size customization options, allowing users to adjust component dimensions to fit specific layout requirements.
|
|
34
|
-
|
|
35
|
-
### Dependencies
|
|
36
|
-
- Updated `@todovue/tv-demo` to `^1.4.4`.
|
|
37
|
-
- Updated `@todovue/tv-button` to `^1.2.4`.
|
|
38
|
-
- Updated `sass` to `^1.97.2`.
|
|
39
|
-
- Updated `vite` to `^7.3.1`.
|
|
40
|
-
|
|
41
|
-
## [1.1.2] - 2025-12-27
|
|
42
|
-
|
|
43
|
-
### Added
|
|
44
|
-
- Added automatic publishing to the TODOvue cPanel in `release.yml` for each release, simplifying package distribution and updates.
|
|
45
|
-
- Added `package-lock.json` to the repository to ensure dependency consistency and facilitate version management across development and production environments.
|
|
46
|
-
|
|
47
|
-
### Changed
|
|
48
|
-
- Changed the `base` option in `vite.config.js` for website deployment in cpanel.
|
|
49
|
-
|
|
50
|
-
### Fixed
|
|
51
|
-
- Fixed repository URL in `package.json` to point to the correct GitHub repository.
|
|
52
|
-
- Fixed the token configuration used to generate the package in the GitHub Actions workflow `release.yml`.
|
|
53
|
-
|
|
54
|
-
### Dependencies
|
|
55
|
-
- Updated dependency versions in `package.json` to maintain compatibility and benefit from improvements and bug fixes in the used libraries.
|
|
56
|
-
|
|
57
|
-
## [1.1.1] - 2025-11-25
|
|
58
|
-
|
|
59
|
-
### Changed
|
|
60
|
-
- Changed theme colors in the button styles to match the latest design guidelines.
|
|
61
|
-
|
|
62
|
-
### Fixed
|
|
63
|
-
- Fixed export path for `./style.css` in `package.json` to ensure proper resolution.
|
|
64
|
-
|
|
65
|
-
### Dependencies
|
|
66
|
-
- Updated the `@todovue/tv-demo` dependency to `^1.2.2` to ensure compatibility with the latest changes.
|
|
67
|
-
|
|
68
|
-
## [1.1.0] - 2025-11-21
|
|
69
|
-
|
|
70
|
-
### Added
|
|
71
|
-
- Added `nux.js` configuration file for Nuxt 4 integration.
|
|
72
|
-
- Added `tsconfig.json` for proper type checking during build.
|
|
73
|
-
- Create `global.d.ts` to declare module for TypeScript users.
|
|
74
|
-
- Added Nuxt module for automatic style injection and auto-registration of the `TvPagination` component.
|
|
75
|
-
- The `@todovue/tv-pagination` component is now externalized from the final build, reducing bundle size.
|
|
76
|
-
- Added `CHANGELOG.md` in script to generate demo and documentation site.
|
|
77
|
-
|
|
78
|
-
### Dependencies
|
|
79
|
-
- Updated the `@todovue/tv-demo` dependency to `^1.2.1` to ensure compatibility with the latest changes.
|
|
80
|
-
- Updated the `@todovue/tv-button` dependency to `^1.2.2` to ensure compatibility with the latest changes.
|
|
81
|
-
|
|
82
|
-
## [1.0.1] - 2025-11-15
|
|
83
|
-
|
|
84
|
-
### Changed
|
|
85
|
-
- Styles are now served as a separate CSS file (`dist/tv-pagination.css`) generated by Vite during the build process.
|
|
86
|
-
- Users must now explicitly import the stylesheet in their application:
|
|
87
|
-
- For Vue/Vite SPA: `import '@todovue/tv-pagination/style.css'` in `main.ts`
|
|
88
|
-
- For Nuxt 3/4: Add `'@todovue/tv-pagination/style.css'` to the `css` array in `nuxt.config.ts`
|
|
89
|
-
|
|
90
|
-
### Added
|
|
91
|
-
- Added `sideEffects` field to `package.json` to support proper tree-shaking with CSS files.
|
|
92
|
-
- Added `./style.css` export path in `package.json` for explicit CSS imports.
|
|
93
|
-
- Improved SSR/SSG compatibility, especially for Nuxt 3/4 applications.
|
|
94
|
-
|
|
95
|
-
### Dependencies
|
|
96
|
-
- Removed dependency on `vite-plugin-css-injected-by-js` from `devDependencies`
|
|
97
|
-
|
|
98
|
-
## [1.0.0] - 2025-11-09
|
|
99
|
-
|
|
100
|
-
### Added
|
|
101
|
-
* First stable version of the `TvPagination` component.
|
|
102
|
-
* Automatic calculation of total pages (`totalItems` + `pageSize`).
|
|
103
|
-
* Dynamic range with `siblingCount` and `boundaryCount`.
|
|
104
|
-
* Conditional left/right ellipsis rendering.
|
|
105
|
-
* Optional buttons: first/last (`showFirstLast`) and previous/next (`showPrevNext`).
|
|
106
|
-
* Navigation icon support (`showIcons`).
|
|
107
|
-
* Customizable styles for active and inactive pages (`activeStyle`, `inactiveStyle`).
|
|
108
|
-
* Propagation of `buttonProps` to each internal `TvButton`.
|
|
109
|
-
* `page-label` slot to customize each page’s label.
|
|
110
|
-
* Controlled API through `v-model` (syncs `modelValue`).
|
|
111
|
-
* Emission of `update:modelValue` and `change` events only on actual page changes.
|
|
112
|
-
* Invalid range protection (min/max normalization in watcher and composable).
|
|
113
|
-
* Global disabled state (`disabled`).
|
|
114
|
-
* Configurable accessible label (`ariaLabel`) and `aria-current` on active page.
|
|
115
|
-
* Built as ES/CJS library with types (`vite-plugin-dts`).
|
|
116
|
-
* Automatic injection of compiled SCSS styles (via `vite-plugin-css-injected-by-js`).
|
|
117
|
-
* Prepared for SSR environments (no direct DOM access).
|
|
118
|
-
|
|
119
|
-
[1.1.4]: https://github.com/TODOvue/tv-pagination/pull/7/files
|
|
120
|
-
[1.1.3]: https://github.com/TODOvue/tv-pagination/pull/6/files
|
|
121
|
-
[1.1.2]: https://github.com/TODOvue/tv-pagination/pull/5/files
|
|
122
|
-
[1.1.1]: https://github.com/TODOvue/tv-pagination/pull/4/files
|
|
123
|
-
[1.1.0]: https://github.com/TODOvue/tv-pagination/pull/3/files
|
|
124
|
-
[1.0.1]: https://github.com/TODOvue/tv-pagination/pull/2/files
|
|
125
|
-
[1.0.0]: https://github.com/TODOvue/tv-pagination/pull/1/files
|