@k3000/ce 0.1.0 → 0.2.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.
Files changed (44) hide show
  1. package/README.md +12 -6
  2. package/app/comp/comp-test.mjs +1 -1
  3. package/app/comp/nav-bar.mjs +1 -1
  4. package/app/comp/page-container.mjs +1 -1
  5. package/app/comp/tab-bar.mjs +1 -1
  6. package/app/index.html +1 -1
  7. package/bin.mjs +48 -0
  8. package/ce.mjs +1 -0
  9. package/comm/router-view.mjs +1 -1
  10. package/console/components/common-action-button.mjs +1 -1
  11. package/console/components/common-header.mjs +1 -1
  12. package/console/components/common-input.mjs +1 -1
  13. package/console/components/common-modal.mjs +1 -1
  14. package/console/components/common-pagination.mjs +1 -1
  15. package/console/components/common-toolbar.mjs +1 -1
  16. package/console/components/div-test.mjs +11 -0
  17. package/console/components/g-button.mjs +79 -0
  18. package/console/components/g-cell.mjs +129 -0
  19. package/console/components/g-col.mjs +38 -0
  20. package/console/components/g-field.mjs +162 -0
  21. package/console/components/g-form.mjs +11 -0
  22. package/console/components/g-icon.mjs +82 -0
  23. package/console/components/g-image.mjs +127 -0
  24. package/console/components/g-popup.mjs +130 -0
  25. package/console/components/g-row.mjs +120 -0
  26. package/console/components/g-space.mjs +21 -0
  27. package/console/components/g-toast.mjs +116 -0
  28. package/console/components/layout-header.mjs +0 -179
  29. package/console/components/layout-menu.mjs +99 -2
  30. package/console/index.html +2 -1
  31. package/console/index2.html +46 -0
  32. package/console/pages/demo-button.mjs +116 -0
  33. package/console/pages/demo-cell.mjs +59 -0
  34. package/console/pages/demo-field.mjs +67 -0
  35. package/console/pages/demo-icon.mjs +200 -0
  36. package/console/pages/demo-image.mjs +113 -0
  37. package/console/pages/demo-layout.mjs +141 -0
  38. package/console/pages/demo-popup.mjs +158 -0
  39. package/console/pages/demo-space.mjs +51 -0
  40. package/console/pages/demo-toast.mjs +66 -0
  41. package/index.mjs +8 -1
  42. package/package.json +8 -2
  43. package/test.html +15 -0
  44. package/console/components/console-header.mjs +0 -26
