@todovue/tv-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +207 -0
  3. package/dist/.htaccess +8 -0
  4. package/dist/demos/tv-alert/CHANGELOG.md +127 -0
  5. package/dist/demos/tv-alert/README.md +334 -0
  6. package/dist/demos/tv-article/CHANGELOG.md +221 -0
  7. package/dist/demos/tv-article/README.md +258 -0
  8. package/dist/demos/tv-breadcrumbs/CHANGELOG.md +135 -0
  9. package/dist/demos/tv-breadcrumbs/README.md +364 -0
  10. package/dist/demos/tv-button/CHANGELOG.md +158 -0
  11. package/dist/demos/tv-button/README.md +255 -0
  12. package/dist/demos/tv-card/CHANGELOG.md +158 -0
  13. package/dist/demos/tv-card/README.md +332 -0
  14. package/dist/demos/tv-demo/CHANGELOG.md +352 -0
  15. package/dist/demos/tv-demo/README.md +229 -0
  16. package/dist/demos/tv-footer/CHANGELOG.md +67 -0
  17. package/dist/demos/tv-footer/README.md +760 -0
  18. package/dist/demos/tv-hero/CHANGELOG.md +137 -0
  19. package/dist/demos/tv-hero/README.md +410 -0
  20. package/dist/demos/tv-label/CHANGELOG.md +138 -0
  21. package/dist/demos/tv-label/README.md +357 -0
  22. package/dist/demos/tv-menu/CHANGELOG.md +145 -0
  23. package/dist/demos/tv-menu/README.md +389 -0
  24. package/dist/demos/tv-modal/CHANGELOG.md +127 -0
  25. package/dist/demos/tv-modal/README.md +466 -0
  26. package/dist/demos/tv-pagination/CHANGELOG.md +125 -0
  27. package/dist/demos/tv-pagination/README.md +275 -0
  28. package/dist/demos/tv-progress-bar/CHANGELOG.md +84 -0
  29. package/dist/demos/tv-progress-bar/README.md +894 -0
  30. package/dist/demos/tv-relative-time/CHANGELOG.md +122 -0
  31. package/dist/demos/tv-relative-time/README.md +405 -0
  32. package/dist/demos/tv-scroll-top/CHANGELOG.md +69 -0
  33. package/dist/demos/tv-scroll-top/README.md +445 -0
  34. package/dist/demos/tv-search/CHANGELOG.md +155 -0
  35. package/dist/demos/tv-search/README.md +407 -0
  36. package/dist/demos/tv-settings/CHANGELOG.md +94 -0
  37. package/dist/demos/tv-settings/README.md +314 -0
  38. package/dist/demos/tv-sidebar/CHANGELOG.md +229 -0
  39. package/dist/demos/tv-sidebar/README.md +592 -0
  40. package/dist/demos/tv-theme-button/CHANGELOG.md +136 -0
  41. package/dist/demos/tv-theme-button/README.md +392 -0
  42. package/dist/demos/tv-toc/CHANGELOG.md +80 -0
  43. package/dist/demos/tv-toc/README.md +288 -0
  44. package/dist/entry.d.ts +48 -0
  45. package/dist/favicon.ico +0 -0
  46. package/dist/tv-ui.cjs.js +1 -0
  47. package/dist/tv-ui.css +1 -0
  48. package/dist/tv-ui.d.ts +6 -0
  49. package/dist/tv-ui.es.js +92 -0
  50. package/nuxt.js +58 -0
  51. package/package.json +92 -0
@@ -0,0 +1,466 @@
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
+ [![npm](https://img.shields.io/npm/v/@todovue/tv-modal.svg)](https://www.npmjs.com/package/@todovue/tv-modal)
8
+ [![npm downloads](https://img.shields.io/npm/dm/@todovue/tv-modal.svg)](https://www.npmjs.com/package/@todovue/tv-modal)
9
+ [![npm total downloads](https://img.shields.io/npm/dt/@todovue/tv-modal.svg)](https://www.npmjs.com/package/@todovue/tv-modal)
10
+ ![License](https://img.shields.io/github/license/TODOvue/tv-modal)
11
+ ![Release Date](https://img.shields.io/github/release-date/TODOvue/tv-modal)
12
+ ![Bundle Size](https://img.shields.io/bundlephobia/minzip/@todovue/tv-modal)
13
+ ![Node Version](https://img.shields.io/node/v/@todovue/tv-modal)
14
+ ![Last Commit](https://img.shields.io/github/last-commit/TODOvue/tv-modal)
15
+ ![Stars](https://img.shields.io/github/stars/TODOvue/tv-modal?style=social)
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
@@ -0,0 +1,125 @@
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