gis-view-webgl2 0.1.13 → 0.1.15

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 (62) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.d.ts +140 -60
  3. package/dist/index.js +1 -1
  4. package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +73 -5
  5. package/docs/GisView.md +49 -49
  6. package/docs/ai/06-/344/274/232/350/257/235/347/264/242/345/274/225/344/270/216/345/244/215/346/237/245/346/226/271/346/263/225.md +87 -16
  7. package/docs/demos/ApiCoverageDemo.vue +1 -5
  8. package/docs/demos/BackendSyncDemo.vue +1 -2
  9. package/docs/demos/BackgroundDemo.vue +68 -1
  10. package/docs/demos/BasicDemo.vue +76 -76
  11. package/docs/demos/BatchAddDemo.vue +2 -1
  12. package/docs/demos/ChannelDemo.vue +1 -3
  13. package/docs/demos/ClusterDemo.vue +48 -1
  14. package/docs/demos/CopyMergeDemo.vue +899 -904
  15. package/docs/demos/DemoShell.vue +336 -336
  16. package/docs/demos/EventDemo.vue +300 -300
  17. package/docs/demos/ExtensionDemo.vue +200 -200
  18. package/docs/demos/GisViewDemo.vue +64 -64
  19. package/docs/demos/LabelDemo.vue +489 -489
  20. package/docs/demos/StyleDemo.vue +67 -67
  21. package/docs/demos/api-index.js +24 -29
  22. package/docs/demos/demos.js +92 -92
  23. package/docs/demos/gis-view-demo/useGisViewDemo.js +19 -14
  24. package/docs/demos/shared/demoData.js +107 -107
  25. package/docs/demos/shared/demoStyle.css +249 -249
  26. package/docs/format/02-/350/212/202/347/202/271/344/270/216/347/272/277/350/267/257.md +3 -3
  27. package/docs/format/03-/346/213/220/347/202/271/350/243/205/351/245/260/344/270/216/346/240/267/345/274/217.md +3 -0
  28. package/docs/from0/01-/345/205/210/346/212/212/345/234/260/345/233/276/346/203/263/346/270/205/346/245/232.md +8 -7
  29. package/docs/index.html +3 -3
  30. package/docs/internals/04-/347/233/270/346/234/272/345/235/220/346/240/207/344/270/216/345/203/217/347/264/240.md +6 -4
  31. package/docs/internals/14-/350/203/214/346/231/257/345/261/202.md +2 -2
  32. package/docs/manual/02-/345/235/220/346/240/207/344/270/216/346/225/260/346/215/256.md +36 -16
  33. package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +38 -84
  34. package/docs/manual/04-/344/272/213/344/273/266/344/270/216/345/233/236/350/260/203.md +36 -19
  35. package/docs/manual/06-/346/225/260/346/215/256/344/270/216/345/234/272/346/231/257/346/233/264/346/226/260.md +1 -1
  36. package/docs/manual/07-/346/214/207/351/222/210/344/270/216/350/246/201/347/264/240/347/274/226/350/276/221.md +7 -7
  37. package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +15 -15
  38. package/docs/manual/10-/351/200/232/351/201/223/347/274/226/350/276/221/344/270/216/346/226/260/345/242/236.md +1 -1
  39. package/docs/manual/12-/346/240/207/347/255/276/344/270/216/350/243/205/351/245/260.md +6 -0
  40. package/docs/manual/14-/350/247/206/345/233/276/344/270/216/347/255/233/351/200/211.md +1 -1
  41. package/docs/manual/15-/345/257/274/345/207/272/344/270/216/351/233/206/346/210/220.md +2 -0
  42. package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +10 -8
  43. package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +11 -7
  44. package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +27 -8
  45. package/docs/manual/20-/346/200/247/350/203/275/344/270/216/345/244/247/346/225/260/346/215/256.md +27 -4
  46. package/docs/manual/21-/350/257/264/346/230/216/344/270/216/345/270/270/350/247/201/351/227/256/351/242/230.md +3 -3
  47. package/docs/playground/index.html +1 -1
  48. package/docs/sample-document/345/255/227/346/256/265/350/257/246/350/247/243.md +2 -2
  49. package/docs/steps/check-doc-truth.mjs +1 -1
  50. package/docs/steps/selftest-actions.html +4 -4
  51. package/docs/steps/selftest-data.html +5 -5
  52. package/docs/steps/selftest-demos.html +1683 -1619
  53. package/docs/steps/selftest-docs.html +4 -4
  54. package/docs/steps/selftest-effects.html +1 -1
  55. package/docs/steps/selftest-features.html +548 -47
  56. package/docs/steps/selftest-full.html +566 -566
  57. package/docs/steps/selftest-labels.html +647 -647
  58. package/docs/steps/selftest-perf.html +2282 -2237
  59. package/docs/steps/selftest-select.html +53 -14
  60. package/docs/steps/step-10-full.js +1 -4
  61. package/docs/steps/step-12-events.js +1 -4
  62. package/package.json +43 -43
