Skip to content

Commit 5aae03d

Browse files
committed
Add icon-only mode option, improve README, and enhance JSON viewer with line numbers and action text visibility controls
1 parent 194c489 commit 5aae03d

File tree

4 files changed

+217
-233
lines changed

4 files changed

+217
-233
lines changed

README.md

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ A modern, sleek Vue 3 component for viewing, editing, and manipulating JSON data
1717
- 📱 **Responsive Design**: Works on desktop and mobile devices
1818
- ⌨️ **Keyboard Navigation**: Full keyboard support
1919
-**Accessibility**: Screen reader support with proper ARIA labels
20+
- 🎯 **Icon-Only Mode**: Option to hide button text labels for compact interface
2021
- 🚀 **Dual Build System**: Library build for npm + Demo build for preview
2122

2223
## 🚀 Installation
2324

2425
This component is now available on npm as `@ctechhindi/vue3-json-viewer`
2526

26-
[@ctechhindi/vue3-json-viewer](https://www.npmjs.com/package/@ctechhindi/vue3-json-viewer)
27+
[@ctechhindi/vue3-json-viewer](https://www.npmjs.com/package/@ctechhindi/vue3-json-viewer)
2728

2829
```bash
2930
npm install @ctechhindi/vue3-json-viewer
@@ -53,8 +54,8 @@ yarn add @ctechhindi/vue3-json-viewer
5354
</template>
5455
5556
<script setup lang="ts">
56-
import { ref } from 'vue'
57-
import JsonViewer from '@ctechhindi/vue3-json-viewer'
57+
import { ref } from "vue";
58+
import JsonViewer from "@ctechhindi/vue3-json-viewer";
5859
5960
const jsonData = ref({
6061
name: "John Doe",
@@ -63,13 +64,13 @@ const jsonData = ref({
6364
hobbies: ["reading", "coding"],
6465
address: {
6566
street: "123 Main St",
66-
city: "Anytown"
67-
}
68-
})
67+
city: "Anytown",
68+
},
69+
});
6970
7071
const handleDataUpdate = (newData: any) => {
71-
console.log('Data updated:', newData)
72-
}
72+
console.log("Data updated:", newData);
73+
};
7374
</script>
7475
```
7576

@@ -84,6 +85,7 @@ const handleDataUpdate = (newData: any) => {
8485
default-mode="tree"
8586
:show-line-numbers="true"
8687
:max-depth="3"
88+
:hide-action-text="false"
8789
@update:data="handleDataUpdate"
8890
@node-click="handleNodeClick"
8991
@node-expand="handleNodeExpand"
@@ -95,76 +97,77 @@ const handleDataUpdate = (newData: any) => {
9597
</template>
9698
9799
<script setup lang="ts">
98-
import { ref } from 'vue'
99-
import JsonViewer from '@ctechhindi/vue3-json-viewer'
100+
import { ref } from "vue";
101+
import JsonViewer from "@ctechhindi/vue3-json-viewer";
100102
101103
const complexData = ref({
102104
// Your complex JSON data
103-
})
105+
});
104106
105-
const currentTheme = ref<'light' | 'dark'>('light')
107+
const currentTheme = ref<"light" | "dark">("light");
106108
107109
// Event handlers
108110
const handleDataUpdate = (newData: any) => {
109-
console.log('Data updated:', newData)
110-
}
111+
console.log("Data updated:", newData);
112+
};
111113
112114
const handleNodeClick = (node: any) => {
113-
console.log('Node clicked:', node)
114-
}
115+
console.log("Node clicked:", node);
116+
};
115117
116118
const handleNodeExpand = (node: any) => {
117-
console.log('Node expanded:', node)
118-
}
119+
console.log("Node expanded:", node);
120+
};
119121
120122
const handleNodeCollapse = (node: any) => {
121-
console.log('Node collapsed:', node)
122-
}
123+
console.log("Node collapsed:", node);
124+
};
123125
124126
const handleEditStart = () => {
125-
console.log('Edit mode started')
126-
}
127+
console.log("Edit mode started");
128+
};
127129
128130
const handleEditSave = (data: any) => {
129-
console.log('Changes saved:', data)
130-
}
131+
console.log("Changes saved:", data);
132+
};
131133
132134
const handleEditCancel = () => {
133-
console.log('Edit cancelled')
134-
}
135+
console.log("Edit cancelled");
136+
};
135137
</script>
136138
```
137139

138140
## 📋 Props
139141

140-
| Prop | Type | Default | Description |
141-
|------|------|---------|-------------|
142-
| `data` | `any` | `{}` | JSON data to display |
143-
| `editable` | `boolean` | `true` | Enable editing capabilities |
144-
| `theme` | `'light' \| 'dark'` | `'light'` | Theme preference |
145-
| `defaultMode` | `'tree' \| 'text'` | `'tree'` | Default view mode |
146-
| `showLineNumbers` | `boolean` | `false` | Show line numbers in text mode |
147-
| `maxDepth` | `number` | `3` | Maximum depth to expand by default |
142+
| Prop | Type | Default | Description |
143+
| ----------------- | ------------------- | --------- | ------------------------------------ |
144+
| `data` | `any` | `{}` | JSON data to display |
145+
| `editable` | `boolean` | `true` | Enable editing capabilities |
146+
| `theme` | `'light' \| 'dark'` | `'light'` | Theme preference |
147+
| `defaultMode` | `'tree' \| 'text'` | `'tree'` | Default view mode |
148+
| `showLineNumbers` | `boolean` | `false` | Show line numbers in text mode |
149+
| `maxDepth` | `number` | `3` | Maximum depth to expand by default |
150+
| `hideActionText` | `boolean` | `false` | Hide button text labels (icons only) |
148151

149152
## 🎭 Events
150153

151-
| Event | Payload | Description |
152-
|-------|---------|-------------|
153-
| `update:data` | `newData: any` | Data changed event |
154-
| `node-click` | `node: JsonNode` | Node clicked event |
155-
| `node-expand` | `node: JsonNode` | Node expanded event |
154+
| Event | Payload | Description |
155+
| --------------- | ---------------- | -------------------- |
156+
| `update:data` | `newData: any` | Data changed event |
157+
| `node-click` | `node: JsonNode` | Node clicked event |
158+
| `node-expand` | `node: JsonNode` | Node expanded event |
156159
| `node-collapse` | `node: JsonNode` | Node collapsed event |
157-
| `edit-start` | - | Edit mode started |
158-
| `edit-save` | `data: any` | Changes saved |
159-
| `edit-cancel` | - | Edit mode cancelled |
160+
| `edit-start` | - | Edit mode started |
161+
| `edit-save` | `data: any` | Changes saved |
162+
| `edit-cancel` | - | Edit mode cancelled |
160163

161164
## 🏗️ Data Structure
162165

163166
```typescript
164167
interface JsonNode {
165168
key: string;
166169
value: any;
167-
type: 'string' | 'number' | 'boolean' | 'object' | 'array' | 'null';
170+
type: "string" | "number" | "boolean" | "object" | "array" | "null";
168171
path: string[];
169172
level: number;
170173
expanded?: boolean;
@@ -223,6 +226,7 @@ npm run preview
223226
### Build Outputs
224227

225228
- **`npm run build`** → Creates `dist/` folder with library files:
229+
226230
- `json-viewer.umd.js` - UMD bundle
227231
- `json-viewer.mjs` - ES module bundle
228232
- `style.css` - Component styles

src/App.vue

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,19 @@
2121
<input type="checkbox" v-model="isDarkTheme" @change="toggleTheme" />
2222
Dark Theme
2323
</label>
24-
</div>
24+
<label>
25+
<input type="checkbox" v-model="showLineNumbers" />
26+
Show Line Numbers
27+
</label>
28+
<label>
29+
<input type="checkbox" v-model="hideActionText" />
30+
Hide Button Text
31+
</label>
32+
</div>
2533
</div>
2634

2735
<div class="json-viewer-container">
28-
<JsonViewer v-model:data="jsonData" :editable="true" :theme="isDarkTheme ? 'dark' : 'light'" default-mode="tree" :max-depth="2" @update:data="handleDataUpdate" @node-click="handleNodeClick" @edit-save="handleEditSave" @edit-cancel="handleEditCancel" @theme-change="handleThemeChange" />
36+
<JsonViewer v-model:data="jsonData" :editable="true" :theme="isDarkTheme ? 'dark' : 'light'" default-mode="tree" :max-depth="2" :show-line-numbers="showLineNumbers" :hide-action-text="hideActionText" @update:data="handleDataUpdate" @node-click="handleNodeClick" @edit-save="handleEditSave" @edit-cancel="handleEditCancel" @theme-change="handleThemeChange" />
2937
</div>
3038
</div>
3139

@@ -63,13 +71,13 @@
6371
<div class="footer-links">
6472
<a href="https://github.com/jeevan-lal/vue3-json-viewer" target="_blank" rel="noopener noreferrer" class="github-link">
6573
<svg class="github-icon" viewBox="0 0 24 24" fill="currentColor">
66-
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
74+
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
6775
</svg>
6876
GitHub Repository
6977
</a>
7078
<a href="https://www.npmjs.com/package/@ctechhindi/vue3-json-viewer" target="_blank" rel="noopener noreferrer" class="npm-link">
7179
<svg class="npm-icon" viewBox="0 0 24 24" fill="currentColor">
72-
<path d="M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0H1.763zM5.13 5.323l13.837.019-.009 13.836h-3.464l.007-4.211h-3.456v4.201H5.136V5.323z"/>
80+
<path d="M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0H1.763zM5.13 5.323l13.837.019-.009 13.836h-3.464l.007-4.211h-3.456v4.201H5.136V5.323z" />
7381
</svg>
7482
NPM Package
7583
</a>
@@ -86,6 +94,8 @@ import JsonViewer from "./components/JsonViewer.vue";
8694
// Reactive state
8795
const jsonData = ref({});
8896
const isDarkTheme = ref(false);
97+
const showLineNumbers = ref(true);
98+
const hideActionText = ref(false);
8999
90100
// Sample data sets
91101
const sampleData = {
@@ -361,6 +371,9 @@ body.dark-theme .sample-btn:hover {
361371
.theme-controls {
362372
padding-top: 1rem;
363373
border-top: 1px solid #e5e7eb;
374+
display: flex;
375+
gap: 1rem;
376+
flex-wrap: wrap;
364377
}
365378
366379
body.dark-theme .theme-controls {

0 commit comments

Comments
 (0)