@composy/log-viewer-vue 0.0.1 → 0.0.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +39 -25
  3. package/dist/index.css +379 -2
  4. package/dist/index.js +45 -34
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.min.css +1 -3
  7. package/dist/index.min.js +195 -1
  8. package/dist/index.min.js.map +1 -0
  9. package/es/.dts-output-manifest.json +1 -0
  10. package/es/.dts.tsbuildinfo +1 -0
  11. package/es/components/LogViewer.js +1 -1
  12. package/es/components/LogViewer.js.map +1 -1
  13. package/es/components/LogViewer.vue_vue_type_script_setup_true_lang.js +16 -15
  14. package/es/components/LogViewer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  15. package/es/composables/useLogViewer.d.ts +3 -1
  16. package/es/composables/useLogViewer.d.ts.map +1 -1
  17. package/es/composables/useLogViewer.js +17 -7
  18. package/es/composables/useLogViewer.js.map +1 -1
  19. package/es/index.d.ts +0 -1
  20. package/es/index.js +2 -2
  21. package/es/index.js.map +1 -1
  22. package/es/plugin.d.ts +0 -1
  23. package/es/plugin.js +1 -1
  24. package/es/plugin.js.map +1 -1
  25. package/es/style/css.js +1 -1
  26. package/es/style/index.css +380 -0
  27. package/es/style/index.js +1 -1
  28. package/esm/components/LogViewer.js +17 -0
  29. package/esm/components/LogViewer.js.map +1 -0
  30. package/esm/components/LogViewer.vue_vue_type_script_setup_true_lang.js +110 -0
  31. package/esm/components/LogViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  32. package/esm/composables/useLogViewer.d.ts +119 -0
  33. package/esm/composables/useLogViewer.d.ts.map +1 -0
  34. package/esm/composables/useLogViewer.js +123 -0
  35. package/esm/composables/useLogViewer.js.map +1 -0
  36. package/esm/index.d.ts.map +1 -0
  37. package/esm/index.js +19 -0
  38. package/esm/index.js.map +1 -0
  39. package/esm/plugin.d.ts.map +1 -0
  40. package/esm/plugin.js +18 -0
  41. package/esm/plugin.js.map +1 -0
  42. package/esm/style/css.js +1 -0
  43. package/esm/style/index.js +1 -0
  44. package/esm/style/index.less +434 -0
  45. package/lib/components/LogViewer.cjs +1 -1
  46. package/lib/components/LogViewer.cjs.map +1 -1
  47. package/lib/components/LogViewer.vue_vue_type_script_setup_true_lang.cjs +22 -21
  48. package/lib/components/LogViewer.vue_vue_type_script_setup_true_lang.cjs.map +1 -1
  49. package/lib/composables/useLogViewer.cjs +23 -13
  50. package/lib/composables/useLogViewer.cjs.map +1 -1
  51. package/lib/composables/{useLogViewer.d.ts → useLogViewer.d.cts} +3 -1
  52. package/lib/composables/useLogViewer.d.cts.map +1 -0
  53. package/lib/index.cjs +1 -1
  54. package/lib/index.cjs.map +1 -1
  55. package/lib/index.d.cts +14 -0
  56. package/lib/index.d.cts.map +1 -0
  57. package/lib/plugin.cjs +1 -1
  58. package/lib/plugin.cjs.map +1 -1
  59. package/lib/plugin.d.cts +7 -0
  60. package/lib/plugin.d.cts.map +1 -0
  61. package/lib/style/index.css +380 -2
  62. package/package.json +24 -16
  63. package/es/style/index.less +0 -1
  64. /package/{lib → esm}/index.d.ts +0 -0
  65. /package/{lib → esm}/plugin.d.ts +0 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,57 @@