@@ -1,54 +1,54 @@
1
- <script setup>
2
- /**
3
- * 演示外壳:分组页签 + 一句说明 + 当前演示(动态组件)。
4
- *
5
- * 每个演示都是一个独立组件(BasicDemo / LabelDemo / ... / GisViewDemo),
6
- * 切到哪个才 import 哪个 —— 综合示例那份最大,不点进去就不会下载。
7
- * 组件卸载即销毁各自的视图(各演示自己 onBeforeUnmount destroy()),来回切不会漏画布。
8
- *
9
- * 外壳只管「怎么找演示」:页签按 DEMO_GROUPS 分组、每句说明旁边给一条对应文档的直达链接、
10
- * 地址栏可点播(`?demo=labels`)、记不住地址就接着上次看的(localStorage),
11
- * 键盘 `[` / `]` 前后翻页签(焦点在输入框里时不抢键)。
12
- */
13
- import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue'
14
- import { DEFAULT_DEMO_ID, DEMO_GROUPS, DEMOS } from './demos.js'
15
-
16
- const publicBase = String(import.meta.env?.BASE_URL ?? '/').replace(/\/?$/, '/')
17
- /** 外壳顶部的五个常驻入口:看文档、查 API、跑步进代码、看拆解、跑自测,都不用先离开当前演示 */
18
- const quickLinks = [
19
- { label: '文档中心', href: `${publicBase}docs/index.html`, title: '按章节阅读全部文档' },
20
- { label: 'API 速查', href: `${publicBase}docs/api/index.html`, title: '搜索实例方法、属性与 options' },
21
- { label: '调试页', href: `${publicBase}docs/playground/index.html`, title: '在可运行实例上改代码' },
22
- { label: '分步演示', href: `${publicBase}docs/steps/index.html`, title: '从空画布到完整组件的十三步' },
23
- { label: '自测', href: `${publicBase}docs/steps/selftest-demos.html`, title: '打开演示页的 PASS / FAIL 清单' }
24
- ]
25
-
26
- /** 地址栏可以点播:`?demo=labels` 直接进标签演示(文档里给链接、自测页切页签都靠它) */
27
- const requestedId = typeof window === 'undefined' ? '' : new URLSearchParams(window.location.search).get('demo')
28
- /** 上次看过的演示:地址栏没点播时接着它;读不出来(隐私模式 / 禁掉存储)就当没记过 */
29
- const DEMO_STORAGE_KEY = 'gis-view:last-demo'
30
- const storedId = (() => {
31
- try {
32
- return window.localStorage.getItem(DEMO_STORAGE_KEY) ?? ''
33
- }
34
- catch {
35
- return ''
36
- }
37
- })()
38
- const currentId = ref(
39
- DEMOS.some(item => item.id === requestedId) ? requestedId
40
- : DEMOS.some(item => item.id === storedId) ? storedId
41
- : DEFAULT_DEMO_ID
42
- )
43
- const current = computed(() => DEMOS.find(item => item.id === currentId.value) ?? DEMOS[0])
44
- const currentIndex = computed(() => Math.max(0, DEMOS.findIndex(item => item.id === current.value.id)))
45
- const currentGroup = computed(() => DEMO_GROUPS.find(group => group.id === current.value.group) ?? DEMO_GROUPS[0])
46
- /** 上一个 / 下一步:按钮与键盘共用,到了头尾就绕回另一端 */
47
- const stepDemo = (step) => {
48
- const next = DEMOS[(currentIndex.value + step + DEMOS.length) % DEMOS.length]
49
- currentId.value = next.id
50
- }
51
- /** 按 DEMO_GROUPS 的次序把演示分组:外壳一个循环画出「组名 + 组里的页签」 */
1
+ <script setup>
2
+ /**
3
+ * 演示外壳:分组页签 + 一句说明 + 当前演示(动态组件)。
4
+ *
5
+ * 每个演示都是一个独立组件(BasicDemo / LabelDemo / ... / GisViewDemo),
6
+ * 切到哪个才 import 哪个 —— 综合示例那份最大,不点进去就不会下载。
7
+ * 组件卸载即销毁各自的视图(各演示自己 onBeforeUnmount destroy()),来回切不会漏画布。
8
+ *
9
+ * 外壳只管「怎么找演示」:页签按 DEMO_GROUPS 分组、每句说明旁边给一条对应文档的直达链接、
10
+ * 地址栏可点播(`?demo=labels`)、记不住地址就接着上次看的(localStorage),
11
+ * 键盘 `[` / `]` 前后翻页签(焦点在输入框里时不抢键)。
12
+ */
13
+ import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue'
14
+ import { DEFAULT_DEMO_ID, DEMO_GROUPS, DEMOS } from './demos.js'
15
+
16
+ const publicBase = String(import.meta.env?.BASE_URL ?? '/').replace(/\/?$/, '/')
17
+ /** 外壳顶部的五个常驻入口:看文档、查 API、跑步进代码、看拆解、跑自测,都不用先离开当前演示 */
18
+ const quickLinks = [
19
+ { label: '文档中心', href: `${publicBase}docs/index.html`, title: '按章节阅读全部文档' },
20
+ { label: 'API 速查', href: `${publicBase}docs/api/index.html`, title: '搜索实例方法、属性与 options' },
21
+ { label: '调试页', href: `${publicBase}docs/playground/index.html`, title: '在可运行实例上改代码' },
22
+ { label: '分步演示', href: `${publicBase}docs/steps/index.html`, title: '从空画布到完整组件的十三步' },
23
+ { label: '自测', href: `${publicBase}docs/steps/selftest-demos.html`, title: '打开演示页的 PASS / FAIL 清单' }
24
+ ]
25
+
26
+ /** 地址栏可以点播:`?demo=labels` 直接进标签演示(文档里给链接、自测页切页签都靠它) */
27
+ const requestedId = typeof window === 'undefined' ? '' : new URLSearchParams(window.location.search).get('demo')
28
+ /** 上次看过的演示:地址栏没点播时接着它;读不出来(隐私模式 / 禁掉存储)就当没记过 */
29
+ const DEMO_STORAGE_KEY = 'gis-view:last-demo'
30
+ const storedId = (() => {
31
+ try {
32
+ return window.localStorage.getItem(DEMO_STORAGE_KEY) ?? ''
33
+ }
34
+ catch {
35
+ return ''
36
+ }
37
+ })()
38
+ const currentId = ref(
39
+ DEMOS.some(item => item.id === requestedId) ? requestedId
40
+ : DEMOS.some(item => item.id === storedId) ? storedId
41
+ : DEFAULT_DEMO_ID
42
+ )
43
+ const current = computed(() => DEMOS.find(item => item.id === currentId.value) ?? DEMOS[0])
44
+ const currentIndex = computed(() => Math.max(0, DEMOS.findIndex(item => item.id === current.value.id)))
45
+ const currentGroup = computed(() => DEMO_GROUPS.find(group => group.id === current.value.group) ?? DEMO_GROUPS[0])
46
+ /** 上一个 / 下一步:按钮与键盘共用,到了头尾就绕回另一端 */
47
+ const stepDemo = (step) => {
48
+ const next = DEMOS[(currentIndex.value + step + DEMOS.length) % DEMOS.length]
49
+ currentId.value = next.id
50
+ }
51
+ /** 按 DEMO_GROUPS 的次序把演示分组:外壳一个循环画出「组名 + 组里的页签」 */
52
52
  const groupedDemos = computed(() => DEMO_GROUPS
53
53
  .map(group => ({ ...group, items: DEMOS.filter(item => item.group === group.id) }))
54
54
  .filter(group => group.items.length > 0))
