officialblock 1.0.1 → 1.0.3
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/README.md +25 -1
- package/dist/official-block.cjs.js +195 -1
- package/dist/official-block.es.js +27230 -72
- package/dist/official-block.umd.js +195 -1
- package/dist/style.css +1 -1
- package/package.json +13 -2
- package/src/App.vue +32 -82
- package/src/components/ArticleList/article.vue +73 -0
- package/src/components/ArticleList/contact.vue +95 -0
- package/src/components/ArticleList/index.vue +220 -46
- package/src/components/ArticleList/setting.vue +709 -0
- package/src/components/Button/index.vue +183 -0
- package/src/components/Media/index.vue +327 -0
- package/src/components/Operate/index.vue +74 -0
- package/src/components/RichTextEditor/RichTextEditor.vue +277 -0
- package/src/components/RichTextEditor/index.ts +7 -0
- package/src/components/ThemePreview/ThemePreview.vue +462 -0
- package/src/components/ThemePreview/index.ts +4 -0
- package/src/components/index.ts +3 -0
- package/src/composables/useTheme.ts +205 -0
- package/src/index.ts +15 -4
- package/src/main.ts +16 -1
- package/src/router/index.ts +96 -0
- package/src/style.css +2 -4
- package/src/styles/editor.scss +649 -0
- package/src/styles/test.scss +20 -0
- package/src/styles/variables.scss +669 -0
- package/src/utils/common.ts +13 -0
- package/src/utils/theme.ts +335 -0
- package/src/views/Layout.vue +250 -0
- package/src/views/NotFound.vue +114 -0
- package/src/views/components/ArticleListDemo.vue +166 -0
- package/src/views/components/DragLimitDemo.vue +573 -0
- package/src/views/components/DragSortDemo.vue +610 -0
- package/src/views/components/HeroSlideDemo.vue +353 -0
- package/src/views/components/RichTextEditorDemo.vue +53 -0
- package/src/views/components/ThemeDemo.vue +477 -0
- package/src/views/guide/Installation.vue +234 -0
- package/src/views/guide/Introduction.vue +174 -0
- package/src/views/guide/QuickStart.vue +265 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="page">
|
|
3
|
+
<h1>介绍</h1>
|
|
4
|
+
|
|
5
|
+
<p class="description">
|
|
6
|
+
OfficialBlock 是一个基于 Vue 3 + TypeScript 的组件库,提供了一系列高质量的 UI 组件,
|
|
7
|
+
帮助开发者快速构建现代化的 Web 应用程序。
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<h2>特性</h2>
|
|
11
|
+
<ul class="feature-list">
|
|
12
|
+
<li>🚀 基于 Vue 3 Composition API</li>
|
|
13
|
+
<li>📦 开箱即用的高质量组件</li>
|
|
14
|
+
<li>🎨 精美的默认主题设计</li>
|
|
15
|
+
<li>💪 使用 TypeScript 编写,提供完整的类型定义</li>
|
|
16
|
+
<li>📱 支持响应式设计</li>
|
|
17
|
+
<li>🛠️ 支持按需引入</li>
|
|
18
|
+
<li>🌍 支持国际化</li>
|
|
19
|
+
</ul>
|
|
20
|
+
|
|
21
|
+
<h2>版本</h2>
|
|
22
|
+
<p>当前版本:<code class="version-tag">v1.0.1</code></p>
|
|
23
|
+
|
|
24
|
+
<h2>兼容性</h2>
|
|
25
|
+
<p>支持现代浏览器和 IE11+。</p>
|
|
26
|
+
|
|
27
|
+
<div class="compatibility-table">
|
|
28
|
+
<table>
|
|
29
|
+
<thead>
|
|
30
|
+
<tr>
|
|
31
|
+
<th>浏览器</th>
|
|
32
|
+
<th>版本</th>
|
|
33
|
+
</tr>
|
|
34
|
+
</thead>
|
|
35
|
+
<tbody>
|
|
36
|
+
<tr>
|
|
37
|
+
<td>Chrome</td>
|
|
38
|
+
<td>≥ 85</td>
|
|
39
|
+
</tr>
|
|
40
|
+
<tr>
|
|
41
|
+
<td>Firefox</td>
|
|
42
|
+
<td>≥ 79</td>
|
|
43
|
+
</tr>
|
|
44
|
+
<tr>
|
|
45
|
+
<td>Safari</td>
|
|
46
|
+
<td>≥ 14</td>
|
|
47
|
+
</tr>
|
|
48
|
+
<tr>
|
|
49
|
+
<td>Edge</td>
|
|
50
|
+
<td>≥ 85</td>
|
|
51
|
+
</tr>
|
|
52
|
+
</tbody>
|
|
53
|
+
</table>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<h2>贡献</h2>
|
|
57
|
+
<p>
|
|
58
|
+
如果你在使用过程中发现任何问题,或者有好的建议,欢迎提交
|
|
59
|
+
<a href="https://github.com/yourusername/officialblock/issues" target="_blank">Issue</a>
|
|
60
|
+
或者
|
|
61
|
+
<a href="https://github.com/yourusername/officialblock/pulls" target="_blank">Pull Request</a>。
|
|
62
|
+
</p>
|
|
63
|
+
</div>
|
|
64
|
+
</template>
|
|
65
|
+
|
|
66
|
+
<script setup lang="ts">
|
|
67
|
+
// 页面逻辑
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
<style scoped>
|
|
71
|
+
.page {
|
|
72
|
+
max-width: 800px;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.description {
|
|
76
|
+
font-size: 16px;
|
|
77
|
+
line-height: 1.6;
|
|
78
|
+
color: #606266;
|
|
79
|
+
margin-bottom: 32px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.feature-list {
|
|
83
|
+
list-style: none;
|
|
84
|
+
padding: 0;
|
|
85
|
+
margin: 24px 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.feature-list li {
|
|
89
|
+
padding: 8px 0;
|
|
90
|
+
font-size: 16px;
|
|
91
|
+
line-height: 1.6;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.version-tag {
|
|
95
|
+
background: #f0f9ff;
|
|
96
|
+
color: #409eff;
|
|
97
|
+
padding: 4px 8px;
|
|
98
|
+
border-radius: 4px;
|
|
99
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
100
|
+
font-size: 14px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.compatibility-table {
|
|
104
|
+
margin: 24px 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.compatibility-table table {
|
|
108
|
+
width: 100%;
|
|
109
|
+
border-collapse: collapse;
|
|
110
|
+
border: 1px solid #e4e7ed;
|
|
111
|
+
border-radius: 8px;
|
|
112
|
+
overflow: hidden;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.compatibility-table th,
|
|
116
|
+
.compatibility-table td {
|
|
117
|
+
padding: 12px 16px;
|
|
118
|
+
text-align: left;
|
|
119
|
+
border-bottom: 1px solid #e4e7ed;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.compatibility-table th {
|
|
123
|
+
background: #f8f9fa;
|
|
124
|
+
font-weight: 600;
|
|
125
|
+
color: #303133;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.compatibility-table td {
|
|
129
|
+
color: #606266;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.compatibility-table tr:last-child td {
|
|
133
|
+
border-bottom: none;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
h1 {
|
|
137
|
+
color: #303133;
|
|
138
|
+
font-size: 32px;
|
|
139
|
+
font-weight: 600;
|
|
140
|
+
margin-bottom: 24px;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
h2 {
|
|
144
|
+
color: #303133;
|
|
145
|
+
font-size: 24px;
|
|
146
|
+
font-weight: 600;
|
|
147
|
+
margin: 32px 0 16px 0;
|
|
148
|
+
border-bottom: 1px solid #e4e7ed;
|
|
149
|
+
padding-bottom: 8px;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
p {
|
|
153
|
+
line-height: 1.6;
|
|
154
|
+
color: #606266;
|
|
155
|
+
margin-bottom: 16px;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
a {
|
|
159
|
+
color: #409eff;
|
|
160
|
+
text-decoration: none;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
a:hover {
|
|
164
|
+
text-decoration: underline;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
code {
|
|
168
|
+
background: #f5f5f5;
|
|
169
|
+
padding: 2px 6px;
|
|
170
|
+
border-radius: 4px;
|
|
171
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
172
|
+
font-size: 14px;
|
|
173
|
+
}
|
|
174
|
+
</style>
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="page">
|
|
3
|
+
<h1>快速开始</h1>
|
|
4
|
+
|
|
5
|
+
<p>本节将介绍如何在项目中使用 OfficialBlock。</p>
|
|
6
|
+
|
|
7
|
+
<h2>完整引入</h2>
|
|
8
|
+
<p>如果你对打包后的文件大小不是很在乎,那么使用完整导入会更方便。</p>
|
|
9
|
+
|
|
10
|
+
<div class="code-block">
|
|
11
|
+
<pre><code>// main.ts
|
|
12
|
+
import { createApp } from 'vue'
|
|
13
|
+
import App from './App.vue'
|
|
14
|
+
import OfficialBlock from 'officialblock'
|
|
15
|
+
import 'officialblock/style.css'
|
|
16
|
+
|
|
17
|
+
const app = createApp(App)
|
|
18
|
+
app.use(OfficialBlock)
|
|
19
|
+
app.mount('#app')</code></pre>
|
|
20
|
+
<button class="copy-btn" @click="copyCode(fullImportCode)">复制</button>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<h2>按需引入</h2>
|
|
24
|
+
<p>如果你只希望引入部分组件,比如 ArticleList,那么需要在代码中写入以下内容:</p>
|
|
25
|
+
|
|
26
|
+
<div class="code-block">
|
|
27
|
+
<pre><code>// main.ts
|
|
28
|
+
import { createApp } from 'vue'
|
|
29
|
+
import App from './App.vue'
|
|
30
|
+
import { ArticleList, HeroSlide } from 'officialblock'
|
|
31
|
+
import 'officialblock/style.css'
|
|
32
|
+
|
|
33
|
+
const app = createApp(App)
|
|
34
|
+
app.component('ArticleList', ArticleList)
|
|
35
|
+
app.component('HeroSlide', HeroSlide)
|
|
36
|
+
app.mount('#app')</code></pre>
|
|
37
|
+
<button class="copy-btn" @click="copyCode(partialImportCode)">复制</button>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<h3>在组件中使用</h3>
|
|
41
|
+
<div class="code-block">
|
|
42
|
+
<pre><code><template>
|
|
43
|
+
<div>
|
|
44
|
+
<ArticleList v-model="value" size="medium" />
|
|
45
|
+
<HeroSlide :auto-play="true" />
|
|
46
|
+
</div>
|
|
47
|
+
</template>
|
|
48
|
+
|
|
49
|
+
<script setup lang="ts">
|
|
50
|
+
import { ref } from 'vue'
|
|
51
|
+
import { ArticleList, HeroSlide } from 'officialblock'
|
|
52
|
+
import 'officialblock/style.css'
|
|
53
|
+
|
|
54
|
+
const value = ref('Hello World')
|
|
55
|
+
</script></code></pre>
|
|
56
|
+
<button class="copy-btn" @click="copyCode(componentUsageCode)">复制</button>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<h2>全局配置</h2>
|
|
60
|
+
<p>在引入 OfficialBlock 时,可以传入一个全局配置对象。该对象目前支持 size 与 zIndex 字段。</p>
|
|
61
|
+
|
|
62
|
+
<div class="code-block">
|
|
63
|
+
<pre><code>import { createApp } from 'vue'
|
|
64
|
+
import App from './App.vue'
|
|
65
|
+
import OfficialBlock from 'officialblock'
|
|
66
|
+
|
|
67
|
+
const app = createApp(App)
|
|
68
|
+
app.use(OfficialBlock, {
|
|
69
|
+
// 全局组件大小
|
|
70
|
+
size: 'medium',
|
|
71
|
+
// 全局 z-index 配置
|
|
72
|
+
zIndex: 3000,
|
|
73
|
+
})
|
|
74
|
+
app.mount('#app')</code></pre>
|
|
75
|
+
<button class="copy-btn" @click="copyCode(globalConfigCode)">复制</button>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<h2>开始使用</h2>
|
|
79
|
+
<p>至此,一个基于 Vue 和 OfficialBlock 的开发环境已经搭建完毕,现在就可以编写代码了。各个组件的使用方法请参阅它们各自的文档。</p>
|
|
80
|
+
|
|
81
|
+
<div class="next-steps">
|
|
82
|
+
<h3>接下来你可以:</h3>
|
|
83
|
+
<ul>
|
|
84
|
+
<li>
|
|
85
|
+
<router-link to="/components/article-list">查看 ArticleList 组件文档</router-link>
|
|
86
|
+
</li>
|
|
87
|
+
<li>
|
|
88
|
+
<router-link to="/components/hero-slide">查看 HeroSlide 组件文档</router-link>
|
|
89
|
+
</li>
|
|
90
|
+
</ul>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</template>
|
|
94
|
+
|
|
95
|
+
<script setup lang="ts">
|
|
96
|
+
const fullImportCode = `// main.ts
|
|
97
|
+
import { createApp } from 'vue'
|
|
98
|
+
import App from './App.vue'
|
|
99
|
+
import OfficialBlock from 'officialblock'
|
|
100
|
+
import 'officialblock/style.css'
|
|
101
|
+
|
|
102
|
+
const app = createApp(App)
|
|
103
|
+
app.use(OfficialBlock)
|
|
104
|
+
app.mount('#app')`
|
|
105
|
+
|
|
106
|
+
const partialImportCode = `// main.ts
|
|
107
|
+
import { createApp } from 'vue'
|
|
108
|
+
import App from './App.vue'
|
|
109
|
+
import { ArticleList, HeroSlide } from 'officialblock'
|
|
110
|
+
import 'officialblock/style.css'
|
|
111
|
+
|
|
112
|
+
const app = createApp(App)
|
|
113
|
+
app.component('ArticleList', ArticleList)
|
|
114
|
+
app.component('HeroSlide', HeroSlide)
|
|
115
|
+
app.mount('#app')`
|
|
116
|
+
|
|
117
|
+
const componentUsageCode = `<template>
|
|
118
|
+
<div>
|
|
119
|
+
<ArticleList v-model="value" size="medium" />
|
|
120
|
+
<HeroSlide :auto-play="true" />
|
|
121
|
+
</div>
|
|
122
|
+
</template>
|
|
123
|
+
|
|
124
|
+
<script setup lang="ts">
|
|
125
|
+
import { ref } from 'vue'
|
|
126
|
+
import { ArticleList, HeroSlide } from 'officialblock'
|
|
127
|
+
import 'officialblock/style.css'
|
|
128
|
+
|
|
129
|
+
const value = ref('Hello World')
|
|
130
|
+
<\/script>`
|
|
131
|
+
|
|
132
|
+
const globalConfigCode = `import { createApp } from 'vue'
|
|
133
|
+
import App from './App.vue'
|
|
134
|
+
import OfficialBlock from 'officialblock'
|
|
135
|
+
|
|
136
|
+
const app = createApp(App)
|
|
137
|
+
app.use(OfficialBlock, {
|
|
138
|
+
// 全局组件大小
|
|
139
|
+
size: 'medium',
|
|
140
|
+
// 全局 z-index 配置
|
|
141
|
+
zIndex: 3000,
|
|
142
|
+
})
|
|
143
|
+
app.mount('#app')`
|
|
144
|
+
|
|
145
|
+
const copyCode = async (code: string) => {
|
|
146
|
+
try {
|
|
147
|
+
await navigator.clipboard.writeText(code)
|
|
148
|
+
console.log('代码已复制到剪贴板')
|
|
149
|
+
} catch (err) {
|
|
150
|
+
console.error('复制失败:', err)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
</script>
|
|
154
|
+
|
|
155
|
+
<style scoped>
|
|
156
|
+
.page {
|
|
157
|
+
max-width: 800px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.code-block {
|
|
161
|
+
position: relative;
|
|
162
|
+
margin: 16px 0;
|
|
163
|
+
background: #f8f9fa;
|
|
164
|
+
border: 1px solid #e4e7ed;
|
|
165
|
+
border-radius: 8px;
|
|
166
|
+
overflow: hidden;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.code-block pre {
|
|
170
|
+
margin: 0;
|
|
171
|
+
padding: 20px;
|
|
172
|
+
overflow-x: auto;
|
|
173
|
+
background: transparent;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.code-block code {
|
|
177
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
178
|
+
font-size: 14px;
|
|
179
|
+
line-height: 1.5;
|
|
180
|
+
color: #303133;
|
|
181
|
+
background: transparent;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.copy-btn {
|
|
185
|
+
position: absolute;
|
|
186
|
+
top: 12px;
|
|
187
|
+
right: 12px;
|
|
188
|
+
padding: 6px 12px;
|
|
189
|
+
background: #409eff;
|
|
190
|
+
color: white;
|
|
191
|
+
border: none;
|
|
192
|
+
border-radius: 4px;
|
|
193
|
+
cursor: pointer;
|
|
194
|
+
font-size: 12px;
|
|
195
|
+
transition: background-color 0.3s;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.copy-btn:hover {
|
|
199
|
+
background: #337ecc;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.next-steps {
|
|
203
|
+
background: #f0f9ff;
|
|
204
|
+
border: 1px solid #b3d8ff;
|
|
205
|
+
border-radius: 8px;
|
|
206
|
+
padding: 20px;
|
|
207
|
+
margin: 32px 0;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.next-steps h3 {
|
|
211
|
+
margin-top: 0;
|
|
212
|
+
color: #409eff;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.next-steps ul {
|
|
216
|
+
margin-bottom: 0;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.next-steps a {
|
|
220
|
+
color: #409eff;
|
|
221
|
+
text-decoration: none;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.next-steps a:hover {
|
|
225
|
+
text-decoration: underline;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
h1 {
|
|
229
|
+
color: #303133;
|
|
230
|
+
font-size: 32px;
|
|
231
|
+
font-weight: 600;
|
|
232
|
+
margin-bottom: 24px;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
h2 {
|
|
236
|
+
color: #303133;
|
|
237
|
+
font-size: 24px;
|
|
238
|
+
font-weight: 600;
|
|
239
|
+
margin: 32px 0 16px 0;
|
|
240
|
+
border-bottom: 1px solid #e4e7ed;
|
|
241
|
+
padding-bottom: 8px;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
h3 {
|
|
245
|
+
color: #303133;
|
|
246
|
+
font-size: 18px;
|
|
247
|
+
font-weight: 600;
|
|
248
|
+
margin: 24px 0 12px 0;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
p {
|
|
252
|
+
line-height: 1.6;
|
|
253
|
+
color: #606266;
|
|
254
|
+
margin-bottom: 16px;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
ul {
|
|
258
|
+
color: #606266;
|
|
259
|
+
line-height: 1.6;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
li {
|
|
263
|
+
margin-bottom: 8px;
|
|
264
|
+
}
|
|
265
|
+
</style>
|