1
+ # Changelog
2
+
3
+ ## [0.0.2] - 2026-10-12
4
+
5
+ ### ✨ 新功能
6
+
7
+ - **log-viewer**: 重构项目结构并完善文档与示例 ([7844674](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/78446741f92a4e0fa35e358481246c597c5d3691)) - @swimly
8
+ - **log-viewer**: 添加项目配置文件 ([a952739](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/a9527395a4999212ec4f0444c7f1a54a021da0ca)) - @swimly
9
+ - auto-generated playground + README for log-viewer sub-packages ([a2250ec](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/a2250ecd98551c15e822dde8a61389b02f161725)) - @swimly
10
+ - **log-viewer**: 实现核心库、Vue组件和playground演示 ([ec9764a](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/ec9764a7bc8964b95486f1035ece6783801380a3)) - @swimly
11
+ - init log-viewer project structure ([304c73f](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/304c73f7c9dbd6886abf059806bf619cb724cc84)) - @swimly
12
+
13
+ ### 🐛 Bug 修复
14
+
15
+ - **log-viewer**: 规范 EventEmitter 类型 ([58545d3](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/58545d346c1031471c84cc972b91614cee4c3858)) - @swimly
16
+
17
+ ### 💄 代码样式
18
+
19
+ - **vue**: 修复package.json缺失尾部换行符的问题 ([1dd31bb](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/1dd31bb80ba5bc1f776306033e133df2c6c24ee9)) - @swimly
20
+
21
+ ### 📦 构建系统
22
+
23
+ - **packages**: 更新各包依赖与配置项 ([939d05c](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/939d05c5a3a94e576023c360224cdd0600f73d8f)) - @swimly
24
+ - **vue**: 调整vue包构建配置,修正输出路径与发布文件 ([b953ee4](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/b953ee4568860b63b1acc2281e40e352917da632)) - @swimly
25
+ - 调整本地ldesign依赖为本地链接,更新核心包构建配置 ([1a9d4a1](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/1a9d4a1d8e05ee6773e6e7876eec50663baeaf45)) - @swimly
26
+ - **tsconfig**: 完善 tsconfig 配置,添加声明文件输出与映射配置 ([d5f862a](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/d5f862a0149af874e78e26116ce0d276c3479a6c)) - @swimly
27
+ - **vue**: 更新 Vue 依赖版本至 3.5.32 ([bca3d07](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/bca3d07b4e0fe4b852289d0c7351d6a1a974052e)) - @swimly
28
+ - **vue**: 在发布清单中添加 lib 目录 ([3ba2ba6](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/3ba2ba6d0f105dc5a1dc12eeb49da68b9851cb1d)) - @swimly
29
+ - 为 core 和 vue 包添加 ldesign-builder 配置 ([0ded57e](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/0ded57e7bde3fcfe8fa1a2af05beb9a6c1beb7e1)) - @swimly
30
+
31
+ ### 🔧 其他
32
+
33
+ - **log-viewer**: 更新项目配置与依赖管理 ([986acd2](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/986acd26bdecd9096450049f32d067bf4ae8b292)) - @swimly
34
+ - **package.json**: 修复文件末尾缺少换行符的问题 ([cec57ce](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/cec57ce71565f1d1583db90caa9a0e0b05d5dfbb)) - @swimly
35
+ - 更新 core 和 vue 包的依赖版本 ([a50b9d7](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/a50b9d79ed2dfb4296ab960bc605394ad233eb2e)) - @swimly
36
+ - update log-viewer (15 files) ([c45bb7d](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/c45bb7d3705ff21255c7900f1547d3e23ff6abd0)) - @swimly
37
+ - 删除不再使用的 shims-vue.d.ts 类型声明文件 ([7a785f5](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/7a785f5d672ade01cb7b8fd2c1447380b2140777)) - @swimly
38
+ - normalize versions, clean artifacts, update gitignore ([1fa0666](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/1fa0666c7516c24c943c3bd5e0edd2ce5c664203)) - @swimly
39
+ - update - chore(code-quality): 完成首轮代码优化与æ  ([ac14af0](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/ac14af054dd10254ed40c7cb2efa4bf9c9b23735)) - @swimly
40
+ - **code-quality**: 完成首轮代码优化与标准化工作 ([82f7750](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/82f77508bedc8f99c2c0db16098c3bc81f05f185)) - @swimly
41
+ - 批量更新 - 规范 .gitignore 清理源码 ([cf22736](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/cf22736fbb924cc0a40506e2b06b304d7aa4356d)) - @swimly
42
+ - unified build config and structure ([b193057](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/b1930571dadec0dbe8240dfc0fcd7fbef046b28e)) - @swimly
43
+ - 添加 ESLint 配置和测试脚本到 core 和 vue 包 ([6742aec](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/6742aec2dc2d11b66d9a8ecbd7db4f5ab0616cf4)) - @swimly
44
+ - add build config, tsconfig, README ([1c1c88f](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/1c1c88fc9c35a9f82161b98e6800a8ac98b811e8)) - @swimly
45
+ - clean up project structure - keep only packages/core/src and packages/vue/src ([fed9abd](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/fed9abd6ac1a5b65123f79d9f60cc394beda1822)) - @swimly
46
+ - 标准化构建配置并更新外部依赖声明 ([645e72d](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/645e72dfa27e428da23270dc6dbbcbaaee88e384)) - @swimly
47
+ - batch commit submodule changes ([dae1c30](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/dae1c30d34b23869b357ee1ef6f954d08b7d5781)) - @swimly
48
+ - set versions to 0.0.1 and pin @ldesign deps ([0b6b3a9](https://gitee.com/ldesign-v1/ldesign-log-viewer/commit/0b6b3a98fb6096a0ac735216166ea9e63ed081b3)) - @swimly
49
+
50
+ ### 👥 Contributors
51
+
52
+ swimly
53
+
54
+ ### 📊 Statistics
55
+
56
+ - Total Commits: **30**
57
+ - Contributors: **1**
package/README.md CHANGED
@@ -1,46 +1,60 @@
1
1
  # @composy/log-viewer-vue
2
2
 
3
- 审计日志查看器 - 操作日志可视化与追溯(Vue 3 适配层)
4
-
5
- ## 功能特性
6
-
7
- - 🧩 Vue 3 组件
8
- - 🪝 组合式函数 (Composables)
9
- - ⚡ 响应式数据绑定
3
+ 审计日志查看器的 Vue 2/3 适配层,基于 `@composy/log-viewer-core` 提供 `LogViewer`
4
+ 组件、`useLogViewer` 组合式函数和 `LogViewerPlugin` 插件。
10
5
 
11
6
  ## 安装
12
7
 
13
8
  ```bash
14
- npm install @composy/log-viewer-vue
9
+ pnpm add @composy/log-viewer-vue
15
10
  ```
16
11
 
17
- ## 快速开始
12
+ `vue` 为 peer dependency,Vue 2.7 和 Vue 3 均由 `vue-demi` 适配。
18
13
 
19
- ```vue
20
- <template>
21
- <!-- 使用组件 -->
22
- </template>
14
+ ## 入口
23
15
 
24
- <script setup>
25
- // import { /* 组件 */ } from '@composy/log-viewer-vue'
26
- </script>
16
+ ```ts
17
+ import { LogViewer, LogViewerPlugin, useLogViewer } from '@composy/log-viewer-vue'
18
+ import '@composy/log-viewer-vue/index.css'
27
19
  ```
28
20
 
29
- ## 目录结构
21
+ 核心类型与格式化函数也从 Vue 包重新导出,便于组件项目保持单一入口。
30
22
 
31
- ```
23
+ ## 目录与构建
24
+
25
+ ```text
32
26
  packages/vue/
33
- ├── src/ # 源码
34
- ├── package.json
35
- ├── tsconfig.json # ESM 构建配置
36
- └── tsconfig.cjs.json # CJS 构建配置
27
+ ├── src/ # 组件、插件和组合式函数
28
+ ├── .ldesign/builder.config.ts # @composy/builder(rolldown)配置
29
+ ├── .ldesign/tsconfig.esm.json # ESM 类型检查配置
30
+ └── .ldesign/tsconfig.cjs.json # CJS 类型检查配置
37
31
  ```
38
32
 
39
- ## 依赖
33
+ ```bash
34
+ pnpm --dir packages/vue run build
35
+ pnpm --dir packages/vue run type-check
36
+ pnpm --dir packages/vue run type-check:cjs
37
+ pnpm --dir packages/vue run lint:check
38
+ ```
40
39
 
41
- - `@composy/log-viewer-core` — 核心引擎
42
- - `vue` ^3.3.0 (peerDependency)
40
+ 构建输出为 `dist`(压缩 UMD 和 CSS)、`es`(ESM 声明)、`esm`(保留 ESM/样式源)和
41
+ `lib`(CJS)。`exports`、`main`、`module`、`types`、`unpkg` 与 `jsdelivr`
42
+ 均指向这些目录中的实际文件。
43
43
 
44
44
  ## License
45
45
 
46
46
  MIT
47
+
48
+ ## Adapter behavior
49
+
50
+ `LogViewer` forwards Core data, filtering, theme, diff, anomaly, and pagination behavior. Component
51
+ events use camelCase names in the type surface (`entryClick`, `entryExpand`, `entryCollapse`,
52
+ `filterChange`, `themeChange`, and `pageChange`); Vue templates can continue to listen with their
53
+ kebab-case equivalents.
54
+
55
+ `useLogViewer()` exposes `loadData()` alongside the Core instance methods. The composable uses
56
+ `vue-demi` for the Vue 2.7 and Vue 3 peer range and destroys the Core instance on unmount.
57
+
58
+ Import `@composy/log-viewer-vue/index.css` to receive the tokenized timeline, filter, diff, anomaly,
59
+ and pagination styles. The build removes only dangling CSS source-map comments while retaining
60
+ JavaScript source maps.
package/dist/index.css CHANGED
@@ -1,3 +1,380 @@
1
1
  /* style/index.less */
2
-
3
- /*# sourceMappingURL=src/style/index.less.map */
2
+ /* Generated from packages/core/src/styles/index.ts CSS_TEXT. */
3
+ /* ===== CSS Variables ===== */
4
+ .lv-root {
5
+ --lv-bg: var(--ld-white);
6
+ --lv-bg-secondary: var(--ld-bg-surface-soft);
7
+ --lv-bg-hover: var(--ld-primary-50);
8
+ --lv-border: var(--ld-border);
9
+ --lv-text: var(--ld-text-primary);
10
+ --lv-text-secondary: var(--ld-text-secondary);
11
+ --lv-text-muted: var(--ld-text-muted);
12
+ --lv-primary: var(--ld-primary-500);
13
+ --lv-primary-light: var(--ld-primary-50);
14
+ --lv-shadow: color-mix(in srgb, var(--ld-text-primary) 4%, transparent);
15
+ --lv-timeline-line: var(--ld-border);
16
+ --lv-timeline-dot: var(--ld-primary-500);
17
+ --lv-diff-add-bg: var(--ld-success-50);
18
+ --lv-diff-add-text: var(--ld-success-700);
19
+ --lv-diff-del-bg: var(--ld-danger-50);
20
+ --lv-diff-del-text: var(--ld-danger-700);
21
+ --lv-anomaly-bg: var(--ld-warning-50);
22
+ --lv-anomaly-border: var(--ld-warning-300);
23
+ --lv-radius: var(--ld-radius-md);
24
+ --lv-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
25
+ --lv-font-mono: "Fira Code", "SF Mono", Consolas, monospace;
26
+ }
27
+ .lv-root[data-theme="dark"] {
28
+ --lv-bg: var(--ld-bg-surface);
29
+ --lv-bg-secondary: var(--ld-bg-surface-soft);
30
+ --lv-bg-hover: var(--ld-primary-50);
31
+ --lv-border: var(--ld-border-strong);
32
+ --lv-text: var(--ld-text-primary);
33
+ --lv-text-secondary: var(--ld-text-secondary);
34
+ --lv-text-muted: var(--ld-text-muted);
35
+ --lv-primary: var(--ld-primary-400);
36
+ --lv-primary-light: var(--ld-primary-50);
37
+ --lv-shadow: color-mix(in srgb, var(--ld-text-primary) 20%, transparent);
38
+ --lv-timeline-line: var(--ld-border-strong);
39
+ --lv-timeline-dot: var(--ld-primary-400);
40
+ --lv-diff-add-bg: var(--ld-success-50);
41
+ --lv-diff-add-text: var(--ld-success-700);
42
+ --lv-diff-del-bg: var(--ld-danger-50);
43
+ --lv-diff-del-text: var(--ld-danger-700);
44
+ --lv-anomaly-bg: var(--ld-warning-50);
45
+ --lv-anomaly-border: var(--ld-warning-700);
46
+ }
47
+ /* ===== Root ===== */
48
+ .lv-root {
49
+ font-family: var(--lv-font);
50
+ font-size: var(--ld-px-14);
51
+ color: var(--lv-text);
52
+ background: var(--lv-bg);
53
+ line-height: 1.6;
54
+ }
55
+ /* ===== Filter Bar ===== */
56
+ .lv-filter {
57
+ display: flex;
58
+ flex-wrap: wrap;
59
+ gap: var(--ld-px-10);
60
+ padding: var(--ld-px-16);
61
+ background: var(--lv-bg);
62
+ border: var(--ld-px-1) solid var(--lv-border);
63
+ border-radius: var(--lv-radius);
64
+ margin-bottom: var(--ld-px-16);
65
+ align-items: center;
66
+ }
67
+ .lv-filter-item {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: var(--ld-px-6);
71
+ font-size: var(--ld-px-13);
72
+ }
73
+ .lv-filter-label {
74
+ color: var(--lv-text-secondary);
75
+ font-size: var(--ld-px-12);
76
+ white-space: nowrap;
77
+ }
78
+ .lv-filter-input {
79
+ padding: var(--ld-px-5) var(--ld-px-10);
80
+ border: var(--ld-px-1) solid var(--lv-border);
81
+ border-radius: var(--ld-px-6);
82
+ font-size: var(--ld-px-13);
83
+ background: var(--lv-bg);
84
+ color: var(--lv-text);
85
+ outline: none;
86
+ transition: border-color 0.2s;
87
+ min-width: var(--ld-px-120);
88
+ }
89
+ .lv-filter-input:focus {
90
+ border-color: var(--lv-primary);
91
+ }
92
+ .lv-filter-select {
93
+ padding: var(--ld-px-5) var(--ld-px-10);
94
+ border: var(--ld-px-1) solid var(--lv-border);
95
+ border-radius: var(--ld-px-6);
96
+ font-size: var(--ld-px-13);
97
+ background: var(--lv-bg);
98
+ color: var(--lv-text);
99
+ outline: none;
100
+ cursor: pointer;
101
+ }
102
+ .lv-filter-btn {
103
+ display: inline-flex;
104
+ align-items: center;
105
+ gap: var(--ld-px-4);
106
+ padding: var(--ld-px-5) var(--ld-px-14);
107
+ font-size: var(--ld-px-13);
108
+ border: var(--ld-px-1) solid var(--lv-border);
109
+ border-radius: var(--ld-px-6);
110
+ background: var(--lv-bg);
111
+ color: var(--lv-text);
112
+ cursor: pointer;
113
+ transition: all 0.15s;
114
+ }
115
+ .lv-filter-btn:hover {
116
+ border-color: var(--lv-primary);
117
+ color: var(--lv-primary);
118
+ }
119
+ .lv-filter-btn--primary {
120
+ background: var(--lv-primary);
121
+ border-color: var(--lv-primary);
122
+ color: var(--ld-white);
123
+ }
124
+ .lv-filter-btn--primary:hover {
125
+ opacity: 0.85;
126
+ }
127
+ /* ===== Timeline ===== */
128
+ .lv-timeline {
129
+ position: relative;
130
+ padding-left: var(--ld-px-28);
131
+ }
132
+ .lv-timeline::before {
133
+ content: "";
134
+ position: absolute;
135
+ left: var(--ld-px-9);
136
+ top: 0;
137
+ bottom: 0;
138
+ width: var(--ld-px-2);
139
+ background: var(--lv-timeline-line);
140
+ }
141
+ .lv-timeline-item {
142
+ position: relative;
143
+ padding: 0 0 var(--ld-px-20) 0;
144
+ }
145
+ .lv-timeline-dot {
146
+ position: absolute;
147
+ left: calc(-1 * var(--ld-px-25));
148
+ top: var(--ld-px-6);
149
+ width: var(--ld-px-12);
150
+ height: var(--ld-px-12);
151
+ border-radius: 50%;
152
+ background: var(--lv-bg);
153
+ border: var(--ld-px-2) solid var(--lv-timeline-dot);
154
+ z-index: 1;
155
+ }
156
+ .lv-timeline-dot--anomaly {
157
+ border-color: var(--ld-danger-500);
158
+ background: var(--ld-danger-50);
159
+ }
160
+ .lv-timeline-card {
161
+ background: var(--lv-bg);
162
+ border: var(--ld-px-1) solid var(--lv-border);
163
+ border-radius: var(--lv-radius);
164
+ padding: var(--ld-px-14) var(--ld-px-18);
165
+ cursor: pointer;
166
+ transition: all 0.2s;
167
+ box-shadow: 0 var(--ld-px-1) var(--ld-px-3) var(--lv-shadow);
168
+ }
169
+ .lv-timeline-card:hover {
170
+ border-color: var(--lv-primary);
171
+ box-shadow: 0 var(--ld-px-2) var(--ld-px-8) var(--lv-shadow);
172
+ }
173
+ .lv-timeline-card--anomaly {
174
+ border-left: var(--ld-px-3) solid var(--lv-anomaly-border);
175
+ background: var(--lv-anomaly-bg);
176
+ }
177
+ .lv-timeline-header {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: var(--ld-px-10);
181
+ flex-wrap: wrap;
182
+ margin-bottom: var(--ld-px-4);
183
+ }
184
+ .lv-timeline-time {
185
+ font-size: var(--ld-px-12);
186
+ color: var(--lv-text-muted);
187
+ font-family: var(--lv-font-mono);
188
+ }
189
+ .lv-timeline-user {
190
+ font-weight: 600;
191
+ font-size: var(--ld-px-14);
192
+ }
193
+ .lv-action-tag {
194
+ display: inline-block;
195
+ padding: var(--ld-px-1) var(--ld-px-8);
196
+ font-size: var(--ld-px-12);
197
+ border-radius: var(--ld-px-4);
198
+ font-weight: 500;
199
+ color: var(--ld-white);
200
+ }
201
+ .lv-action-tag--create,
202
+ .lv-action-tag--approve {
203
+ background: var(--ld-success-500);
204
+ }
205
+ .lv-action-tag--update,
206
+ .lv-action-tag--login {
207
+ background: var(--ld-primary-500);
208
+ }
209
+ .lv-action-tag--delete,
210
+ .lv-action-tag--reject {
211
+ background: var(--ld-danger-500);
212
+ }
213
+ .lv-action-tag--query,
214
+ .lv-action-tag--other {
215
+ background: var(--ld-text-secondary);
216
+ }
217
+ .lv-action-tag--logout {
218
+ background: var(--ld-primary-700);
219
+ }
220
+ .lv-action-tag--export {
221
+ background: var(--ld-warning-500);
222
+ }
223
+ .lv-action-tag--import {
224
+ background: var(--ld-success-500);
225
+ }
226
+ .lv-timeline-module {
227
+ font-size: var(--ld-px-12);
228
+ color: var(--lv-text-secondary);
229
+ background: var(--lv-bg-secondary);
230
+ padding: var(--ld-px-1) var(--ld-px-8);
231
+ border-radius: var(--ld-px-4);
232
+ }
233
+ .lv-timeline-ip {
234
+ font-size: var(--ld-px-12);
235
+ color: var(--lv-text-muted);
236
+ font-family: var(--lv-font-mono);
237
+ }
238
+ .lv-anomaly-badge {
239
+ font-size: var(--ld-px-11);
240
+ padding: var(--ld-px-1) var(--ld-px-6);
241
+ border-radius: var(--ld-px-3);
242
+ background: var(--ld-warning-50);
243
+ color: var(--ld-warning-700);
244
+ border: var(--ld-px-1) solid var(--ld-warning-300);
245
+ }
246
+ .lv-timeline-detail {
247
+ font-size: var(--ld-px-13);
248
+ color: var(--lv-text-secondary);
249
+ margin-top: var(--ld-px-6);
250
+ }
251
+ .lv-timeline-expand-hint {
252
+ border: 0;
253
+ padding: 0;
254
+ background: transparent;
255
+ font: inherit;
256
+ font-size: var(--ld-px-12);
257
+ color: var(--lv-primary);
258
+ margin-top: var(--ld-px-6);
259
+ cursor: pointer;
260
+ }
261
+ /* ===== Detail Panel ===== */
262
+ .lv-detail {
263
+ margin-top: var(--ld-px-12);
264
+ padding-top: var(--ld-px-12);
265
+ border-top: var(--ld-px-1) dashed var(--lv-border);
266
+ animation: lv-slide-down 0.2s ease;
267
+ }
268
+ @keyframes lv-slide-down {
269
+ from {
270
+ opacity: 0;
271
+ transform: translateY(calc(-1 * var(--ld-px-8)));
272
+ }
273
+ to {
274
+ opacity: 1;
275
+ transform: translateY(0);
276
+ }
277
+ }
278
+ /* ===== Diff Table ===== */
279
+ .lv-diff-table {
280
+ width: 100%;
281
+ border-collapse: collapse;
282
+ font-size: var(--ld-px-13);
283
+ border: var(--ld-px-1) solid var(--lv-border);
284
+ border-radius: var(--ld-px-6);
285
+ overflow: hidden;
286
+ }
287
+ .lv-diff-table th {
288
+ background: var(--lv-bg-secondary);
289
+ padding: var(--ld-px-8) var(--ld-px-12);
290
+ text-align: left;
291
+ font-weight: 600;
292
+ font-size: var(--ld-px-12);
293
+ color: var(--lv-text-secondary);
294
+ border-bottom: var(--ld-px-1) solid var(--lv-border);
295
+ }
296
+ .lv-diff-table td {
297
+ padding: var(--ld-px-8) var(--ld-px-12);
298
+ border-bottom: var(--ld-px-1) solid var(--lv-border);
299
+ vertical-align: top;
300
+ }
301
+ .lv-diff-table tr:last-child td {
302
+ border-bottom: none;
303
+ }
304
+ .lv-diff-old {
305
+ background: var(--lv-diff-del-bg);
306
+ color: var(--lv-diff-del-text);
307
+ text-decoration: line-through;
308
+ font-family: var(--lv-font-mono);
309
+ font-size: var(--ld-px-12);
310
+ }
311
+ .lv-diff-new {
312
+ background: var(--lv-diff-add-bg);
313
+ color: var(--lv-diff-add-text);
314
+ font-family: var(--lv-font-mono);
315
+ font-size: var(--ld-px-12);
316
+ }
317
+ /* ===== Metadata ===== */
318
+ .lv-metadata {
319
+ margin-top: var(--ld-px-10);
320
+ background: var(--lv-bg-secondary);
321
+ border-radius: var(--ld-px-6);
322
+ padding: var(--ld-px-10) var(--ld-px-14);
323
+ font-size: var(--ld-px-12);
324
+ font-family: var(--lv-font-mono);
325
+ white-space: pre-wrap;
326
+ word-break: break-all;
327
+ color: var(--lv-text-secondary);
328
+ }
329
+ /* ===== Pagination ===== */
330
+ .lv-pagination {
331
+ display: flex;
332
+ align-items: center;
333
+ justify-content: center;
334
+ gap: var(--ld-px-6);
335
+ padding: var(--ld-px-16) 0;
336
+ }
337
+ .lv-pagination-btn {
338
+ display: inline-flex;
339
+ align-items: center;
340
+ justify-content: center;
341
+ width: var(--ld-px-32);
342
+ height: var(--ld-px-32);
343
+ border: var(--ld-px-1) solid var(--lv-border);
344
+ border-radius: var(--ld-px-6);
345
+ background: var(--lv-bg);
346
+ color: var(--lv-text);
347
+ font-size: var(--ld-px-13);
348
+ cursor: pointer;
349
+ transition: all 0.15s;
350
+ }
351
+ .lv-pagination-btn:hover {
352
+ border-color: var(--lv-primary);
353
+ color: var(--lv-primary);
354
+ }
355
+ .lv-pagination-btn--active {
356
+ background: var(--lv-primary);
357
+ border-color: var(--lv-primary);
358
+ color: var(--ld-white);
359
+ }
360
+ .lv-pagination-btn:disabled {
361
+ opacity: 0.4;
362
+ cursor: not-allowed;
363
+ }
364
+ .lv-pagination-info {
365
+ font-size: var(--ld-px-13);
366
+ color: var(--lv-text-secondary);
367
+ margin: 0 var(--ld-px-8);
368
+ }
369
+ /* ===== Empty state ===== */
370
+ .lv-empty {
371
+ text-align: center;
372
+ padding: var(--ld-px-48) var(--ld-px-16);
373
+ color: var(--lv-text-muted);
374
+ font-size: var(--ld-px-14);
375
+ }
376
+ .lv-empty-icon {
377
+ font-size: var(--ld-px-48);
378
+ margin-bottom: var(--ld-px-12);
379
+ opacity: 0.3;
380
+ }
package/dist/index.js CHANGED
@@ -2,18 +2,19 @@
2
2
  * ***********************************
3
3
  * @composy/log-viewer-vue v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:42:24 *
5
+ * Build time: 2024-10-12 17:44:31 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
9
9
  */
10
10
  (function(global, factory) {
11
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("vue"), require("@composy/log-viewer-core")) : typeof define === "function" && define.amd ? define([
11
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("vue"), require("vue-demi"), require("@composy/log-viewer-core")) : typeof define === "function" && define.amd ? define([
12
12
  "exports",
13
13
  "vue",
14
+ "vue-demi",
14
15
  "@composy/log-viewer-core"
15
- ], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.LDesignPackagesVue3 = {}, global.Vue, global.ComposyLogViewerCore));
16
- })(this, function(exports, vue, _composy_log_viewer_core) {
16
+ ], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.LDesignLogViewerVue = {}, global.Vue, global.VueDemi, global.ComposyLogViewerCore));
17
+ })(this, function(exports, vue, vue_demi, _composy_log_viewer_core) {
17
18
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
18
19
  //#region src/components/LogViewer.vue?vue&type=script&setup=true&lang.ts
19
20
  var LogViewer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -55,19 +56,19 @@
55
56
  }
56
57
  },
