@bagelink/vue 1.15.643 → 1.15.647
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Avatar.vue.d.ts.map +1 -1
- package/dist/components/Icon/Icon.vue.d.ts.map +1 -1
- package/dist/core.css +1 -1
- package/dist/index.cjs +63 -63
- package/dist/index.css +1 -1
- package/dist/index.mjs +4752 -4709
- package/dist/style.css +1 -1
- package/dist/utils/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/Avatar.vue +18 -2
- package/src/components/Icon/Icon.vue +2 -2
- package/src/utils/index.ts +38 -2
package/dist/utils/index.d.ts
CHANGED
|
@@ -5,7 +5,9 @@ export declare function keyToLabel(key?: string): string | undefined;
|
|
|
5
5
|
/**
|
|
6
6
|
* Convert stored rich-text HTML to compact plain text for tables, labels, and
|
|
7
7
|
* other read-only summaries. Block elements are separated so paragraphs do not
|
|
8
|
-
* run together.
|
|
8
|
+
* run together. HTML entities are decoded so ` `/`&` never leak into
|
|
9
|
+
* plain-text consumers (e.g. meta descriptions) — including in SSR, where no
|
|
10
|
+
* `DOMParser` is available.
|
|
9
11
|
*/
|
|
10
12
|
export declare function richTextToPlainText(value: string): string;
|
|
11
13
|
export declare function containsHtml(value: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAK1E,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,IAAI,GAAE,MAAY,QAO1D;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,UAMlC;AAED,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ3D;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -37,6 +37,21 @@ const statusColor = computed(() => (props.status === true ? 'green' : props.stat
|
|
|
37
37
|
// Dot scales with the avatar but stays within sane bounds.
|
|
38
38
|
const dotSize = computed(() => Math.max(7, Math.min(14, Math.round(resolvedSize.value * 0.28))))
|
|
39
39
|
|
|
40
|
+
/** Accessible names for the presence dot's known tones. */
|
|
41
|
+
const STATUS_LABELS: Record<string, string> = {
|
|
42
|
+
green: 'Online',
|
|
43
|
+
gray: 'Offline',
|
|
44
|
+
orange: 'Away',
|
|
45
|
+
red: 'Busy',
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// A bare <span title> is not announced by screen readers, so the dot carries a
|
|
49
|
+
// real accessible name — from `statusTitle` when given, else the tone's meaning.
|
|
50
|
+
const statusLabel = computed(() => {
|
|
51
|
+
if (!statusColor.value) { return '' }
|
|
52
|
+
return props.statusTitle || STATUS_LABELS[statusColor.value] || 'Status'
|
|
53
|
+
})
|
|
54
|
+
|
|
40
55
|
const radius = computed(() => {
|
|
41
56
|
if (!props.square) { return '1000px' } // circle (default)
|
|
42
57
|
if (props.square === true) { return 'var(--bgl-btn-border-radius)' }
|
|
@@ -59,14 +74,15 @@ const themed = computed(() => props.color
|
|
|
59
74
|
:class="innerClass"
|
|
60
75
|
:style="{ width: `${resolvedSize}px`, height: `${resolvedSize}px`, borderRadius: radius, ...themed }"
|
|
61
76
|
>
|
|
62
|
-
<Image v-if="src" :src="src" :alt="alt
|
|
77
|
+
<Image v-if="src" :src="src" :alt="alt ?? name ?? ''" />
|
|
63
78
|
<Icon v-else-if="icon" :icon="icon" :size="resolvedSize / 40" />
|
|
64
79
|
<p v-else :style="{ 'line-height': '1', 'font-size': `calc(1.5rem * ${resolvedSize} / 50)` }" class="">
|
|
65
80
|
{{ (fallback || initials(name || '')).toUpperCase() }}
|
|
66
81
|
</p>
|
|
67
82
|
</div>
|
|
68
83
|
<span
|
|
69
|
-
v-if="statusColor" class="avatar-status"
|
|
84
|
+
v-if="statusColor" class="avatar-status" role="img"
|
|
85
|
+
:aria-label="statusLabel" :title="statusLabel"
|
|
70
86
|
:style="{ width: `${dotSize}px`, height: `${dotSize}px`, background: `var(--bgl-${statusColor})` }"
|
|
71
87
|
/>
|
|
72
88
|
</div>
|
|
@@ -208,7 +208,7 @@ const iconStyle = computed(() => {
|
|
|
208
208
|
<span
|
|
209
209
|
v-if="iconRenderType === 'material'" :key="`material-${iconRender}`" class="bgl_icon-font notranslate"
|
|
210
210
|
:class="[animateClass, roundClass, roundPairClass, softClass, { 'color-white keep-white': round && !soft && isRawCssColor }]"
|
|
211
|
-
:style="iconStyle" translate="no"
|
|
211
|
+
:style="iconStyle" aria-hidden="true" translate="no"
|
|
212
212
|
>
|
|
213
213
|
{{ iconRender }}
|
|
214
214
|
</span>
|
|
@@ -225,7 +225,7 @@ const iconStyle = computed(() => {
|
|
|
225
225
|
'far': !fill && !isFaBrand,
|
|
226
226
|
'color-white keep-white': round && !soft && isRawCssColor,
|
|
227
227
|
},
|
|
228
|
-
]" :style="iconStyle"
|
|
228
|
+
]" :style="iconStyle" aria-hidden="true"
|
|
229
229
|
translate="no"
|
|
230
230
|
/>
|
|
231
231
|
</Transition>
|
package/src/utils/index.ts
CHANGED
|
@@ -32,10 +32,42 @@ export function keyToLabel(key?: string): string | undefined {
|
|
|
32
32
|
|
|
33
33
|
const plainTextCache = new Map<string, string>()
|
|
34
34
|
|
|
35
|
+
const NAMED_ENTITIES: Record<string, string> = {
|
|
36
|
+
' ': ' ',
|
|
37
|
+
'&': '&',
|
|
38
|
+
'"': '"',
|
|
39
|
+
''': "'",
|
|
40
|
+
'<': '<',
|
|
41
|
+
'>': '>',
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Decode common HTML entities in a single pass (never re-decodes `&` output,
|
|
46
|
+
* so `&lt;` stays `<` rather than collapsing to `<`).
|
|
47
|
+
*/
|
|
48
|
+
function decodeHtmlEntities(value: string): string {
|
|
49
|
+
return value.replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g, entity => {
|
|
50
|
+
if (entity in NAMED_ENTITIES) return NAMED_ENTITIES[entity]
|
|
51
|
+
const hex = /^&#x([0-9a-fA-F]+);$/.exec(entity)
|
|
52
|
+
if (hex) {
|
|
53
|
+
const code = Number.parseInt(hex[1], 16)
|
|
54
|
+
try { return String.fromCodePoint(code) } catch { return entity }
|
|
55
|
+
}
|
|
56
|
+
const dec = /^&#([0-9]+);$/.exec(entity)
|
|
57
|
+
if (dec) {
|
|
58
|
+
const code = Number.parseInt(dec[1], 10)
|
|
59
|
+
try { return String.fromCodePoint(code) } catch { return entity }
|
|
60
|
+
}
|
|
61
|
+
return entity
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
|
|
35
65
|
/**
|
|
36
66
|
* Convert stored rich-text HTML to compact plain text for tables, labels, and
|
|
37
67
|
* other read-only summaries. Block elements are separated so paragraphs do not
|
|
38
|
-
* run together.
|
|
68
|
+
* run together. HTML entities are decoded so ` `/`&` never leak into
|
|
69
|
+
* plain-text consumers (e.g. meta descriptions) — including in SSR, where no
|
|
70
|
+
* `DOMParser` is available.
|
|
39
71
|
*/
|
|
40
72
|
export function richTextToPlainText(value: string): string {
|
|
41
73
|
if (!value.includes('<') && !value.includes('&')) return value.trim()
|
|
@@ -44,7 +76,11 @@ export function richTextToPlainText(value: string): string {
|
|
|
44
76
|
if (cached !== undefined) return cached
|
|
45
77
|
|
|
46
78
|
if (typeof DOMParser === 'undefined') {
|
|
47
|
-
|
|
79
|
+
const result = decodeHtmlEntities(value.replace(/<[^>]*>/g, ' '))
|
|
80
|
+
.replace(/\s+/g, ' ')
|
|
81
|
+
.trim()
|
|
82
|
+
plainTextCache.set(value, result)
|
|
83
|
+
return result
|
|
48
84
|
}
|
|
49
85
|
|
|
50
86
|
const doc = new DOMParser().parseFromString(value, 'text/html')
|