@@ -143,48 +143,48 @@ const retryCurrent = () => {
143
143
  moduleCache.delete(currentId.value)
144
144
  loadCurrent()
145
145
  }
146
-
147
- /** 组件自己报一句读数(比如「已加载 N 个节点」):外壳只负责显示,不掺和演示内部 */
148
- const notice = ref('')
149
- const notify = (text) => {
150
- notice.value = text ?? ''
151
- }
152
- // 切演示时把上一份的读数清掉,免得看着像新演示报的
153
- watch(currentId, () => { notice.value = '' })
154
-
155
- // 切页签时把当前演示写进地址栏:刷新 / 分享链接还停在同一个演示上
156
- watch(currentId, (id) => {
157
- if (typeof window === 'undefined') {
158
- return
159
- }
160
- const url = new URL(window.location.href)
161
- url.searchParams.set('demo', id)
162
- window.history.replaceState(null, '', url)
163
- try {
164
- window.localStorage.setItem(DEMO_STORAGE_KEY, id)
165
- }
166
- catch {
167
- // 存不了就算了:只是少一次「接着上次看」的回忆
168
- }
169
- }, { immediate: true })
170
- /**
171
- * 键盘翻页签:`[` / `]` 前后一个(到头绕回)。焦点在输入框 / 可编辑元素里时不抢键 ——
172
- * 演示面板里到处是输入框,抢键会让「打一个方括号」变成切演示。
173
- */
174
- const handleDemoKeys = (event) => {
175
- if (event.defaultPrevented || event.ctrlKey || event.metaKey || event.altKey) {
176
- return
177
- }
178
- if (event.key !== '[' && event.key !== ']') {
179
- return
180
- }
181
- const target = event.target
182
- if (target instanceof HTMLElement && (target.isContentEditable || target.closest('input, textarea, select'))) {
183
- return
184
- }
185
- const step = event.key === ']' ? 1 : -1
186
- stepDemo(step)
187
- }
146
+
147
+ /** 组件自己报一句读数(比如「已加载 N 个节点」):外壳只负责显示,不掺和演示内部 */
148
+ const notice = ref('')
149
+ const notify = (text) => {
150
+ notice.value = text ?? ''
151
+ }
152
+ // 切演示时把上一份的读数清掉,免得看着像新演示报的
153
+ watch(currentId, () => { notice.value = '' })
154
+
155
+ // 切页签时把当前演示写进地址栏:刷新 / 分享链接还停在同一个演示上
156
+ watch(currentId, (id) => {
157
+ if (typeof window === 'undefined') {
158
+ return
159
+ }
160
+ const url = new URL(window.location.href)
161
+ url.searchParams.set('demo', id)
162
+ window.history.replaceState(null, '', url)
163
+ try {
164
+ window.localStorage.setItem(DEMO_STORAGE_KEY, id)
165
+ }
166
+ catch {
167
+ // 存不了就算了:只是少一次「接着上次看」的回忆
168
+ }
169
+ }, { immediate: true })
170
+ /**
171
+ * 键盘翻页签:`[` / `]` 前后一个(到头绕回)。焦点在输入框 / 可编辑元素里时不抢键 ——
172
+ * 演示面板里到处是输入框,抢键会让「打一个方括号」变成切演示。
173
+ */
174
+ const handleDemoKeys = (event) => {
175
+ if (event.defaultPrevented || event.ctrlKey || event.metaKey || event.altKey) {
176
+ return
177
+ }
178
+ if (event.key !== '[' && event.key !== ']') {
179
+ return
180
+ }
181
+ const target = event.target
182
+ if (target instanceof HTMLElement && (target.isContentEditable || target.closest('input, textarea, select'))) {
183
+ return
184
+ }
185
+ const step = event.key === ']' ? 1 : -1
186
+ stepDemo(step)
187
+ }
188
188
  onMounted(() => window.addEventListener('keydown', handleDemoKeys))
