@htlkg/components 0.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/dist/composables/index.js +388 -0
- package/dist/composables/index.js.map +1 -0
- package/package.json +41 -0
- package/src/composables/index.ts +6 -0
- package/src/composables/useForm.test.ts +229 -0
- package/src/composables/useForm.ts +130 -0
- package/src/composables/useFormValidation.test.ts +189 -0
- package/src/composables/useFormValidation.ts +83 -0
- package/src/composables/useModal.property.test.ts +164 -0
- package/src/composables/useModal.ts +43 -0
- package/src/composables/useNotifications.test.ts +166 -0
- package/src/composables/useNotifications.ts +81 -0
- package/src/composables/useTable.property.test.ts +198 -0
- package/src/composables/useTable.ts +134 -0
- package/src/composables/useTabs.property.test.ts +247 -0
- package/src/composables/useTabs.ts +101 -0
- package/src/data/Chart.demo.vue +340 -0
- package/src/data/Chart.md +525 -0
- package/src/data/Chart.vue +133 -0
- package/src/data/DataList.md +80 -0
- package/src/data/DataList.test.ts +69 -0
- package/src/data/DataList.vue +46 -0
- package/src/data/SearchableSelect.md +107 -0
- package/src/data/SearchableSelect.vue +124 -0
- package/src/data/Table.demo.vue +296 -0
- package/src/data/Table.md +588 -0
- package/src/data/Table.property.test.ts +548 -0
- package/src/data/Table.test.ts +562 -0
- package/src/data/Table.unit.test.ts +544 -0
- package/src/data/Table.vue +321 -0
- package/src/data/index.ts +5 -0
- package/src/domain/BrandCard.md +81 -0
- package/src/domain/BrandCard.vue +63 -0
- package/src/domain/BrandSelector.md +84 -0
- package/src/domain/BrandSelector.vue +65 -0
- package/src/domain/ProductBadge.md +60 -0
- package/src/domain/ProductBadge.vue +47 -0
- package/src/domain/UserAvatar.md +84 -0
- package/src/domain/UserAvatar.vue +60 -0
- package/src/domain/domain-components.property.test.ts +449 -0
- package/src/domain/index.ts +4 -0
- package/src/forms/DateRange.demo.vue +273 -0
- package/src/forms/DateRange.md +337 -0
- package/src/forms/DateRange.vue +110 -0
- package/src/forms/JsonSchemaForm.demo.vue +549 -0
- package/src/forms/JsonSchemaForm.md +112 -0
- package/src/forms/JsonSchemaForm.property.test.ts +817 -0
- package/src/forms/JsonSchemaForm.test.ts +601 -0
- package/src/forms/JsonSchemaForm.unit.test.ts +801 -0
- package/src/forms/JsonSchemaForm.vue +615 -0
- package/src/forms/index.ts +3 -0
- package/src/index.ts +17 -0
- package/src/navigation/Breadcrumbs.demo.vue +142 -0
- package/src/navigation/Breadcrumbs.md +102 -0
- package/src/navigation/Breadcrumbs.test.ts +69 -0
- package/src/navigation/Breadcrumbs.vue +58 -0
- package/src/navigation/Stepper.demo.vue +337 -0
- package/src/navigation/Stepper.md +174 -0
- package/src/navigation/Stepper.vue +146 -0
- package/src/navigation/Tabs.demo.vue +293 -0
- package/src/navigation/Tabs.md +163 -0
- package/src/navigation/Tabs.test.ts +176 -0
- package/src/navigation/Tabs.vue +104 -0
- package/src/navigation/index.ts +5 -0
- package/src/overlays/Alert.demo.vue +377 -0
- package/src/overlays/Alert.md +248 -0
- package/src/overlays/Alert.test.ts +166 -0
- package/src/overlays/Alert.vue +70 -0
- package/src/overlays/Drawer.md +140 -0
- package/src/overlays/Drawer.test.ts +92 -0
- package/src/overlays/Drawer.vue +76 -0
- package/src/overlays/Modal.demo.vue +149 -0
- package/src/overlays/Modal.md +385 -0
- package/src/overlays/Modal.test.ts +128 -0
- package/src/overlays/Modal.vue +86 -0
- package/src/overlays/Notification.md +150 -0
- package/src/overlays/Notification.test.ts +96 -0
- package/src/overlays/Notification.vue +58 -0
- package/src/overlays/index.ts +4 -0
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="space-y-8">
|
|
3
|
+
<div>
|
|
4
|
+
<h2 class="text-2xl font-bold mb-4">Chart Component Demo</h2>
|
|
5
|
+
<p class="text-gray-600 mb-6">
|
|
6
|
+
Data visualization with multiple chart types powered by ApexCharts.
|
|
7
|
+
</p>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<!-- Line Chart -->
|
|
11
|
+
<div class="border rounded-lg p-6">
|
|
12
|
+
<h3 class="text-lg font-semibold mb-4">Line Chart</h3>
|
|
13
|
+
<Chart
|
|
14
|
+
id="line-chart"
|
|
15
|
+
title="Monthly Sales"
|
|
16
|
+
type="line"
|
|
17
|
+
:series="lineChartData"
|
|
18
|
+
:options="lineChartOptions"
|
|
19
|
+
:loading="lineLoading"
|
|
20
|
+
@data-point-selection="handlePointClick"
|
|
21
|
+
/>
|
|
22
|
+
<button
|
|
23
|
+
@click="refreshLineChart"
|
|
24
|
+
class="mt-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
|
|
25
|
+
>
|
|
26
|
+
Refresh Data
|
|
27
|
+
</button>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<!-- Area Chart -->
|
|
31
|
+
<div class="border rounded-lg p-6">
|
|
32
|
+
<h3 class="text-lg font-semibold mb-4">Area Chart with Multiple Series</h3>
|
|
33
|
+
<Chart
|
|
34
|
+
id="area-chart"
|
|
35
|
+
title="Website Traffic"
|
|
36
|
+
type="area"
|
|
37
|
+
:series="areaChartData"
|
|
38
|
+
:options="areaChartOptions"
|
|
39
|
+
:loading="areaLoading"
|
|
40
|
+
/>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<!-- Bar Chart -->
|
|
44
|
+
<div class="border rounded-lg p-6">
|
|
45
|
+
<h3 class="text-lg font-semibold mb-4">Bar Chart</h3>
|
|
46
|
+
<Chart
|
|
47
|
+
id="bar-chart"
|
|
48
|
+
title="Quarterly Revenue"
|
|
49
|
+
type="bar"
|
|
50
|
+
:series="barChartData"
|
|
51
|
+
:options="barChartOptions"
|
|
52
|
+
:loading="barLoading"
|
|
53
|
+
/>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<!-- Horizontal Bar Chart -->
|
|
57
|
+
<div class="border rounded-lg p-6">
|
|
58
|
+
<h3 class="text-lg font-semibold mb-4">Horizontal Bar Chart</h3>
|
|
59
|
+
<Chart
|
|
60
|
+
id="horizontal-chart"
|
|
61
|
+
title="Top Locations"
|
|
62
|
+
type="bar"
|
|
63
|
+
:series="horizontalChartData"
|
|
64
|
+
:options="horizontalChartOptions"
|
|
65
|
+
:loading="false"
|
|
66
|
+
horizontal
|
|
67
|
+
/>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<!-- Stacked Bar Chart -->
|
|
71
|
+
<div class="border rounded-lg p-6">
|
|
72
|
+
<h3 class="text-lg font-semibold mb-4">Stacked Bar Chart</h3>
|
|
73
|
+
<Chart
|
|
74
|
+
id="stacked-chart"
|
|
75
|
+
title="Revenue by Product"
|
|
76
|
+
type="bar"
|
|
77
|
+
:series="stackedChartData"
|
|
78
|
+
:options="stackedChartOptions"
|
|
79
|
+
:loading="false"
|
|
80
|
+
stacked
|
|
81
|
+
/>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<!-- Chart with Time Range -->
|
|
85
|
+
<div class="border rounded-lg p-6">
|
|
86
|
+
<h3 class="text-lg font-semibold mb-4">Chart with Time Range Selector</h3>
|
|
87
|
+
<Chart
|
|
88
|
+
id="range-chart"
|
|
89
|
+
title="Analytics Overview"
|
|
90
|
+
type="area"
|
|
91
|
+
:series="rangeChartData"
|
|
92
|
+
:options="rangeChartOptions"
|
|
93
|
+
:loading="rangeLoading"
|
|
94
|
+
:range="selectedRange"
|
|
95
|
+
@range-selected="handleRangeChange"
|
|
96
|
+
/>
|
|
97
|
+
<div class="mt-4 flex gap-2">
|
|
98
|
+
<button
|
|
99
|
+
v-for="range in timeRanges"
|
|
100
|
+
:key="range"
|
|
101
|
+
@click="selectedRange = range"
|
|
102
|
+
:class="[
|
|
103
|
+
'px-4 py-2 rounded',
|
|
104
|
+
selectedRange === range
|
|
105
|
+
? 'bg-blue-500 text-white'
|
|
106
|
+
: 'bg-gray-200 hover:bg-gray-300'
|
|
107
|
+
]"
|
|
108
|
+
>
|
|
109
|
+
{{ range.toUpperCase() }}
|
|
110
|
+
</button>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<!-- Empty State -->
|
|
115
|
+
<div class="border rounded-lg p-6">
|
|
116
|
+
<h3 class="text-lg font-semibold mb-4">Empty State</h3>
|
|
117
|
+
<Chart
|
|
118
|
+
id="empty-chart"
|
|
119
|
+
title="No Data Available"
|
|
120
|
+
type="line"
|
|
121
|
+
:series="[]"
|
|
122
|
+
:loading="false"
|
|
123
|
+
:empty="true"
|
|
124
|
+
/>
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<!-- Loading State -->
|
|
128
|
+
<div class="border rounded-lg p-6">
|
|
129
|
+
<h3 class="text-lg font-semibold mb-4">Loading State</h3>
|
|
130
|
+
<Chart
|
|
131
|
+
id="loading-chart"
|
|
132
|
+
title="Loading Data..."
|
|
133
|
+
type="area"
|
|
134
|
+
:series="loadingChartData"
|
|
135
|
+
:loading="isLoadingChart"
|
|
136
|
+
/>
|
|
137
|
+
<button
|
|
138
|
+
@click="toggleLoadingChart"
|
|
139
|
+
class="mt-4 px-4 py-2 bg-purple-500 text-white rounded hover:bg-purple-600"
|
|
140
|
+
>
|
|
141
|
+
{{ isLoadingChart ? 'Stop Loading' : 'Start Loading' }}
|
|
142
|
+
</button>
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
<!-- Chart with Annotations -->
|
|
146
|
+
<div class="border rounded-lg p-6">
|
|
147
|
+
<h3 class="text-lg font-semibold mb-4">Chart with Annotations</h3>
|
|
148
|
+
<Chart
|
|
149
|
+
id="annotation-chart"
|
|
150
|
+
title="Performance Metrics"
|
|
151
|
+
type="line"
|
|
152
|
+
:series="annotationChartData"
|
|
153
|
+
:options="annotationChartOptions"
|
|
154
|
+
:annotations="annotation"
|
|
155
|
+
:loading="false"
|
|
156
|
+
/>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</template>
|
|
160
|
+
|
|
161
|
+
<script setup lang="ts">
|
|
162
|
+
import { ref } from 'vue';
|
|
163
|
+
import { Chart } from '@htlkg/components';
|
|
164
|
+
import type { ChartSeries, ChartOptions, ChartAnnotation, ChartDateRange } from '@htlkg/components';
|
|
165
|
+
|
|
166
|
+
// Line Chart
|
|
167
|
+
const lineLoading = ref(false);
|
|
168
|
+
const lineChartData = ref<ChartSeries[]>([
|
|
169
|
+
{
|
|
170
|
+
name: 'Revenue',
|
|
171
|
+
data: [30, 40, 45, 50, 49, 60, 70, 91, 125, 140, 165, 180]
|
|
172
|
+
}
|
|
173
|
+
]);
|
|
174
|
+
|
|
175
|
+
const lineChartOptions: ChartOptions = {
|
|
176
|
+
xaxis: {
|
|
177
|
+
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
|
178
|
+
},
|
|
179
|
+
tooltip: {
|
|
180
|
+
intersect: false
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
function refreshLineChart() {
|
|
185
|
+
lineLoading.value = true;
|
|
186
|
+
setTimeout(() => {
|
|
187
|
+
lineChartData.value = [
|
|
188
|
+
{
|
|
189
|
+
name: 'Revenue',
|
|
190
|
+
data: Array.from({ length: 12 }, () => Math.floor(Math.random() * 200))
|
|
191
|
+
}
|
|
192
|
+
];
|
|
193
|
+
lineLoading.value = false;
|
|
194
|
+
}, 1000);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function handlePointClick(data: any) {
|
|
198
|
+
console.log('Clicked data point:', data);
|
|
199
|
+
alert(`Clicked on data point: ${JSON.stringify(data)}`);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Area Chart
|
|
203
|
+
const areaLoading = ref(false);
|
|
204
|
+
const areaChartData: ChartSeries[] = [
|
|
205
|
+
{
|
|
206
|
+
name: 'Visitors',
|
|
207
|
+
data: [30, 40, 45, 50, 49, 60, 70, 91, 125]
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: 'Page Views',
|
|
211
|
+
data: [50, 60, 70, 80, 75, 90, 100, 130, 180]
|
|
212
|
+
}
|
|
213
|
+
];
|
|
214
|
+
|
|
215
|
+
const areaChartOptions: ChartOptions = {
|
|
216
|
+
xaxis: {
|
|
217
|
+
categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue']
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// Bar Chart
|
|
222
|
+
const barLoading = ref(false);
|
|
223
|
+
const barChartData: ChartSeries[] = [
|
|
224
|
+
{
|
|
225
|
+
name: 'Q1',
|
|
226
|
+
data: [44, 55, 41, 67]
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
name: 'Q2',
|
|
230
|
+
data: [13, 23, 20, 8]
|
|
231
|
+
}
|
|
232
|
+
];
|
|
233
|
+
|
|
234
|
+
const barChartOptions: ChartOptions = {
|
|
235
|
+
xaxis: {
|
|
236
|
+
categories: ['Product A', 'Product B', 'Product C', 'Product D']
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
// Horizontal Bar Chart
|
|
241
|
+
const horizontalChartData: ChartSeries[] = [
|
|
242
|
+
{
|
|
243
|
+
name: 'Sessions',
|
|
244
|
+
data: [400, 300, 250, 200, 150]
|
|
245
|
+
}
|
|
246
|
+
];
|
|
247
|
+
|
|
248
|
+
const horizontalChartOptions: ChartOptions = {
|
|
249
|
+
xaxis: {
|
|
250
|
+
categories: ['New York', 'London', 'Tokyo', 'Paris', 'Berlin']
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
// Stacked Bar Chart
|
|
255
|
+
const stackedChartData: ChartSeries[] = [
|
|
256
|
+
{
|
|
257
|
+
name: 'Product A',
|
|
258
|
+
data: [44, 55, 41, 67, 22, 43]
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
name: 'Product B',
|
|
262
|
+
data: [13, 23, 20, 8, 13, 27]
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
name: 'Product C',
|
|
266
|
+
data: [11, 17, 15, 15, 21, 14]
|
|
267
|
+
}
|
|
268
|
+
];
|
|
269
|
+
|
|
270
|
+
const stackedChartOptions: ChartOptions = {
|
|
271
|
+
xaxis: {
|
|
272
|
+
categories: ['Q1', 'Q2', 'Q3', 'Q4', 'Q5', 'Q6']
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
// Range Chart
|
|
277
|
+
const rangeLoading = ref(false);
|
|
278
|
+
const selectedRange = ref<'24h' | '7d' | '1m' | '3m' | 'all'>('7d');
|
|
279
|
+
const timeRanges: Array<'24h' | '7d' | '1m' | '3m' | 'all'> = ['24h', '7d', '1m', '3m', 'all'];
|
|
280
|
+
|
|
281
|
+
const rangeChartData = ref<ChartSeries[]>([
|
|
282
|
+
{
|
|
283
|
+
name: 'Users',
|
|
284
|
+
data: [30, 40, 45, 50, 49, 60, 70]
|
|
285
|
+
}
|
|
286
|
+
]);
|
|
287
|
+
|
|
288
|
+
const rangeChartOptions: ChartOptions = {
|
|
289
|
+
xaxis: {
|
|
290
|
+
categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
function handleRangeChange(data: { range: ChartDateRange; chartId: string }) {
|
|
295
|
+
console.log('Range changed:', data);
|
|
296
|
+
rangeLoading.value = true;
|
|
297
|
+
setTimeout(() => {
|
|
298
|
+
// Simulate data fetch
|
|
299
|
+
rangeChartData.value = [
|
|
300
|
+
{
|
|
301
|
+
name: 'Users',
|
|
302
|
+
data: Array.from({ length: 7 }, () => Math.floor(Math.random() * 100))
|
|
303
|
+
}
|
|
304
|
+
];
|
|
305
|
+
rangeLoading.value = false;
|
|
306
|
+
}, 1000);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Loading Chart
|
|
310
|
+
const isLoadingChart = ref(false);
|
|
311
|
+
const loadingChartData = ref<ChartSeries[]>([
|
|
312
|
+
{
|
|
313
|
+
name: 'Data',
|
|
314
|
+
data: [10, 20, 30, 40, 50]
|
|
315
|
+
}
|
|
316
|
+
]);
|
|
317
|
+
|
|
318
|
+
function toggleLoadingChart() {
|
|
319
|
+
isLoadingChart.value = !isLoadingChart.value;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Annotation Chart
|
|
323
|
+
const annotationChartData: ChartSeries[] = [
|
|
324
|
+
{
|
|
325
|
+
name: 'Response Time',
|
|
326
|
+
data: [120, 150, 170, 140, 160, 180, 200, 190]
|
|
327
|
+
}
|
|
328
|
+
];
|
|
329
|
+
|
|
330
|
+
const annotationChartOptions: ChartOptions = {
|
|
331
|
+
xaxis: {
|
|
332
|
+
categories: ['00:00', '03:00', '06:00', '09:00', '12:00', '15:00', '18:00', '21:00']
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
const annotation: ChartAnnotation = {
|
|
337
|
+
text: 'Target: 150ms',
|
|
338
|
+
high: 150
|
|
339
|
+
};
|
|
340
|
+
</script>
|