@@ -0,0 +1,200 @@
1
+ export const innerHTML = `
2
+ <div class="h-full flex flex-col p-6 gap-6 overflow-y-auto custom-scrollbar">
3
+ <common-header title="图标展示区" description="展示 g-icon 内置的所有图标集合"></common-header>
4
+
5
+ <div class="space-y-8">
6
+ <!-- 内置图标合集 -->
7
+ <div>
8
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4">基础图标 (点击可查看名称)</h3>
9
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6">
10
+ <!-- 图标网格布局 -->
11
+ <div class="grid grid-cols-3 sm:grid-cols-4 md:grid-cols-6 lg:grid-cols-8 gap-4">
12
+ <!-- 循环渲染目前已有的图标 -->
13
+ <div onclick="alert('名称: system')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
14
+ <g-icon name="system" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
15
+ <span class="text-xs font-mono break-all text-center">system</span>
16
+ </div>
17
+
18
+ <div onclick="alert('名称: system_inner')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
19
+ <g-icon name="system_inner" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
20
+ <span class="text-xs font-mono break-all text-center">system_inner</span>
21
+ </div>
22
+
23
+ <div onclick="alert('名称: user')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
24
+ <g-icon name="user" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
25
+ <span class="text-xs font-mono break-all text-center">user</span>
26
+ </div>
27
+
28
+ <div onclick="alert('名称: role')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
29
+ <g-icon name="role" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
30
+ <span class="text-xs font-mono break-all text-center">role</span>
31
+ </div>
32
+
33
+ <div onclick="alert('名称: menu')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
34
+ <g-icon name="menu" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
35
+ <span class="text-xs font-mono break-all text-center">menu</span>
36
+ </div>
37
+
38
+ <div onclick="alert('名称: tools')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
39
+ <g-icon name="tools" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
40
+ <span class="text-xs font-mono break-all text-center">tools</span>
41
+ </div>
42
+
43
+ <div onclick="alert('名称: search')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
44
+ <g-icon name="search" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
45
+ <span class="text-xs font-mono break-all text-center">search</span>
46
+ </div>
47
+
48
+ <div onclick="alert('名称: button')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
49
+ <g-icon name="button" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
50
+ <span class="text-xs font-mono break-all text-center">button</span>
51
+ </div>
52
+
53
+ <div onclick="alert('名称: home')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
54
+ <g-icon name="home" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
55
+ <span class="text-xs font-mono break-all text-center">home</span>
56
+ </div>
57
+
58
+ <div onclick="alert('名称: edit')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
59
+ <g-icon name="edit" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
60
+ <span class="text-xs font-mono break-all text-center">edit</span>
61
+ </div>
62
+
63
+ <div onclick="alert('名称: delete')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
64
+ <g-icon name="delete" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
65
+ <span class="text-xs font-mono break-all text-center">delete</span>
66
+ </div>
67
+
68
+ <div onclick="alert('名称: add')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
69
+ <g-icon name="add" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
70
+ <span class="text-xs font-mono break-all text-center">add</span>
71
+ </div>
72
+
73
+ <div onclick="alert('名称: check')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
74
+ <g-icon name="check" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
75
+ <span class="text-xs font-mono break-all text-center">check</span>
76
+ </div>
77
+
78
+ <div onclick="alert('名称: close')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
79
+ <g-icon name="close" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
80
+ <span class="text-xs font-mono break-all text-center">close</span>
81
+ </div>
82
+
83
+ <div onclick="alert('名称: info')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
84
+ <g-icon name="info" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
85
+ <span class="text-xs font-mono break-all text-center">info</span>
86
+ </div>
87
+
88
+ <div onclick="alert('名称: warning')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
89
+ <g-icon name="warning" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
90
+ <span class="text-xs font-mono break-all text-center">warning</span>
91
+ </div>
92
+
93
+ <div onclick="alert('名称: view')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
94
+ <g-icon name="view" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
95
+ <span class="text-xs font-mono break-all text-center">view</span>
96
+ </div>
97
+
98
+ <div onclick="alert('名称: logout')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
99
+ <g-icon name="logout" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
100
+ <span class="text-xs font-mono break-all text-center">logout</span>
101
+ </div>
102
+
103
+ <div onclick="alert('名称: upload')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
104
+ <g-icon name="upload" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
105
+ <span class="text-xs font-mono break-all text-center">upload</span>
106
+ </div>
107
+
108
+ <div onclick="alert('名称: download')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
109
+ <g-icon name="download" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
110
+ <span class="text-xs font-mono break-all text-center">download</span>
111
+ </div>
112
+
113
+ <div onclick="alert('名称: refresh')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400">
114
+ <g-icon name="refresh" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
115
+ <span class="text-xs font-mono break-all text-center">refresh</span>
116
+ </div>
117
+
118
+ <!-- Default/Unknown Icon -->
119
+ <div onclick="alert('默认/未知图标表现形式')" class="flex flex-col items-center justify-center p-4 rounded-xl hover:bg-white/40 dark:hover:bg-white/5 cursor-pointer transition-all hover:scale-105 active:scale-95 group text-gray-400 dark:text-gray-500">
120
+ <g-icon name="unknown_abcde" class="w-8 h-8 mb-2 drop-shadow-sm group-hover:drop-shadow-md transition-all"></g-icon>
121
+ <span class="text-xs font-mono break-all text-center text-gray-400">未知/容错</span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+ </div>
126
+ <!-- 徽标提示 -->
127
+ <div>
128
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4">徽标提示 (dot / badge 属性)</h3>
129
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6 flex flex-wrap items-center gap-8">
130
+ <div class="flex items-center gap-6">
131
+ <div class="flex flex-col items-center gap-2">
132
+ <g-icon name="user" class="w-6 h-6 text-gray-600 dark:text-gray-300" dot="true"></g-icon>
133
+ <span class="text-xs text-gray-500">红点 (dot)</span>
134
+ </div>
135
+ <div class="flex flex-col items-center gap-2">
136
+ <g-icon name="system" class="w-6 h-6 text-gray-600 dark:text-gray-300" badge="5"></g-icon>
137
+ <span class="text-xs text-gray-500">数字徽标</span>
138
+ </div>
139
+ <div class="flex flex-col items-center gap-2">
140
+ <g-icon name="role" class="w-6 h-6 text-gray-600 dark:text-gray-300" badge="99+"></g-icon>
141
+ <span class="text-xs text-gray-500">文本徽标</span>
142
+ </div>
143
+ <div class="flex flex-col items-center gap-2">
144
+ <g-icon name="menu" class="w-6 h-6 text-gray-600 dark:text-gray-300" badge="新"></g-icon>
145
+ <span class="text-xs text-gray-500">短文本</span>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ </div>
150
+
151
+ <!-- 大小和颜色控制 -->
152
+ <div>
153
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4">扩展控制 (class参数传入)</h3>
154
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6 flex flex-wrap items-center gap-6">
155
+ <div class="flex items-center gap-3">
156
+ <span class="text-sm text-gray-500">大小(Tailwind class):</span>
157
+ <g-icon name="user" class="w-4 h-4 text-gray-600 dark:text-gray-300"></g-icon>
158
+ <g-icon name="user" class="w-6 h-6 text-gray-600 dark:text-gray-300"></g-icon>
159
+ <g-icon name="user" class="w-10 h-10 text-gray-600 dark:text-gray-300"></g-icon>
160
+ </div>
161
+
162
+ <div class="w-px h-8 bg-gray-200 dark:bg-gray-700 hidden sm:block"></div>
163
+
164
+ <div class="flex items-center gap-3">
165
+ <span class="text-sm text-gray-500">大小(size属性):</span>
166
+ <g-icon name="user" size="1.2rem" class="text-blue-500"></g-icon>
167
+ <g-icon name="user" size="30px" class="text-green-500"></g-icon>
168
+ <g-icon name="user" size="2.5em" class="text-orange-500"></g-icon>
169
+ </div>
170
+
171
+ <div class="w-px h-8 bg-gray-200 dark:bg-gray-700"></div>
172
+
173
+ <div class="flex items-center gap-3">
174
+ <span class="text-sm text-gray-500">颜色(Tailwind class):</span>
175
+ <g-icon name="tools" class="w-6 h-6 text-blue-500"></g-icon>
176
+ <g-icon name="tools" class="w-6 h-6 text-green-500"></g-icon>
177
+ <g-icon name="tools" class="w-6 h-6 text-red-500"></g-icon>
178
+ <g-icon name="tools" class="w-6 h-6 text-orange-500"></g-icon>
179
+ </div>
180
+
181
+ <div class="w-px h-8 bg-gray-200 dark:bg-gray-700 hidden sm:block"></div>
182
+
183
+ <div class="flex items-center gap-3">
184
+ <span class="text-sm text-gray-500">颜色(color属性):</span>
185
+ <g-icon name="tools" class="w-6 h-6" color="#8b5cf6"></g-icon>
186
+ <g-icon name="tools" class="w-6 h-6" color="rgb(236, 72, 153)"></g-icon>
187
+ <g-icon name="tools" class="w-6 h-6" color="darkcyan"></g-icon>
188
+ </div>
189
+ </div>
190
+ </div>
191
+
192
+ </div>
193
+ </div>
194
+ `
195
+
196
+ export default class extends HTMLElement {
197
+ ready() {
198
+ console.log('demo-icon ready')
199
+ }
200
+ }
@@ -0,0 +1,113 @@
1
+ export const innerHTML = `
2
+ <div class="h-full flex flex-col p-6 gap-6 overflow-y-auto custom-scrollbar">
3
+ <common-header title="图片展示区" description="展示 g-image 的各种类型和状态"></common-header>
4
+
5
+ <div class="space-y-8">
6
+ <!-- 基础用法 -->
7
+ <div>
8
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4">基础用法与加载</h3>
9
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6">
10
+ <div class="flex flex-wrap gap-6 items-end">
11
+ <!-- Normal Loading -->
12
+ <div class="flex flex-col gap-2 items-center">
13
+ <g-image src="https://picsum.photos/400/400?random=1"></g-image>
14
+ <span class="text-xs text-gray-500">默认</span>
15
+ </div>
16
+
17
+ <!-- Lazy Loading Example with random large delay image -->
18
+ <div class="flex flex-col gap-2 items-center">
19
+ <g-image src="https://picsum.photos/400/400?req=${Date.now()}" lazy="true"></g-image>
20
+ <span class="text-xs text-gray-500">懒加载 (lazy)</span>
21
+ </div>
22
+
23
+ <!-- Error State -->
24
+ <div class="flex flex-col gap-2 items-center">
25
+ <g-image src="https://invalid-image-url.com/broken.jpg"></g-image>
26
+ <span class="text-xs text-gray-500">加载失败 (自带骨架)</span>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </div>
31
+
32
+ <!-- 填充模式 -->
33
+ <div>
34
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4">填充模式 (fit)</h3>
35
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6">
36
+ <div class="flex flex-wrap gap-6 items-end">
37
+ <div class="flex flex-col gap-2 items-center">
38
+ <g-image src="https://picsum.photos/800/400?random=2" fit="fill" class="w-32 h-32"></g-image>
39
+ <span class="text-xs text-gray-500">fill</span>
40
+ </div>
41
+ <div class="flex flex-col gap-2 items-center">
42
+ <g-image src="https://picsum.photos/800/400?random=2" fit="contain" class="w-32 h-32"></g-image>
43
+ <span class="text-xs text-gray-500">contain</span>
44
+ </div>
45
+ <div class="flex flex-col gap-2 items-center">
46
+ <g-image src="https://picsum.photos/800/400?random=2" fit="cover" class="w-32 h-32"></g-image>
47
+ <span class="text-xs text-gray-500">cover</span>
48
+ </div>
49
+ <div class="flex flex-col gap-2 items-center">
50
+ <g-image src="https://picsum.photos/800/400?random=2" fit="none" class="w-32 h-32"></g-image>
51
+ <span class="text-xs text-gray-500">none</span>
52
+ </div>
53
+ <div class="flex flex-col gap-2 items-center">
54
+ <g-image src="https://picsum.photos/800/400?random=2" fit="scale-down" class="w-32 h-32"></g-image>
55
+ <span class="text-xs text-gray-500">scale-down</span>
56
+ </div>
57
+ </div>
58
+ </div>
59
+ </div>
60
+
61
+ <!-- 圆角与形状 -->
62
+ <div>
63
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4">圆角与形状</h3>
64
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6">
65
+ <div class="flex flex-wrap gap-6 items-end">
66
+ <div class="flex flex-col gap-2 items-center">
67
+ <g-image src="https://picsum.photos/400/400?random=3" class="w-32 h-32 rounded-lg"></g-image>
68
+ <span class="text-xs text-gray-500">默认圆角</span>
69
+ </div>
70
+ <div class="flex flex-col gap-2 items-center">
71
+ <g-image src="https://picsum.photos/400/400?random=4" class="w-32 h-32" round="true"></g-image>
72
+ <span class="text-xs text-gray-500">圆形 (round)</span>
73
+ </div>
74
+ <div class="flex flex-col gap-2 items-center">
75
+ <g-image src="https://picsum.photos/400/400?random=5" class="w-32 h-32" radius="2rem"></g-image>
76
+ <span class="text-xs text-gray-500">指定 radius</span>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ <!-- 尺寸与裁剪 (自定义宽高和位置) -->
81
+ <div>
82
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4">尺寸控制 (width / height / position)</h3>
83
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6">
84
+ <div class="flex flex-wrap gap-6 items-end">
85
+ <div class="flex flex-col gap-2 items-center">
86
+ <g-image src="https://picsum.photos/800/800?random=11" width="160px" height="80px" fit="cover"></g-image>
87
+ <span class="text-xs text-gray-500">宽160px 高80px</span>
88
+ </div>
89
+ <div class="flex flex-col gap-2 items-center">
90
+ <g-image src="https://picsum.photos/800/800?random=11" width="5rem" height="5rem" radius="10px"></g-image>
91
+ <span class="text-xs text-gray-500">宽高 5rem</span>
92
+ </div>
93
+ <div class="flex flex-col gap-2 items-center">
94
+ <g-image src="https://picsum.photos/800/400?random=12" width="100px" height="100px" fit="cover" position="left"></g-image>
95
+ <span class="text-xs text-gray-500">position="left"</span>
96
+ </div>
97
+ <div class="flex flex-col gap-2 items-center">
98
+ <g-image src="https://picsum.photos/800/400?random=12" width="100px" height="100px" fit="cover" position="right"></g-image>
99
+ <span class="text-xs text-gray-500">position="right"</span>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ </div>
104
+
105
+ </div>
106
+ </div>
107
+ `
108
+
109
+ export default class extends HTMLElement {
110
+ ready() {
111
+ console.log('demo-image ready')
112
+ }
113
+ }
@@ -0,0 +1,141 @@
1
+ export const innerHTML = `
2
+ <div class="h-full flex flex-col p-6 gap-6 overflow-y-auto custom-scrollbar">
3
+ <common-header title="布局展示区" description="展示 g-row 和 g-col 的 24 栅格行列布局"></common-header>
4
+
5
+ <div class="space-y-8">
6
+ <style>
7
+ /* 仅用于演示块的高亮样式 */
8
+ .demo-col {
9
+ border-radius: 4px;
10
+ min-height: 36px;
11
+ display: flex;
12
+ align-items: center;
13
+ justify-center;
14
+ color: #fff;
15
+ font-size: 13px;
16
+ text-align: center;
17
+ }
18
+ .demo-col-dark {
19
+ background: rgba(139, 92, 246, 0.4);
20
+ backdrop-filter: blur(10px);
21
+ border: 1px solid rgba(255, 255, 255, 0.2);
22
+ }
23
+ .demo-col-light {
24
+ background: rgba(139, 92, 246, 0.2);
25
+ backdrop-filter: blur(10px);
26
+ border: 1px solid rgba(255, 255, 255, 0.1);
27
+ }
28
+ </style>
29
+
30
+ <!-- 基础布局 -->
31
+ <div>
32
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4 shadow-sm">基础布局 (24格)</h3>
33
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6 space-y-4">
34
+ <g-row>
35
+ <g-col span="24">
36
+ <div class="demo-col demo-col-dark flex justify-center h-full">span: 24</div>
37
+ </g-col>
38
+ </g-row>
39
+
40
+ <g-row>
41
+ <g-col span="12"><div class="demo-col demo-col-light flex justify-center h-full">span: 12</div></g-col>
42
+ <g-col span="12"><div class="demo-col demo-col-dark flex justify-center h-full">span: 12</div></g-col>
43
+ </g-row>
44
+
45
+ <g-row>
46
+ <g-col span="8"><div class="demo-col demo-col-dark flex justify-center h-full">span: 8</div></g-col>
47
+ <g-col span="8"><div class="demo-col demo-col-light flex justify-center h-full">span: 8</div></g-col>
48
+ <g-col span="8"><div class="demo-col demo-col-dark flex justify-center h-full">span: 8</div></g-col>
49
+ </g-row>
50
+
51
+ <g-row>
52
+ <g-col span="6"><div class="demo-col demo-col-light flex justify-center h-full">span: 6</div></g-col>
53
+ <g-col span="6"><div class="demo-col demo-col-dark flex justify-center h-full">span: 6</div></g-col>
54
+ <g-col span="6"><div class="demo-col demo-col-light flex justify-center h-full">span: 6</div></g-col>
55
+ <g-col span="6"><div class="demo-col demo-col-dark flex justify-center h-full">span: 6</div></g-col>
56
+ </g-row>
57
+ </div>
58
+ </div>
59
+
60
+ <!-- 栅格间距 -->
61
+ <div>
62
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4 shadow-sm">分栏隔离 (gutter)</h3>
63
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6 space-y-6">
64
+ <p class="text-xs text-gray-500 mb-2">水平间距 gutter="20"</p>
65
+ <g-row gutter="20">
66
+ <g-col span="8"><div class="demo-col demo-col-dark flex justify-center h-full">span: 8</div></g-col>
67
+ <g-col span="8"><div class="demo-col demo-col-light flex justify-center h-full">span: 8</div></g-col>
68
+ <g-col span="8"><div class="demo-col demo-col-dark flex justify-center h-full">span: 8</div></g-col>
69
+ </g-row>
70
+
71
+ <p class="text-xs text-gray-500 mb-2 mt-4">水平+垂直间距 gutter="[20, 20]" (多行折叠适用)</p>
72
+ <g-row gutter="[20, 20]">
73
+ <g-col span="8"><div class="demo-col demo-col-light flex justify-center h-full">span: 8</div></g-col>
74
+ <g-col span="8"><div class="demo-col demo-col-dark flex justify-center h-full">span: 8</div></g-col>
75
+ <g-col span="8"><div class="demo-col demo-col-light flex justify-center h-full">span: 8</div></g-col>
76
+ <g-col span="8"><div class="demo-col demo-col-dark flex justify-center h-full">span: 8</div></g-col>
77
+ <g-col span="8"><div class="demo-col demo-col-light flex justify-center h-full">span: 8</div></g-col>
78
+ </g-row>
79
+ </div>
80
+ </div>
81
+
82
+ <!-- 栅格偏移 -->
83
+ <div>
84
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4 shadow-sm">分栏偏移 (offset)</h3>
85
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6 space-y-4">
86
+ <g-row gutter="10">
87
+ <g-col span="4"><div class="demo-col demo-col-dark flex justify-center h-full">span: 4</div></g-col>
88
+ <g-col span="10" offset="4"><div class="demo-col demo-col-light flex justify-center h-full">span: 10, offset: 4</div></g-col>
89
+ </g-row>
90
+
91
+ <g-row gutter="10">
92
+ <g-col span="12" offset="12"><div class="demo-col demo-col-dark flex justify-center h-full">span: 12, offset: 12</div></g-col>
93
+ </g-row>
94
+ </div>
95
+ </div>
96
+
97
+ <!-- 对齐方式 -->
98
+ <div>
99
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4 shadow-sm">对齐方式 (justify / align)</h3>
100
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6 space-y-6">
101
+ <!-- 居中对齐 -->
102
+ <p class="text-xs text-gray-500 mb-2">justify="center"</p>
103
+ <div class="bg-black/5 dark:bg-white/5 rounded-lg p-2">
104
+ <g-row justify="center">
105
+ <g-col span="6"><div class="demo-col demo-col-light flex justify-center h-full">span: 6</div></g-col>
106
+ <g-col span="6"><div class="demo-col demo-col-dark flex justify-center h-full">span: 6</div></g-col>
107
+ <g-col span="6"><div class="demo-col demo-col-light flex justify-center h-full">span: 6</div></g-col>
108
+ </g-row>
109
+ </div>
110
+
111
+ <!-- 两端对齐 -->
112
+ <p class="text-xs text-gray-500 mb-2">justify="space-between"</p>
113
+ <div class="bg-black/5 dark:bg-white/5 rounded-lg p-2">
114
+ <g-row justify="space-between">
115
+ <g-col span="4"><div class="demo-col demo-col-dark flex justify-center h-full">span: 4</div></g-col>
116
+ <g-col span="4"><div class="demo-col demo-col-light flex justify-center h-full">span: 4</div></g-col>
117
+ <g-col span="4"><div class="demo-col demo-col-dark flex justify-center h-full">span: 4</div></g-col>
118
+ </g-row>
119
+ </div>
120
+
121
+ <!-- 垂直到底部 -->
122
+ <p class="text-xs text-gray-500 mb-2">align="bottom"</p>
123
+ <div class="bg-black/5 dark:bg-white/5 rounded-lg p-2 h-24">
124
+ <g-row align="bottom" class="h-full">
125
+ <g-col span="6"><div class="demo-col demo-col-light flex justify-center h-[20px]">h:20</div></g-col>
126
+ <g-col span="6"><div class="demo-col demo-col-dark flex justify-center h-[50px]">h:50</div></g-col>
127
+ <g-col span="8"><div class="demo-col demo-col-light flex justify-center h-[30px]">h:30</div></g-col>
128
+ </g-row>
129
+ </div>
130
+ </div>
131
+ </div>
132
+
133
+ </div>
134
+ </div>
135
+ `
136
+
137
+ export default class extends HTMLElement {
138
+ ready() {
139
+ console.log('demo-layout ready')
140
+ }
141
+ }
@@ -0,0 +1,158 @@
1
+ export const innerHTML = `
2
+ <div class="h-full flex flex-col p-6 gap-6 overflow-y-auto custom-scrollbar">
3
+ <common-header title="弹出层部件" description="展示 g-popup 的基础用法、各个方向及其多层管理能力"></common-header>
4
+
5
+ <div class="space-y-8 pb-10">
6
+ <!-- 基础用法与位置 -->
7
+ <div>
8
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4 shadow-sm">基础用法与位置 (position)</h3>
9
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6 flex flex-wrap gap-4">
10
+ <g-button onclick="{{open}}">居中弹出</g-button>
11
+ <g-button onclick="document.getElementById('pop-bottom').open()">底部弹出</g-button>
12
+ <g-button onclick="document.getElementById('pop-top').open()">顶部弹出</g-button>
13
+ <g-button onclick="document.getElementById('pop-left').open()">左侧弹出</g-button>
14
+ <g-button onclick="document.getElementById('pop-right').open()">右侧弹出</g-button>
15
+ </div>
16
+ </div>
17
+
18
+ <!-- 遮罩与圆角控制 -->
19
+ <div>
20
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4 shadow-sm">特殊修饰 (overlay / round)</h3>
21
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6 flex flex-wrap gap-4">
22
+ <g-button onclick="document.getElementById('pop-no-round').open()">不带圆角直角(默认)</g-button>
23
+ <g-button plain="true" onclick="document.getElementById('pop-no-overlay').open()">透明无遮罩层 (overlay=false)</g-button>
24
+ </div>
25
+ </div>
26
+
27
+ <!-- 多层叠加弹窗 -->
28
+ <div>
29
+ <h3 class="text-sm font-medium text-gray-500 dark:text-gray-400 mb-2 px-4 shadow-sm">多层堆叠管理 (自动递增 z-index)</h3>
30
+ <div class="bg-white/60 dark:bg-gray-800/60 backdrop-blur-2xl rounded-2xl shadow-lg shadow-gray-200/20 dark:shadow-black/20 border border-white/40 dark:border-white/10 p-6 flex flex-wrap gap-4">
31
+ <g-button type="primary" onclick="document.getElementById('pop-multi-1').open()">打开第一层 (滑出抽屉)</g-button>
32
+ </div>
33
+ </div>
34
+ </div>
35
+
36
+ <!-- ================= 弹窗实例区域 ================= -->
37
+
38
+ <!-- Center -->
39
+ <g-popup id="pop-center" round="true" position="center" status="{{popupStatus}}" onclose="{{close}}">
40
+ <div class="w-80 p-8 flex flex-col items-center gap-4">
41
+ <g-icon name="check" class="w-12 h-12 text-green-500"></g-icon>
42
+ <h4 class="text-lg font-bold">居中弹窗</h4>
43
+ <p class="text-gray-500 text-sm text-center">这是一个经典的居中显示弹出层,附带轻柔的面包缩放缓冲动画。</p>
44
+ <g-button class="mt-4 w-full" type="primary" onclick="{{close}}">稍后再说</g-button>
45
+ </div>
46
+ </g-popup>
47
+
48
+ <!-- Bottom -->
49
+ <g-popup id="pop-bottom" round="true" position="bottom">
50
+ <div class="w-full sm:w-[500px] p-6 mx-auto h-64 bg-white/50 dark:bg-gray-800/50">
51
+ <h4 class="text-lg font-bold mb-4 border-b border-gray-100 dark:border-gray-700 pb-2">底部弹窗面板</h4>
52
+ <p class="text-gray-500 text-sm">从底部平滑移出的面板通常用于选择项、评论列表或是分享屏幕操作等。</p>
53
+ <div class="mt-8 flex gap-4">
54
+ <g-button class="flex-1" onclick="document.getElementById('pop-bottom').close()">取消</g-button>
55
+ <g-button type="primary" class="flex-1" onclick="document.getElementById('pop-bottom').close()">确认</g-button>
56
+ </div>
57
+ </div>
58
+ </g-popup>
59
+
60
+ <!-- Top -->
61
+ <g-popup id="pop-top" round="true" position="top" close-on-click-overlay="false">
62
+ <div class="w-full p-4 bg-orange-500/10 backdrop-blur-xl text-orange-600 dark:text-orange-400 flex items-center justify-between shadow-xl shadow-orange-500/10 border-b border-orange-500/20">
63
+ <div class="flex items-center gap-2">
64
+ <g-icon name="warning" class="w-5 h-5"></g-icon>
65
+ <span class="text-sm font-medium">这是一条顶部的警告消息!设置了不允许点击遮罩层关闭。</span>
66
+ </div>
67
+ <g-icon name="close" class="w-5 h-5 cursor-pointer hover:opacity-70 transition-opacity" onclick="document.getElementById('pop-top').close()"></g-icon>
68
+ </div>
69
+ </g-popup>
70
+
71
+ <!-- Left -->
72
+ <g-popup id="pop-left" position="left" round="true">
73
+ <div class="w-64 h-full p-6 flex flex-col border-r border-white/20">
74
+ <h4 class="text-lg font-bold mb-6">系统菜单抽屉</h4>
75
+ <div class="space-y-4 flex-1">
76
+ <div class="h-10 bg-gray-100 dark:bg-gray-700/50 rounded-lg animate-pulse w-full"></div>
77
+ <div class="h-10 bg-gray-100 dark:bg-gray-700/50 rounded-lg animate-pulse w-2/3"></div>
78
+ <div class="h-10 bg-gray-100 dark:bg-gray-700/50 rounded-lg animate-pulse w-4/5"></div>
79
+ </div>
80
+ <g-button onclick="document.getElementById('pop-left').close()">关闭</g-button>
81
+ </div>
82
+ </g-popup>
83
+
84
+ <!-- Right -->
85
+ <g-popup id="pop-right" position="right">
86
+ <div class="w-80 h-full p-6 flex flex-col border-l border-white/20">
87
+ <h4 class="text-lg font-bold mb-6">侧边栏详情</h4>
88
+ <div class="space-y-4 flex-1">
89
+ <p class="text-sm text-gray-500">从右侧滑出的面板,通常用于后台系统的全局设置或者某一行的详情表单页。</p>
90
+ </div>
91
+ <g-button type="primary" onclick="document.getElementById('pop-right').close()">完成</g-button>
92
+ </div>
93
+ </g-popup>
94
+
95
+ <!-- No Round Center -->
96
+ <g-popup id="pop-no-round" position="center">
97
+ <div class="w-80 p-6 flex flex-col gap-4 bg-blue-50 dark:bg-blue-900/30">
98
+ <h4 class="text-lg font-bold">直角弹窗</h4>
99
+ <p class="text-gray-500 text-sm">这是一个没有提供圆角修饰的极度硬朗的弹出框容器示例。</p>
100
+ <g-button onclick="document.getElementById('pop-no-round').close()">阅毕</g-button>
101
+ </div>
102
+ </g-popup>
103
+
104
+ <!-- No Overlay Center -->
105
+ <g-popup id="pop-no-overlay" position="center" overlay="false" round="true">
106
+ <div class="w-72 p-6 flex flex-col gap-4 shadow-[0_20px_50px_rgba(0,0,0,0.15)] bg-white dark:bg-gray-800">
107
+ <h4 class="text-md font-bold text-center">透明无遮罩模式</h4>
108
+ <p class="text-gray-500 text-xs text-center border-b border-gray-100 dark:border-gray-700 pb-2">此时您可以看到背后没有变暗。点击由于没遮罩所以需要按钮关闭:)</p>
109
+ <g-button onclick="document.getElementById('pop-no-overlay').close()">关闭这个透明框</g-button>
110
+ </div>
111
+ </g-popup>
112
+
113
+
114
+ <!-- Multi 1 -->
115
+ <g-popup id="pop-multi-1" position="right" round="true">
116
+ <div class="w-[350px] sm:w-[450px] h-full p-6 flex flex-col shadow-[-10px_0_30px_rgba(0,0,0,0.1)]">
117
+ <div class="flex items-center justify-between mb-6 border-b border-gray-100 dark:border-gray-700 pb-4">
118
+ <h4 class="text-lg font-bold">第一层弹窗</h4>
119
+ <g-icon name="close" class="w-5 h-5 cursor-pointer text-gray-400 hover:text-red-500" onclick="document.getElementById('pop-multi-1').close()"></g-icon>
120
+ </div>
121
+
122
+ <p class="text-gray-500 mb-6 flex-1">
123
+ 目前的 z-index 是 <code>window.__g_popup_z_index</code> 的分配结果(通常是2000)。<br/><br/>
124
+ 你可以随时在页面中任意点击下方按钮,我们在这一层之上继续利用 g-popup 打开一个新的层级。由于 z-index 自增,新的层次会永远在最顶端。
125
+ </p>
126
+
127
+ <g-button type="warning" onclick="document.getElementById('pop-multi-2').open()">在其上方打开第二层</g-button>
128
+ </div>
129
+ </g-popup>
130
+
131
+ <!-- Multi 2 -->
132
+ <g-popup id="pop-multi-2" position="center" round="true" close-on-click-overlay="false">
133
+ <div class="w-80 p-8 flex flex-col items-center">
134
+ <div class="w-12 h-12 rounded-full bg-orange-100 dark:bg-orange-900/40 flex items-center justify-center mb-4 text-orange-500">
135
+ <g-icon name="warning" class="w-6 h-6"></g-icon>
136
+ </div>
137
+
138
+ <h4 class="text-lg font-bold mb-2 text-center">第二层强制确认</h4>
139
+ <p class="text-sm text-gray-500 text-center mb-6">此时 z-index 自动 +1。它不仅覆盖在第一层之上,还阻止了点击遮罩层关闭(防乱点击退出)。</p>
140
+ <div class="flex gap-4 w-full">
141
+ <g-button class="flex-1" onclick="document.getElementById('pop-multi-2').close()">明白,关闭本层</g-button>
142
+ </div>
143
+ </div>
144
+ </g-popup>
145
+
146
+ </div>
147
+ `
148
+ export default class extends HTMLElement {
149
+ popupStatus = false
150
+
151
+ open() {
152
+ this.popupStatus = true
153
+ }
154
+
155
+ close() {
156
+ this.popupStatus = false
157
+ }
158
+ }