57
58
  emits: [
58
- "entry-click",
59
- "entry-expand",
60
- "entry-collapse",
61
- "filter-change",
62
- "theme-change",
63
- "page-change"
59
+ "entryClick",
60
+ "entryExpand",
61
+ "entryCollapse",
62
+ "filterChange",
63
+ "themeChange",
64
+ "pageChange"
64
65
  ],
65
66
  setup(__props, { expose: __expose, emit: __emit }) {
66
67
  const props = __props;
67
68
  const emit = __emit;
68
- const containerRef = (0, vue.ref)(null);
69
+ const containerRef = (0, vue_demi.ref)(null);
69
70
  let instance = null;
70
- (0, vue.onMounted)(() => {
71
+ (0, vue_demi.onMounted)(() => {
71
72
  if (!containerRef.value) return;
72
73
  instance = (0, _composy_log_viewer_core.createLogViewer)({
73
74
  container: containerRef.value,
@@ -79,23 +80,23 @@
79
80
  showDiff: props.showDiff,
80
81
  showAnomalyBadge: props.showAnomalyBadge
81
82
  });
82
- instance.on("entry:click", (entry) => emit("entry-click", entry));
83
- instance.on("entry:expand", (entry) => emit("entry-expand", entry));
84
- instance.on("entry:collapse", (entry) => emit("entry-collapse", entry));
85
- instance.on("filter:change", (filter) => emit("filter-change", filter));
86
- instance.on("theme:change", (theme) => emit("theme-change", theme));
87
- instance.on("page:change", (page) => emit("page-change", page));
83
+ instance.on("entry:click", (entry) => emit("entryClick", entry));
84
+ instance.on("entry:expand", (entry) => emit("entryExpand", entry));
85
+ instance.on("entry:collapse", (entry) => emit("entryCollapse", entry));
86
+ instance.on("filter:change", (filter) => emit("filterChange", filter));
87
+ instance.on("theme:change", (theme) => emit("themeChange", theme));
88
+ instance.on("page:change", (page) => emit("pageChange", page));
88
89
  });
89
- (0, vue.watch)(() => props.data, (newData) => {
90
+ (0, vue_demi.watch)(() => props.data, (newData) => {
90
91
  instance?.setData(newData);
91
92
  }, { deep: true });
92
- (0, vue.watch)(() => props.filter, (newFilter) => {
93
- if (newFilter) instance?.setFilter(newFilter);
93
+ (0, vue_demi.watch)(() => props.filter, (newFilter) => {
94
+ instance?.setFilter(newFilter || {});
94
95
  }, { deep: true });
95
- (0, vue.watch)(() => props.theme, (newTheme) => {
96
+ (0, vue_demi.watch)(() => props.theme, (newTheme) => {
96
97
  instance?.setTheme(newTheme);
97
98
  });
98
- (0, vue.onUnmounted)(() => {
99
+ (0, vue_demi.onUnmounted)(() => {
99
100
  instance?.destroy();
100
101
  instance = null;
101
102
  });
@@ -116,19 +117,19 @@
116
117
  //#endregion
117
118
  //#region src/composables/useLogViewer.ts
118
119
  function useLogViewer() {
119
- const instance = (0, vue.ref)(null);
120
- const data = (0, vue.ref)([]);
121
- const filter = (0, vue.ref)({});
122
- const theme = (0, vue.ref)("light");
123
- const pagination = (0, vue.ref)({
120
+ const instance = (0, vue_demi.ref)(null);
121
+ const data = (0, vue_demi.ref)([]);
122
+ const filter = (0, vue_demi.ref)({});
123
+ const theme = (0, vue_demi.ref)("light");
124
+ const pagination = (0, vue_demi.ref)({
124
125
  page: 1,
125
126
  pageSize: 20
126
127
  });
127
128
  function create(container, config) {
128
129
  if (instance.value) instance.value.destroy();
129
130
  instance.value = (0, _composy_log_viewer_core.createLogViewer)({
130
- container,
131
- ...config
131
+ ...config,
132
+ container
132
133
  });
133
134
  instance.value.on("data:change", (entries) => {
134
135
  data.value = entries;
@@ -142,9 +143,10 @@
142
143
  instance.value.on("page:change", () => {
143
144
  if (instance.value) pagination.value = instance.value.getPagination();
144
145
  });
145
- if (config?.data) data.value = config.data;
146
- if (config?.theme) theme.value = config.theme;
147
- if (config?.filter) filter.value = config.filter;
146
+ data.value = instance.value.getData();
147
+ filter.value = instance.value.getFilter();
148
+ theme.value = instance.value.getTheme();
149
+ pagination.value = instance.value.getPagination();
148
150
  }
149
151
  function setData(entries) {
150
152
  instance.value?.setData(entries);
@@ -181,6 +183,14 @@
181
183
  function refresh() {
182
184
  instance.value?.refresh();
183
185
  }
186
+ async function loadData() {
187
+ const loader = instance.value?.loadData;
188
+ if (loader) await loader.call(instance.value);
189
+ if (instance.value) {
190
+ data.value = instance.value.getData();
191
+ pagination.value = instance.value.getPagination();
192
+ }
193
+ }
184
194
  function destroy() {
185
195
  instance.value?.destroy();
186
196
  instance.value = null;
@@ -188,7 +198,7 @@
188
198
  function on(event, callback) {
189
199
  return instance.value?.on(event, callback) || (() => {});
190
200
  }
191
- (0, vue.onUnmounted)(() => {
201
+ (0, vue_demi.onUnmounted)(() => {
192
202
  destroy();
193
203
  });
194
204
  return {
@@ -208,6 +218,7 @@
208
218
  collapseAll,
209
219
  goToPage,
210
220
  refresh,
221
+ loadData,
211
222
  destroy,
212
223
  on
213
224
  };