@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,407 @@
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 Search (TvSearch)
5
+ A fast, accessible, and fully customizable search interface component for Vue 3 applications. Provides an elegant modal search experience with keyboard shortcuts, real-time filtering, and complete style customization. Works seamlessly in Single Page Apps or Server-Side Rendered (SSR) environments (e.g. Nuxt 3).
6
+
7
+ [![npm](https://img.shields.io/npm/v/@todovue/tv-search.svg)](https://www.npmjs.com/package/@todovue/tv-search)
8
+ [![npm downloads](https://img.shields.io/npm/dm/@todovue/tv-search.svg)](https://www.npmjs.com/package/@todovue/tv-search)
9
+ [![npm total downloads](https://img.shields.io/npm/dt/@todovue/tv-search.svg)](https://www.npmjs.com/package/@todovue/tv-search)
10
+ ![License](https://img.shields.io/github/license/TODOvue/tv-search)
11
+ ![Release Date](https://img.shields.io/github/release-date/TODOvue/tv-search)
12
+ ![Bundle Size](https://img.shields.io/bundlephobia/minzip/@todovue/tv-search)
13
+ ![Node Version](https://img.shields.io/node/v/@todovue/tv-search)
14
+ ![Last Commit](https://img.shields.io/github/last-commit/TODOvue/tv-search)
15
+ ![Stars](https://img.shields.io/github/stars/TODOvue/tv-search?style=social)
16
+
17
+ > Demo: https://ui.todovue.blog/search
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
+ - [Keyboard Shortcuts](#keyboard-shortcuts)
28
+ - [Customization (Styles / Theming)](#customization-styles--theming)
29
+ - [Results Data Structure](#results-data-structure)
30
+ - [Accessibility](#accessibility)
31
+ - [SSR Notes](#ssr-notes)
32
+ - [Development](#development)
33
+ - [Contributing](#contributing)
34
+ - [Changelog](#changelog)
35
+ - [License](#license)
36
+
37
+ ## Features
38
+ - **Keyboard-first UX**: Open with `Ctrl+K` / `Cmd+K`, close with `Esc`
39
+ - **Real-time filtering**: Search as you type with instant results
40
+ - **Modal interface**: Clean overlay design that focuses user attention
41
+ - **Fully customizable**: Override colors for body, input, button, and text
42
+ - **Accessible**: Built with semantic HTML and keyboard navigation
43
+ - **Lightweight**: Minimal dependencies, Vue 3 marked as peer dependency
44
+ - **SSR compatible**: Works in Nuxt 3 and other SSR frameworks
45
+ - **Autofocus**: Input field receives focus automatically when opened
46
+ - **Click-away close**: Modal closes when clicking outside the content area
47
+ - **Flexible results**: Pass any array of searchable items with custom properties
48
+
49
+ ## Installation
50
+ Using npm:
51
+ ```bash
52
+ npm install @todovue/tv-search
53
+ ```
54
+ Using yarn:
55
+ ```bash
56
+ yarn add @todovue/tv-search
57
+ ```
58
+ Using pnpm:
59
+ ```bash
60
+ pnpm add @todovue/tv-search
61
+ ```
62
+
63
+ ## Quick Start (SPA)
64
+ Global registration (main.js / main.ts):
65
+ ```js
66
+ import { createApp } from 'vue'
67
+ import App from './App.vue'
68
+ import { TvSearch } from '@todovue/tv-search'
69
+ import '@todovue/tv-search/style.css' // import styles
70
+ import '@todovue/tv-button/style.css' // import styles
71
+
72
+ createApp(App)
73
+ .use(TvSearch) // enables <TvSearch /> globally
74
+ .mount('#app')
75
+ ```
76
+
77
+ Local import inside a component:
78
+ ```vue
79
+ <script setup>
80
+ import { ref } from 'vue'
81
+ import { TvSearch } from '@todovue/tv-search'
82
+ import '@todovue/tv-search/style.css' // import styles
83
+ import '@todovue/tv-button/style.css' // import styles
84
+
85
+ const results = ref([
86
+ {
87
+ id: 1,
88
+ title: 'How to use Vue 3',
89
+ description: 'Vue 3 is the latest version of Vue.js',
90
+ url: 'https://todovue.com/blog/how-to-use-vue-3',
91
+ },
92
+ {
93
+ id: 2,
94
+ title: 'How to use Vite',
95
+ description: 'Vite is a build tool for modern web development',
96
+ url: 'https://todovue.com/blog/how-to-use-vite',
97
+ },
98
+ {
99
+ id: 3,
100
+ title: 'How to use Pinia',
101
+ description: 'Pinia is a modern store for Vue 3',
102
+ url: 'https://todovue.com/blog/how-to-use-pinia',
103
+ },
104
+ ])
105
+
106
+ function handleSearch(query) {
107
+ console.log('Search query:', query)
108
+ // Handle search logic here
109
+ }
110
+ </script>
111
+
112
+ <template>
113
+ <tv-search
114
+ placeholder="Search documentation..."
115
+ titleButton="Search"
116
+ :results="results"
117
+ @search="handleSearch"
118
+ />
119
+ </template>
120
+ ```
121
+
122
+ ## Nuxt 4 / SSR Usage
123
+ Create a plugin file: `plugins/tv-search.client.ts` (client-only is recommended since it uses keyboard events):
124
+ ```ts
125
+ // nuxt.config.ts
126
+ export default defineNuxtConfig({
127
+ modules: [
128
+ '@todovue/tv-search/nuxt'
129
+ ]
130
+ })
131
+ ```
132
+
133
+ Then use anywhere in your Nuxt app:
134
+ ```vue
135
+ <template>
136
+ <tv-search
137
+ placeholder="Search site..."
138
+ titleButton="Search"
139
+ :results="searchResults"
140
+ @search="onSearch"
141
+ />
142
+ </template>
143
+
144
+ <script setup>
145
+ const searchResults = ref([
146
+ // your search results
147
+ ])
148
+
149
+ function onSearch(query) {
150
+ // handle search
151
+ }
152
+ </script>
153
+ ```
154
+
155
+ Optional direct import (no plugin needed):
156
+ ```vue
157
+ <script setup>
158
+ import { TvSearch } from '@todovue/tv-search'
159
+ </script>
160
+ ```
161
+
162
+ ## Component Registration Options
163
+ | Approach | When to use |
164
+ |------------------------------------------------------|----------------------------------------------------|
165
+ | Global via `app.use(TvSearch)` | Design system / used across many pages |
166
+ | Global via `app.component('TvSearch', TvSearch)` | Custom component name / multiple search components |
167
+ | Local named import `import TvSearch from '...'` | Single page usage / code splitting |
168
+ | Nuxt plugin `.client.ts` | SSR apps with client-side interactions |
169
+
170
+ ## Props
171
+ | Prop | Type | Default | Description | Required |
172
+ |---------------|--------|--------------------------|---------------------------------------------------------------------------------------|----------|
173
+ | placeholder | String | `""` | Placeholder text for the search input field | `true` |
174
+ | titleButton | String | `""` | Text displayed on the search button | `true` |
175
+ | results | Array | `[]` | Array of searchable items (see [Results Data Structure](#results-data-structure)) | `true` |
176
+ | customStyles | Object | `{}` | Custom color scheme for theming (see [Customization](#customization-styles--theming)) | `false` |
177
+ | searchKeys | Array | `['title']` | Array of keys in result objects to search against | `false` |
178
+ | noResultsText | String | `"No results found for"` | Text to display when no results match the query | `false` |
179
+
180
+ ### customStyles Object
181
+ Customize the appearance by passing a `customStyles` object with any of these properties:
182
+
183
+ | Property | Type | Default | Description |
184
+ |-------------|--------|-------------|----------------------------------------------------------|
185
+ | bgBody | String | `"#0E131F"` | Background color of the modal overlay (with 0.9 opacity) |
186
+ | bgInput | String | `"#B9C4DF"` | Background color of the search input area |
187
+ | bgButton | String | `"#EF233C"` | Background color of the search button |
188
+ | colorButton | String | `"#F4FAFF"` | Text color of the search button |
189
+
190
+ ## Events
191
+ | Event | Payload Type | Description |
192
+ |--------|-----------------|-------------------------------------------------------------------------------------------------|
193
+ | search | String / Object | Emitted when search is triggered (Enter key or button click). Returns the trimmed search query. |
194
+
195
+ Example:
196
+ ```vue
197
+ <tv-search
198
+ placeholder="Search..."
199
+ titleButton="Go"
200
+ :results="items"
201
+ @search="handleSearch"
202
+ />
203
+
204
+ <script setup>
205
+ function handleSearch(query) {
206
+ console.log('User searched for:', query)
207
+ // Perform API call, route navigation, etc.
208
+ }
209
+ </script>
210
+ ```
211
+
212
+ ## Slots
213
+ | Slot Name | Props | Description |
214
+ |------------|--------------|---------------------------------------------------|
215
+ | item | `{ result }` | Custom rendering for each result item in the list |
216
+ | no-results | - | Custom content when no results are found |
217
+
218
+ ### Custom Slot Example
219
+ ```vue
220
+ <tv-search
221
+ :results="items"
222
+ :searchKeys="['title', 'description']"
223
+ >
224
+ <template #item="{ result }">
225
+ <div class="my-custom-item">
226
+ <h3>{{ result.title }}</h3>
227
+ <p>{{ result.description }}</p>
228
+ </div>
229
+ </template>
230
+
231
+ <template #no-results>
232
+ <div class="empty-state">
233
+ <p>No matches found.</p>
234
+ </div>
235
+ </template>
236
+ </tv-search>
237
+ ```
238
+
239
+ ## Keyboard Shortcuts
240
+ | Shortcut | Action |
241
+ |------------------------|-----------------------------------|
242
+ | `Ctrl + K` / `Cmd + K` | Open the search modal |
243
+ | `Escape` | Close the search modal |
244
+ | `Enter` | Execute search with current input |
245
+ | Click outside modal | Close the search modal |
246
+
247
+ ## Customization (Styles / Theming)
248
+ You can override the default color scheme by passing a `customStyles` object:
249
+
250
+ ```vue
251
+ <script setup>
252
+ import { ref } from 'vue'
253
+ import { TvSearch } from '@todovue/tv-search'
254
+
255
+ const customStyles = ref({
256
+ bgBody: "#1e1d23",
257
+ bgInput: "#8673a1",
258
+ bgButton: "#80286e",
259
+ colorButton: "#d7c9c9",
260
+ })
261
+
262
+ const results = ref([
263
+ // your results
264
+ ])
265
+ </script>
266
+
267
+ <template>
268
+ <tv-search
269
+ placeholder="Type to search..."
270
+ titleButton="Search"
271
+ :results="results"
272
+ :customStyles="customStyles"
273
+ />
274
+ </template>
275
+ ```
276
+
277
+ ### Example Custom Themes
278
+
279
+ **Dark Theme:**
280
+ ```js
281
+ const darkTheme = {
282
+ bgBody: "#0E131F",
283
+ bgInput: "#1F2937",
284
+ bgButton: "#3B82F6",
285
+ colorButton: "#FFFFFF",
286
+ }
287
+ ```
288
+
289
+ **Light Theme:**
290
+ ```js
291
+ const lightTheme = {
292
+ bgBody: "#F9FAFB",
293
+ bgInput: "#FFFFFF",
294
+ bgButton: "#6366F1",
295
+ colorButton: "#FFFFFF",
296
+ }
297
+ ```
298
+
299
+ **Brand Theme:**
300
+ ```js
301
+ const brandTheme = {
302
+ bgBody: "#0A4539",
303
+ bgInput: "#284780",
304
+ bgButton: "#80286E",
305
+ colorButton: "#D5B7B7",
306
+ }
307
+ ```
308
+
309
+ ## Results Data Structure
310
+ The `results` prop expects an array of objects with the following structure:
311
+
312
+ ```typescript
313
+ interface SearchResult {
314
+ id: number | string; // Unique identifier (required for :key)
315
+ title: string; // Displayed in search results (required)
316
+ description?: string; // Additional info (optional, not currently displayed)
317
+ url?: string; // Navigation target (optional, not currently used in component)
318
+ [key: string]: any; // Any additional custom properties
319
+ }
320
+ ```
321
+
322
+ Example:
323
+ ```js
324
+ const results = [
325
+ {
326
+ id: 1,
327
+ title: 'Getting Started with Vue 3',
328
+ description: 'Learn the basics of Vue 3 composition API',
329
+ url: '/docs/vue3-intro',
330
+ category: 'Tutorial',
331
+ },
332
+ {
333
+ id: 2,
334
+ title: 'Understanding Reactivity',
335
+ description: 'Deep dive into Vue reactivity system',
336
+ url: '/docs/reactivity',
337
+ category: 'Advanced',
338
+ },
339
+ ]
340
+ ```
341
+
342
+ **Note**: The component currently filters results based on the `title` property matching the user input (case-insensitive). You can handle the `@search` event to implement custom search logic or navigation.
343
+
344
+ ## Accessibility
345
+ - **Keyboard navigation**: Full support for `Ctrl+K`/`Cmd+K` to open, `Esc` to close, and `Enter` to search
346
+ - **Focus management**: Input automatically receives focus when modal opens and is selected for immediate typing
347
+ - **Semantic HTML**: Uses proper `<button>`, `<input>`, and modal structure
348
+ - **Click-away**: Modal closes when clicking the overlay, providing intuitive UX
349
+
350
+ **Recommendations:**
351
+ - Provide clear, descriptive `placeholder` text
352
+ - Use meaningful `titleButton` text (e.g., "Search", "Find", "Go")
353
+ - Ensure sufficient color contrast when using `customStyles`
354
+ - Consider adding `aria-label` attributes for screen reader support in future versions
355
+
356
+ ## SSR Notes
357
+ - **Safe for SSR**: No direct DOM access (`window` / `document`) during module initialization
358
+ - **Event listeners**: Keyboard event listeners are registered in `onMounted` and cleaned up in `onBeforeUnmount`
359
+ - **Client-side only**: Keyboard shortcuts require browser environment; use `.client.ts` plugin in Nuxt
360
+ - **Icons**: SVG icons are loaded via Vite's `import.meta.glob`, which works in both SPA and SSR builds
361
+ - **CSS Import**: Starting from version 1.0.4, styles are served as a separate CSS file (`dist/tv-search.css`) and must be explicitly imported:
362
+ - For Vue/Vite SPA: `import '@todovue/tv-search/style.css'` in `main.ts`
363
+ - For Nuxt 3/4: Add `'@todovue/tv-search/style.css'` to the `css` array in `nuxt.config.ts`
364
+
365
+ ## Development
366
+ Clone the repository and install dependencies:
367
+ ```bash
368
+ git clone https://github.com/TODOvue/tv-search.git
369
+ cd tv-search
370
+ yarn install
371
+ ```
372
+
373
+ Run development server with demo playground:
374
+ ```bash
375
+ yarn dev
376
+ ```
377
+
378
+ Build the library:
379
+ ```bash
380
+ yarn build
381
+ ```
382
+
383
+ Build demo site:
384
+ ```bash
385
+ yarn build:demo
386
+ ```
387
+
388
+ The demo is served from Vite using `index.html` + `src/demo` examples.
389
+
390
+ ## Contributing
391
+ Contributions are welcome! Please read our [Contributing Guidelines](https://github.com/TODOvue/tv-search/blob/main/CONTRIBUTING.md) and [Code of Conduct](https://github.com/TODOvue/tv-search/blob/main/CODE_OF_CONDUCT.md) before submitting PRs.
392
+
393
+ **How to contribute:**
394
+ 1. Fork the repository
395
+ 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
396
+ 3. Commit your changes (`git commit -m 'Add amazing feature'`)
397
+ 4. Push to the branch (`git push origin feature/amazing-feature`)
398
+ 5. Open a Pull Request
399
+
400
+ ## Changelog
401
+ See [CHANGELOG.md](https://github.com/TODOvue/tv-search/blob/main/CHANGELOG.md) for release history and version changes.
402
+
403
+ ## License
404
+ [MIT](https://github.com/TODOvue/tv-search/blob/main/LICENSE) © TODOvue
405
+
406
+ ### Attributions
407
+ Crafted for the TODOvue component ecosystem
@@ -0,0 +1,94 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@todovue/tv-settings` 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.0.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 `vue` to `^3.5.27`.
26
+ - Updated `sass` to `^1.97.3`.
27
+
28
+ ## [1.0.3] - 2026-01-21
29
+
30
+ ### Added
31
+ - Added `title` prop to easily add a header title to the panel.
32
+ - Added `trigger` slot to allow full customization of the toggle button.
33
+
34
+ ### Dependencies
35
+ - Updated `@todovue/tv-demo` to `^1.4.4`.
36
+ - Updated `sass` to `^1.97.2`.
37
+ - Updated `vite` to `^7.3.1`.
38
+
39
+ ## [1.0.2] - 2025-12-27
40
+
41
+ ### Added
42
+ - Added automatic publishing to the TODOvue cPanel in `release.yml` for each release, simplifying package distribution and updates.
43
+ - Added `package-lock.json` to the repository to ensure dependency consistency and facilitate version management across development and production environments.
44
+
45
+ ### Changed
46
+ - Changed the `base` option in `vite.config.js` for website deployment in cpanel.
47
+
48
+ ### Fixed
49
+ - Fixed repository URL in `package.json` to point to the correct GitHub repository.
50
+ - Fixed the token configuration used to generate the package in the GitHub Actions workflow `release.yml`.
51
+
52
+ ### Dependencies
53
+ - Updated dependency versions in `package.json` to maintain compatibility and benefit from improvements and bug fixes in the used libraries.
54
+
55
+ ## [1.0.1] - 2025-11-27
56
+
57
+ ### Fixed
58
+ - Fixed export styles for better compatibility with different bundlers
59
+
60
+ ## [1.0.0] - 2025-11-27
61
+
62
+ ### Added
63
+ - Initial release of TvSettings component
64
+ - Sliding panels from 4 directions: top, right, bottom, left
65
+ - Bidirectional v-model control (controlled mode) with internal state fallback
66
+ - Automatic close on outside click (configurable via `closeOnOutside` prop)
67
+ - Close panel with Escape key support
68
+ - Two customizable slots: `header` and `default` (main content)
69
+ - Built-in gear SVG icon for settings button
70
+ - `disabled` prop to disable the open button
71
+ - Smooth CSS transitions for panel animations
72
+ - Full compatibility with SPA applications
73
+ - Full SSR support (tested with Nuxt 3)
74
+ - Tree-shake friendly build (Vue marked as external)
75
+ - TypeScript declarations included
76
+ - Accessibility features:
77
+ - ARIA labels with customizable `label` prop
78
+ - `aria-pressed` and `aria-expanded` attributes
79
+ - `role="dialog"` on panel
80
+ - Proper focus management
81
+ - Events: `update:modelValue`, `open`, `close`
82
+ - Props: `modelValue`, `direction`, `disabled`, `closeOnOutside`, `label`
83
+ - Slot bindings: `direction`, `close`, `open` methods
84
+ - BEM CSS classes for easy customization
85
+ - Support for global registration via `app.use()`
86
+ - Support for local named import
87
+ - Compatible with Nuxt 3 plugin system
88
+ - Demo playground at https://tv-settings.netlify.app/
89
+
90
+ [1.0.4]: https://github.com/TODOvue/tv-settings/pull/5/files
91
+ [1.0.3]: https://github.com/TODOvue/tv-settings/pull/4/files
92
+ [1.0.2]: https://github.com/TODOvue/tv-settings/pull/3/files
93
+ [1.0.1]: https://github.com/TODOvue/tv-settings/pull/2/files
94
+ [1.0.0]: https://github.com/TODOvue/tv-settings/pull/1/files