189
189
  onBeforeUnmount(() => {
190
190
  requestSeq += 1
@@ -220,44 +220,44 @@ onBeforeUnmount(() => {
220
220
  :class="{ 'demo-shell__group--active': group.id === currentGroup.id }"
221
221
  >
222
222
  <button
223
- v-for="item in group.items"
224
- :key="item.id"
225
- type="button"
226
- class="demo-shell__tab"
227
- :class="{ 'demo-shell__tab--active': item.id === currentId }"
228
- :aria-current="item.id === currentId ? 'page' : undefined"
229
- :title="item.blurb"
230
- @click="currentId = item.id"
231
- >
223
+ v-for="item in group.items"
224
+ :key="item.id"
225
+ type="button"
226
+ class="demo-shell__tab"
227
+ :class="{ 'demo-shell__tab--active': item.id === currentId }"
228
+ :aria-current="item.id === currentId ? 'page' : undefined"
229
+ :title="item.blurb"
230
+ @click="currentId = item.id"
231
+ >
232
232
  {{ item.title }}
233
233
  </button>
234
234
  </div>
235
- </nav>
236
- <div class="demo-shell__quick" aria-label="快捷入口">
237
- <span class="demo-shell__quick-label">快速入口</span>
238
- <a
239
- v-for="link in quickLinks"
240
- :key="link.href"
241
- class="demo-shell__quick-link"
242
- :href="link.href"
243
- :title="link.title"
244
- target="_blank"
245
- rel="noreferrer"
246
- >{{ link.label }}</a>
247
- </div>
248
- </div>
249
- <p class="demo-shell__blurb">
250
- <span class='demo-shell__eyebrow'>{{ currentGroup.label }} · {{ currentIndex + 1 }} / {{ DEMOS.length }}</span>
251
- <strong>{{ current.title }}</strong>
252
- <span>{{ current.blurb }}</span>
253
- <span class='demo-shell__step'>
254
- <button type='button' class='demo-shell__step-btn' data-demo='demo-prev' title='上一个演示([)' @click='stepDemo(-1)'>← 上一项</button>
255
- <button type='button' class='demo-shell__step-btn' data-demo='demo-next' title='下一个演示(])' @click='stepDemo(1)'>下一项 →</button>
256
- </span>
257
- <span v-if="notice" class="demo-shell__notice">{{ notice }}</span>
258
- <a class="demo-shell__doc" :href="current.doc.href" target="_blank" rel="noreferrer">对应文档 · {{ current.doc.label }}</a>
259
- <span class="demo-shell__keys">[ / ] 切换</span>
260
- </p>
235
+ </nav>
236
+ <div class="demo-shell__quick" aria-label="快捷入口">
237
+ <span class="demo-shell__quick-label">快速入口</span>
238
+ <a
239
+ v-for="link in quickLinks"
240
+ :key="link.href"
241
+ class="demo-shell__quick-link"
242
+ :href="link.href"
243
+ :title="link.title"
244
+ target="_blank"
245
+ rel="noreferrer"
246
+ >{{ link.label }}</a>
247
+ </div>
248
+ </div>
249
+ <p class="demo-shell__blurb">
250
+ <span class='demo-shell__eyebrow'>{{ currentGroup.label }} · {{ currentIndex + 1 }} / {{ DEMOS.length }}</span>
251
+ <strong>{{ current.title }}</strong>
252
+ <span>{{ current.blurb }}</span>
253
+ <span class='demo-shell__step'>
254
+ <button type='button' class='demo-shell__step-btn' data-demo='demo-prev' title='上一个演示([)' @click='stepDemo(-1)'>← 上一项</button>
255
+ <button type='button' class='demo-shell__step-btn' data-demo='demo-next' title='下一个演示(])' @click='stepDemo(1)'>下一项 →</button>
256
+ </span>
257
+ <span v-if="notice" class="demo-shell__notice">{{ notice }}</span>
258
+ <a class="demo-shell__doc" :href="current.doc.href" target="_blank" rel="noreferrer">对应文档 · {{ current.doc.label }}</a>
259
+ <span class="demo-shell__keys">[ / ] 切换</span>
260
+ </p>
261
261
  <component :is="loaded" v-if="loaded" :key="current.id" @notice="notify" />
262
262
  <p v-else-if="loading" class="demo-shell__loading" aria-live="polite">
263
263
  <span class="demo-shell__spinner" aria-hidden="true"></span>
@@ -271,31 +271,31 @@ onBeforeUnmount(() => {
271
271
  </div>
272
272
  </section>
273
273
  </template>
274
-
275
- <style scoped>
276
- .demo-shell {
277
- min-width: 0;
278
- max-width: 100%;
279
- }
280
-
281
- .demo-shell__sticky {
282
- position: sticky;
283
- top: 0;
284
- z-index: 20;
285
- display: flex;
286
- flex-direction: column;
287
- gap: 6px;
288
- min-width: 0;
289
- max-width: 100%;
290
- margin: -4px -10px 9px;
291
- padding: 8px 10px 9px;
292
- border: 1px solid rgba(214, 224, 236, 0.9);
293
- border-radius: 10px;
294
- background: rgba(244, 247, 251, 0.94);
295
- box-shadow: 0 6px 22px rgba(31, 62, 105, 0.1);
296
- backdrop-filter: blur(10px);
297
- }
298
-
274
+
275
+ <style scoped>
276
+ .demo-shell {
277
+ min-width: 0;
278
+ max-width: 100%;
279
+ }
280
+
281
+ .demo-shell__sticky {
282
+ position: sticky;
283
+ top: 0;
284
+ z-index: 20;
285
+ display: flex;
286
+ flex-direction: column;
287
+ gap: 6px;
288
+ min-width: 0;
289
+ max-width: 100%;
290
+ margin: -4px -10px 9px;
291
+ padding: 8px 10px 9px;
292
+ border: 1px solid rgba(214, 224, 236, 0.9);
293
+ border-radius: 10px;
294
+ background: rgba(244, 247, 251, 0.94);
295
+ box-shadow: 0 6px 22px rgba(31, 62, 105, 0.1);
296
+ backdrop-filter: blur(10px);
297
+ }
298
+
299
299
  .demo-shell__tabs {
300
300
  display: flex;
301
301
  align-items: center;
@@ -383,37 +383,37 @@ onBeforeUnmount(() => {
383
383
  .demo-shell__group--active {
384
384
  display: flex;
385
385
  }
386
-
387
- .demo-shell__group:nth-child(1) {
388
- --demo-group: #3678bf;
389
- --demo-group-soft: #eaf2fc;
390
- }
391
-
392
- .demo-shell__group:nth-child(2) {
393
- --demo-group: #2f8668;
394
- --demo-group-soft: #e7f5ef;
395
- }
396
-
397
- .demo-shell__group:nth-child(3) {
398
- --demo-group: #7959bd;
399
- --demo-group-soft: #f0ebfb;
400
- }
401
-
402
- .demo-shell__group:nth-child(4) {
403
- --demo-group: #a86418;
404
- --demo-group-soft: #fbf1e4;
405
- }
406
-
407
- .demo-shell__group:nth-child(5) {
408
- --demo-group: #b24b5d;
409
- --demo-group-soft: #fbecef;
410
- }
411
-
412
- .demo-shell__group:nth-child(6) {
413
- --demo-group: #4c5f91;
414
- --demo-group-soft: #ebeff7;
415
- }
416
-
386
+
387
+ .demo-shell__group:nth-child(1) {
388
+ --demo-group: #3678bf;
389
+ --demo-group-soft: #eaf2fc;
390
+ }
391
+
392
+ .demo-shell__group:nth-child(2) {
393
+ --demo-group: #2f8668;
394
+ --demo-group-soft: #e7f5ef;
395
+ }
396
+
397
+ .demo-shell__group:nth-child(3) {
398
+ --demo-group: #7959bd;
399
+ --demo-group-soft: #f0ebfb;
400
+ }
401
+
402
+ .demo-shell__group:nth-child(4) {
403
+ --demo-group: #a86418;
404
+ --demo-group-soft: #fbf1e4;
405
+ }
406
+
407
+ .demo-shell__group:nth-child(5) {
408
+ --demo-group: #b24b5d;
409
+ --demo-group-soft: #fbecef;
410
+ }
411
+
412
+ .demo-shell__group:nth-child(6) {
413
+ --demo-group: #4c5f91;
414
+ --demo-group-soft: #ebeff7;
415
+ }
416
+
417
417
  .demo-shell__group-count {
418
418
  min-width: 16px;
419
419
  padding: 0 4px;
@@ -430,134 +430,134 @@ onBeforeUnmount(() => {
430
430
  background: rgba(255, 255, 255, 0.2);
431
431
  color: #fff;
432
432
  }
433
-
434
- .demo-shell__tab {
435
- padding: 7px 13px;
436
- border: 1px solid #d6e0ec;
437
- border-radius: 999px;
438
- background: #fff;
439
- color: var(--demo-group);
440
- font-size: 13px;
441
- cursor: pointer;
442
- }
443
-
444
- .demo-shell__tab:hover {
445
- background: var(--demo-group-soft);
446
- }
447
-
448
- .demo-shell__tab--active {
449
- border-color: var(--demo-group);
450
- background: var(--demo-group);
451
- color: #fff;
452
- font-weight: 600;
453
- }
454
-
455
- .demo-shell__quick {
456
- display: flex;
457
- align-items: center;
458
- flex-wrap: wrap;
459
- gap: 5px;
460
- padding-top: 6px;
461
- border-top: 1px dashed #dce6f1;
462
- }
463
-
464
- .demo-shell__quick-label {
465
- margin-right: 2px;
466
- color: #93a2b9;
467
- font-size: 11px;
468
- white-space: nowrap;
469
- }
470
-
471
- .demo-shell__quick-link {
472
- padding: 2px 8px;
473
- border-radius: 999px;
474
- background: #eaf2fc;
475
- color: #2f5e94;
476
- font-size: 11px;
477
- text-decoration: none;
478
- transition: background 0.12s ease, color 0.12s ease;
479
- }
480
-
481
- .demo-shell__quick-link:hover {
482
- background: #3678bf;
483
- color: #fff;
484
- }
485
-
486
- .demo-shell__blurb {
487
- display: flex;
488
- align-items: baseline;
489
- flex-wrap: wrap;
490
- gap: 8px;
491
- margin: 0 0 12px;
492
- color: #71809d;
493
- font-size: 13px;
494
- line-height: 1.6;
495
- }
496
-
497
- .demo-shell__blurb strong {
498
- color: #17233d;
499
- font-size: 14px;
500
- }
501
-
502
- .demo-shell__eyebrow {
503
- padding: 1px 8px;
504
- border-radius: 999px;
505
- background: #eaf2fc;
506
- color: #5a7296;
507
- font-size: 11px;
508
- line-height: 1.8;
509
- font-variant-numeric: tabular-nums;
510
- white-space: nowrap;
511
- }
512
-
513
- .demo-shell__step {
514
- display: inline-flex;
515
- gap: 4px;
516
- }
517
-
518
- .demo-shell__step-btn {
519
- padding: 2px 8px;
520
- border: 1px solid #d6e0ec;
521
- border-radius: 999px;
522
- background: #fff;
523
- color: #2f5e94;
524
- font-size: 11px;
525
- line-height: 1.7;
526
- cursor: pointer;
527
- }
528
-
529
- .demo-shell__step-btn:hover {
530
- background: #eef4fc;
531
- }
532
-
533
- .demo-shell__notice {
534
- padding: 2px 8px;
535
- border-radius: 999px;
536
- background: #eaf2fc;
537
- color: #2f5e94;
538
- font-size: 11px;
539
- }
540
-
541
- .demo-shell__doc {
542
- color: #3678bf;
543
- font-size: 12px;
544
- text-decoration: none;
545
- }
546
-
547
- .demo-shell__doc:hover {
548
- text-decoration: underline;
549
- }
550
-
551
- .demo-shell__keys {
552
- margin-left: auto;
553
- padding: 1px 8px;
554
- border: 1px solid #e2e8f1;
555
- border-radius: 999px;
556
- color: #9aa7bc;
557
- font-size: 11px;
558
- white-space: nowrap;
559
- }
560
-
433
+
434
+ .demo-shell__tab {
435
+ padding: 7px 13px;
436
+ border: 1px solid #d6e0ec;
437
+ border-radius: 999px;
438
+ background: #fff;
439
+ color: var(--demo-group);
440
+ font-size: 13px;
441
+ cursor: pointer;
442
+ }
443
+
444
+ .demo-shell__tab:hover {
445
+ background: var(--demo-group-soft);
446
+ }
447
+
448
+ .demo-shell__tab--active {
449
+ border-color: var(--demo-group);
450
+ background: var(--demo-group);
451
+ color: #fff;
452
+ font-weight: 600;
453
+ }
454
+
455
+ .demo-shell__quick {
456
+ display: flex;
457
+ align-items: center;
458
+ flex-wrap: wrap;
459
+ gap: 5px;
460
+ padding-top: 6px;
461
+ border-top: 1px dashed #dce6f1;
462
+ }
463
+
464
+ .demo-shell__quick-label {
465
+ margin-right: 2px;
466
+ color: #93a2b9;
467
+ font-size: 11px;
468
+ white-space: nowrap;
469
+ }
470
+
471
+ .demo-shell__quick-link {
472
+ padding: 2px 8px;
473
+ border-radius: 999px;
474
+ background: #eaf2fc;
475
+ color: #2f5e94;
476
+ font-size: 11px;
477
+ text-decoration: none;
478
+ transition: background 0.12s ease, color 0.12s ease;
479
+ }
480
+
481
+ .demo-shell__quick-link:hover {
482
+ background: #3678bf;
483
+ color: #fff;
484
+ }
485
+
486
+ .demo-shell__blurb {
487
+ display: flex;
488
+ align-items: baseline;
489
+ flex-wrap: wrap;
490
+ gap: 8px;
491
+ margin: 0 0 12px;
492
+ color: #71809d;
493
+ font-size: 13px;
494
+ line-height: 1.6;
495
+ }
496
+
497
+ .demo-shell__blurb strong {
498
+ color: #17233d;
499
+ font-size: 14px;
500
+ }
501
+
502
+ .demo-shell__eyebrow {
503
+ padding: 1px 8px;
504
+ border-radius: 999px;
505
+ background: #eaf2fc;
506
+ color: #5a7296;
507
+ font-size: 11px;
508
+ line-height: 1.8;
509
+ font-variant-numeric: tabular-nums;
510
+ white-space: nowrap;
511
+ }
512
+
513
+ .demo-shell__step {
514
+ display: inline-flex;
515
+ gap: 4px;
516
+ }
517
+
518
+ .demo-shell__step-btn {
519
+ padding: 2px 8px;
520
+ border: 1px solid #d6e0ec;
521
+ border-radius: 999px;
522
+ background: #fff;
523
+ color: #2f5e94;
524
+ font-size: 11px;
525
+ line-height: 1.7;
526
+ cursor: pointer;
527
+ }
528
+
529
+ .demo-shell__step-btn:hover {
530
+ background: #eef4fc;
531
+ }
532
+
533
+ .demo-shell__notice {
534
+ padding: 2px 8px;
535
+ border-radius: 999px;
536
+ background: #eaf2fc;
537
+ color: #2f5e94;
538
+ font-size: 11px;
539
+ }
540
+
541
+ .demo-shell__doc {
542
+ color: #3678bf;
543
+ font-size: 12px;
544
+ text-decoration: none;
545
+ }
546
+
547
+ .demo-shell__doc:hover {
548
+ text-decoration: underline;
549
+ }
550
+
551
+ .demo-shell__keys {
552
+ margin-left: auto;
553
+ padding: 1px 8px;
554
+ border: 1px solid #e2e8f1;
555
+ border-radius: 999px;
556
+ color: #9aa7bc;
557
+ font-size: 11px;
558
+ white-space: nowrap;
559
+ }
560
+
561
561
  .demo-shell__loading {
562
562
  display: flex;
563
563
  align-items: center;
@@ -566,10 +566,10 @@ onBeforeUnmount(() => {
566
566
  margin: 0;
567
567
  padding: 28px;
568
568
  border: 1px dashed #d6e0ec;
569
- border-radius: 10px;
570
- background: #fff;
571
- color: #8191a8;
572
- font-size: 13px;
569
+ border-radius: 10px;
570
+ background: #fff;
571
+ color: #8191a8;
572
+ font-size: 13px;
573
573
  text-align: center;
574
574
  }
575
575
 
@@ -632,11 +632,11 @@ onBeforeUnmount(() => {
632
632
  }
633
633
 
634
634
  @media (max-width: 760px) {
635
- .demo-shell__sticky {
636
- position: static;
637
- margin: -4px 0 9px;
638
- }
639
-
635
+ .demo-shell__sticky {
636
+ position: static;
637
+ margin: -4px 0 9px;
638
+ }
639
+
640
640
  .demo-shell__groups {
641
641
  flex-wrap: nowrap;
642
642
  width: 100%;
@@ -649,18 +649,18 @@ onBeforeUnmount(() => {
649
649
  }
650
650
 
651
651
  .demo-shell__tabs {
652
- flex-wrap: nowrap;
653
- width: 100%;
654
- overflow-x: auto;
655
- padding-bottom: 3px;
656
- }
657
-
658
- .demo-shell__group {
659
- flex: none;
660
- }
661
-
662
- .demo-shell__keys {
663
- margin-left: 0;
664
- }
665
- }
666
- </style>
652
+ flex-wrap: nowrap;
653
+ width: 100%;
654
+ overflow-x: auto;
655
+ padding-bottom: 3px;
656
+ }
657
+
658
+ .demo-shell__group {
659
+ flex: none;
660
+ }
661
+
662
+ .demo-shell__keys {
663
+ margin-left: 0;
664
+ }
665
+ }
666
+ </style>