@seed-design/react 1.0.7 → 1.1.0
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/lib/components/ActionButton/ActionButton.cjs +7 -1
- package/lib/components/ActionButton/ActionButton.d.ts +7 -1
- package/lib/components/ActionButton/ActionButton.d.ts.map +1 -1
- package/lib/components/ActionButton/ActionButton.js +7 -1
- package/lib/components/BottomSheet/BottomSheet.cjs +14 -18
- package/lib/components/BottomSheet/BottomSheet.d.ts +12 -19
- package/lib/components/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/lib/components/BottomSheet/BottomSheet.js +14 -18
- package/lib/components/BottomSheet/BottomSheet.namespace.cjs +2 -0
- package/lib/components/BottomSheet/BottomSheet.namespace.d.ts +1 -0
- package/lib/components/BottomSheet/BottomSheet.namespace.d.ts.map +1 -1
- package/lib/components/BottomSheet/BottomSheet.namespace.js +1 -0
- package/lib/components/BottomSheetHandle/BottomSheetHandle.cjs +20 -0
- package/lib/components/BottomSheetHandle/BottomSheetHandle.d.ts +6 -0
- package/lib/components/BottomSheetHandle/BottomSheetHandle.d.ts.map +1 -0
- package/lib/components/BottomSheetHandle/BottomSheetHandle.js +16 -0
- package/lib/components/BottomSheetHandle/index.cjs +9 -0
- package/lib/components/BottomSheetHandle/index.d.ts +2 -0
- package/lib/components/BottomSheetHandle/index.d.ts.map +1 -0
- package/lib/components/BottomSheetHandle/index.js +1 -0
- package/lib/components/Chip/Chip.cjs +4 -3
- package/lib/components/Chip/Chip.d.ts.map +1 -1
- package/lib/components/Chip/Chip.js +4 -3
- package/lib/components/Field/Field.cjs +108 -0
- package/lib/components/Field/Field.d.ts +41 -0
- package/lib/components/Field/Field.d.ts.map +1 -0
- package/lib/components/Field/Field.js +96 -0
- package/lib/components/Field/Field.namespace.cjs +17 -0
- package/lib/components/Field/Field.namespace.d.ts +2 -0
- package/lib/components/Field/Field.namespace.d.ts.map +1 -0
- package/lib/components/Field/Field.namespace.js +1 -0
- package/lib/components/Field/index.cjs +19 -0
- package/lib/components/Field/index.d.ts +3 -0
- package/lib/components/Field/index.d.ts.map +1 -0
- package/lib/components/Field/index.js +3 -0
- package/lib/components/FieldButton/FieldButton.cjs +201 -0
- package/lib/components/FieldButton/FieldButton.d.ts +61 -0
- package/lib/components/FieldButton/FieldButton.d.ts.map +1 -0
- package/lib/components/FieldButton/FieldButton.js +161 -0
- package/lib/components/FieldButton/FieldButton.namespace.cjs +26 -0
- package/lib/components/FieldButton/FieldButton.namespace.d.ts +2 -0
- package/lib/components/FieldButton/FieldButton.namespace.d.ts.map +1 -0
- package/lib/components/FieldButton/FieldButton.namespace.js +1 -0
- package/lib/components/FieldButton/index.cjs +28 -0
- package/lib/components/FieldButton/index.d.ts +3 -0
- package/lib/components/FieldButton/index.d.ts.map +1 -0
- package/lib/components/FieldButton/index.js +3 -0
- package/lib/components/HelpBubble/HelpBubble.d.ts +1 -1
- package/lib/components/List/List.cjs +5 -4
- package/lib/components/List/List.d.ts.map +1 -1
- package/lib/components/List/List.js +5 -4
- package/lib/components/PageBanner/PageBanner.cjs +8 -3
- package/lib/components/PageBanner/PageBanner.d.ts +5 -2
- package/lib/components/PageBanner/PageBanner.d.ts.map +1 -1
- package/lib/components/PageBanner/PageBanner.js +7 -3
- package/lib/components/PageBanner/PageBanner.namespace.cjs +2 -1
- package/lib/components/PageBanner/PageBanner.namespace.d.ts +1 -1
- package/lib/components/PageBanner/PageBanner.namespace.d.ts.map +1 -1
- package/lib/components/PageBanner/PageBanner.namespace.js +1 -1
- package/lib/components/PageBanner/index.cjs +2 -1
- package/lib/components/PageBanner/index.d.ts +1 -1
- package/lib/components/PageBanner/index.d.ts.map +1 -1
- package/lib/components/PageBanner/index.js +1 -1
- package/lib/components/Slider/Slider.cjs +110 -0
- package/lib/components/Slider/Slider.d.ts +51 -0
- package/lib/components/Slider/Slider.d.ts.map +1 -0
- package/lib/components/Slider/Slider.js +94 -0
- package/lib/components/Slider/Slider.namespace.cjs +21 -0
- package/lib/components/Slider/Slider.namespace.d.ts +2 -0
- package/lib/components/Slider/Slider.namespace.d.ts.map +1 -0
- package/lib/components/Slider/Slider.namespace.js +1 -0
- package/lib/components/Slider/index.cjs +23 -0
- package/lib/components/Slider/index.d.ts +3 -0
- package/lib/components/Slider/index.d.ts.map +1 -0
- package/lib/components/Slider/index.js +3 -0
- package/lib/components/TextField/TextField.cjs +54 -74
- package/lib/components/TextField/TextField.d.ts +2 -35
- package/lib/components/TextField/TextField.d.ts.map +1 -1
- package/lib/components/TextField/TextField.js +56 -65
- package/lib/components/TextField/TextField.namespace.cjs +0 -11
- package/lib/components/TextField/TextField.namespace.d.ts +1 -1
- package/lib/components/TextField/TextField.namespace.d.ts.map +1 -1
- package/lib/components/TextField/TextField.namespace.js +1 -1
- package/lib/components/TextField/TextField.test.d.ts +1 -0
- package/lib/components/TextField/TextField.test.d.ts.map +1 -0
- package/lib/components/TextField/index.cjs +2 -11
- package/lib/components/TextField/index.d.ts +2 -1
- package/lib/components/TextField/index.d.ts.map +1 -1
- package/lib/components/TextField/index.js +2 -1
- package/lib/components/TextField/memoize.cjs +18 -0
- package/lib/components/TextField/memoize.d.ts +2 -0
- package/lib/components/TextField/memoize.d.ts.map +1 -0
- package/lib/components/TextField/memoize.js +14 -0
- package/lib/components/TextField/useTextFieldWithGraphemes.cjs +52 -0
- package/lib/components/TextField/useTextFieldWithGraphemes.d.ts +23 -0
- package/lib/components/TextField/useTextFieldWithGraphemes.d.ts.map +1 -0
- package/lib/components/TextField/useTextFieldWithGraphemes.js +48 -0
- package/lib/components/TextField/useTextFieldWithGraphemes.test.d.ts +1 -0
- package/lib/components/TextField/useTextFieldWithGraphemes.test.d.ts.map +1 -0
- package/lib/components/index.cjs +53 -12
- package/lib/components/index.d.ts +3 -0
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/index.js +12 -2
- package/lib/index.cjs +53 -12
- package/lib/index.js +12 -2
- package/lib/node_modules/unicode-segmenter/_grapheme_data.cjs +23 -0
- package/lib/node_modules/unicode-segmenter/_grapheme_data.js +19 -0
- package/lib/node_modules/unicode-segmenter/_incb_data.cjs +29 -0
- package/lib/node_modules/unicode-segmenter/_incb_data.js +25 -0
- package/lib/node_modules/unicode-segmenter/core.cjs +83 -0
- package/lib/node_modules/unicode-segmenter/core.js +78 -0
- package/lib/node_modules/unicode-segmenter/grapheme.cjs +312 -0
- package/lib/node_modules/unicode-segmenter/grapheme.js +307 -0
- package/lib/primitive.cjs +7 -0
- package/lib/primitive.d.ts +1 -0
- package/lib/primitive.d.ts.map +1 -1
- package/lib/primitive.js +1 -0
- package/lib/utils/createWithStateProps.cjs +8 -4
- package/lib/utils/createWithStateProps.d.ts +6 -3
- package/lib/utils/createWithStateProps.d.ts.map +1 -1
- package/lib/utils/createWithStateProps.js +8 -4
- package/package.json +9 -6
- package/src/components/ActionButton/ActionButton.tsx +21 -2
- package/src/components/BottomSheet/BottomSheet.namespace.ts +5 -0
- package/src/components/BottomSheet/BottomSheet.tsx +24 -38
- package/src/components/BottomSheetHandle/BottomSheetHandle.tsx +22 -0
- package/src/components/BottomSheetHandle/index.ts +1 -0
- package/src/components/Chip/Chip.tsx +4 -3
- package/src/components/Field/Field.namespace.ts +19 -0
- package/src/components/Field/Field.tsx +136 -0
- package/src/components/Field/index.ts +21 -0
- package/src/components/FieldButton/FieldButton.namespace.ts +38 -0
- package/src/components/FieldButton/FieldButton.tsx +249 -0
- package/src/components/FieldButton/index.ts +40 -0
- package/src/components/HelpBubble/HelpBubble.tsx +1 -1
- package/src/components/List/List.tsx +5 -4
- package/src/components/PageBanner/PageBanner.namespace.ts +4 -2
- package/src/components/PageBanner/PageBanner.tsx +10 -3
- package/src/components/PageBanner/index.ts +4 -2
- package/src/components/Slider/Slider.namespace.ts +28 -0
- package/src/components/Slider/Slider.tsx +154 -0
- package/src/components/Slider/index.ts +30 -0
- package/src/components/TextField/TextField.namespace.ts +2 -24
- package/src/components/TextField/TextField.test.tsx +260 -0
- package/src/components/TextField/TextField.tsx +67 -143
- package/src/components/TextField/index.ts +7 -24
- package/src/components/TextField/memoize.ts +14 -0
- package/src/components/TextField/useTextFieldWithGraphemes.test.tsx +301 -0
- package/src/components/TextField/useTextFieldWithGraphemes.ts +65 -0
- package/src/components/index.ts +3 -0
- package/src/primitive.ts +1 -0
- package/src/utils/createWithStateProps.tsx +14 -9
- package/lib/components/List/ListHeader.namespace.d.ts +0 -2
- package/lib/components/List/ListHeader.namespace.d.ts.map +0 -1
- package/src/components/List/ListHeader.namespace.ts +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
// @ts-check
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @template {number} [T=number]
|
|
6
|
+
* @typedef {[from: number, to: number, category: T]} CategorizedUnicodeRange
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {CategorizedUnicodeRange<0>} UnicodeRange
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @typedef {string & { __tag: 'UnicodeDataEncoding' }} UnicodeDataEncoding
|
|
15
|
+
*
|
|
16
|
+
* Encoding for array of {@link UnicodeRange}, items separated by comma.
|
|
17
|
+
*
|
|
18
|
+
* Each {@link UnicodeDataRow} packed as a base36 integer:
|
|
19
|
+
*
|
|
20
|
+
* padding = to - from
|
|
21
|
+
* encoding = base36(from) + ',' + base36(padding)
|
|
22
|
+
*
|
|
23
|
+
* Notes:
|
|
24
|
+
* - base36 can hold surprisingly large numbers in a few characters.
|
|
25
|
+
* - The biggest codepoint is 0xE01F0 (918,000) at this point
|
|
26
|
+
* - The max value of a category is 23; https://www.unicode.org/reports/tr29/tr29-45.html#Table_Word_Break_Property_Values
|
|
27
|
+
* - The longest range is 42,720; CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @template {number} [T=number]
|
|
32
|
+
* @param {UnicodeDataEncoding} data
|
|
33
|
+
* @param {string} [cats='']
|
|
34
|
+
* @returns {Array<CategorizedUnicodeRange<T>>}
|
|
35
|
+
*/
|
|
36
|
+
function decodeUnicodeData(data, cats = '') {
|
|
37
|
+
let buf = /** @type {Array<CategorizedUnicodeRange<T>>} */([])
|
|
38
|
+
, nums = data.split(',').map(s => s ? parseInt(s, 36) : 0)
|
|
39
|
+
, n = 0;
|
|
40
|
+
for (let i = 0; i < nums.length; i++)
|
|
41
|
+
i % 2
|
|
42
|
+
? buf.push([n, n + nums[i], /** @type {T} */ (cats ? parseInt(cats[i >> 1], 36) : 0)])
|
|
43
|
+
: n = nums[i];
|
|
44
|
+
return buf;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @template {object} Ext
|
|
49
|
+
* @typedef {{
|
|
50
|
+
* segment: string,
|
|
51
|
+
* index: number,
|
|
52
|
+
* input: string,
|
|
53
|
+
* } & Ext} SegmentOutput
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @template {object} T
|
|
58
|
+
* @typedef {IterableIterator<SegmentOutput<T>>} Segmenter
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @template {number} [T=number]
|
|
63
|
+
* @param {number} cp
|
|
64
|
+
* @param {CategorizedUnicodeRange<T>[]} ranges
|
|
65
|
+
* @return {number} index of matched unicode range, or -1 if no match
|
|
66
|
+
*/
|
|
67
|
+
function findUnicodeRangeIndex(cp, ranges, lo = 0, hi = ranges.length - 1) {
|
|
68
|
+
while (lo <= hi) {
|
|
69
|
+
let mid = lo + hi >>> 1
|
|
70
|
+
, range = ranges[mid];
|
|
71
|
+
if (cp < range[0]) hi = mid - 1;
|
|
72
|
+
else if (cp > range[1]) lo = mid + 1;
|
|
73
|
+
else return mid;
|
|
74
|
+
}
|
|
75
|
+
return -1;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { decodeUnicodeData, findUnicodeRangeIndex };
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
5
|
+
|
|
6
|
+
const core = require('./core.cjs');
|
|
7
|
+
const _grapheme_data = require('./_grapheme_data.cjs');
|
|
8
|
+
const _incb_data = require('./_incb_data.cjs');
|
|
9
|
+
|
|
10
|
+
// Copyright 2012-2018 The Rust Project Developers. See the COPYRIGHT
|
|
11
|
+
// file at the top-level directory of this distribution and at
|
|
12
|
+
// http://rust-lang.org/COPYRIGHT.
|
|
13
|
+
//
|
|
14
|
+
// Licensed under the MIT license
|
|
15
|
+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>.
|
|
16
|
+
//
|
|
17
|
+
// Modified original Rust library [source code]
|
|
18
|
+
// (https://github.com/unicode-rs/unicode-segmentation/blob/1f88570/src/grapheme.rs)
|
|
19
|
+
//
|
|
20
|
+
// to create JavaScript library [unicode-segmenter]
|
|
21
|
+
// (https://github.com/cometkim/unicode-segmenter)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
const BMP_MAX = 0xFFFF;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Unicode segmentation by extended grapheme rules.
|
|
28
|
+
*
|
|
29
|
+
* This is fully compatible with the {@link Intl.Segmenter.segment} API
|
|
30
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/segment
|
|
31
|
+
*
|
|
32
|
+
* @param {string} input
|
|
33
|
+
* @return {GraphemeSegmenter} iterator for grapheme cluster segments
|
|
34
|
+
*/
|
|
35
|
+
function* graphemeSegments(input) {
|
|
36
|
+
let cp = input.codePointAt(0);
|
|
37
|
+
|
|
38
|
+
// do nothing on empty string
|
|
39
|
+
if (cp == null) return;
|
|
40
|
+
|
|
41
|
+
/** Current cursor position. */
|
|
42
|
+
let cursor = cp <= BMP_MAX ? 1 : 2;
|
|
43
|
+
|
|
44
|
+
/** Total length of the input string. */
|
|
45
|
+
let len = input.length;
|
|
46
|
+
|
|
47
|
+
/** @type {import('./_grapheme_data.js').GraphemeCategoryRange} */
|
|
48
|
+
let cache = [0, 0, 2 /* GC_Control */];
|
|
49
|
+
|
|
50
|
+
/** Category of codepoint immediately preceding cursor */
|
|
51
|
+
let catBefore = cat(cp, cache);
|
|
52
|
+
|
|
53
|
+
/** @type {GraphemeCategoryNum | null} Category of codepoint immediately preceding cursor. */
|
|
54
|
+
let catAfter = null;
|
|
55
|
+
|
|
56
|
+
/** The number of RIS codepoints preceding `cursor`. */
|
|
57
|
+
let risCount = 0;
|
|
58
|
+
|
|
59
|
+
/** Emoji state */
|
|
60
|
+
let emoji = false;
|
|
61
|
+
|
|
62
|
+
/** InCB=Consonant */
|
|
63
|
+
let consonant = false;
|
|
64
|
+
|
|
65
|
+
/** InCB=Linker */
|
|
66
|
+
let linker = false;
|
|
67
|
+
|
|
68
|
+
/** InCB=Consonant InCB=Linker x InCB=Consonant */
|
|
69
|
+
let incb = false;
|
|
70
|
+
|
|
71
|
+
let index = 0;
|
|
72
|
+
|
|
73
|
+
/** Beginning category of a segment */
|
|
74
|
+
let _catBegin = catBefore;
|
|
75
|
+
|
|
76
|
+
/** Memoize the beginnig code point a the segment. */
|
|
77
|
+
let _hd = cp;
|
|
78
|
+
|
|
79
|
+
while (cursor < len) {
|
|
80
|
+
// Note: Lazily update `consonant` and `linker` state
|
|
81
|
+
// which is a extra overhead only for Hindi text.
|
|
82
|
+
if (cp >= 2325) {
|
|
83
|
+
if (!consonant && catBefore === 0) {
|
|
84
|
+
consonant = isIndicConjunctConsonant(cp);
|
|
85
|
+
} else if (catBefore === 3 /* Extend */) {
|
|
86
|
+
// Note: \p{InCB=Linker} is a subset of \p{Extend}
|
|
87
|
+
linker = isIndicConjunctLinker(cp);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
cp = /** @type {number} */ (input.codePointAt(cursor));
|
|
92
|
+
catAfter = cat(cp, cache);
|
|
93
|
+
|
|
94
|
+
if (catBefore === 10 /* Regional_Indicator */) {
|
|
95
|
+
risCount++;
|
|
96
|
+
} else {
|
|
97
|
+
risCount = 0;
|
|
98
|
+
if (
|
|
99
|
+
catAfter === 14 /* ZWJ */
|
|
100
|
+
&& (catBefore === 3 /* Extend */ || catBefore === 4 /* Extended_Pictographic */)
|
|
101
|
+
) {
|
|
102
|
+
emoji = true;
|
|
103
|
+
|
|
104
|
+
} else if (catAfter === 0 /* Any */ && cp >= 2325) {
|
|
105
|
+
// Note: Put GB9c rule checking here to reduce.
|
|
106
|
+
incb = consonant && linker && (consonant = isIndicConjunctConsonant(cp));
|
|
107
|
+
// It cannot be both a linker and a consonant.
|
|
108
|
+
linker = linker && !consonant;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (isBoundary(catBefore, catAfter, risCount, emoji, incb)) {
|
|
113
|
+
yield {
|
|
114
|
+
segment: input.slice(index, cursor),
|
|
115
|
+
index,
|
|
116
|
+
input,
|
|
117
|
+
_hd,
|
|
118
|
+
_catBegin,
|
|
119
|
+
_catEnd: catBefore,
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// flush
|
|
123
|
+
emoji = false;
|
|
124
|
+
incb = false;
|
|
125
|
+
index = cursor;
|
|
126
|
+
_catBegin = catAfter;
|
|
127
|
+
_hd = cp;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
cursor += cp <= BMP_MAX ? 1 : 2;
|
|
131
|
+
catBefore = catAfter;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (index < len) {
|
|
135
|
+
yield {
|
|
136
|
+
segment: input.slice(index),
|
|
137
|
+
index,
|
|
138
|
+
input,
|
|
139
|
+
_hd,
|
|
140
|
+
_catBegin,
|
|
141
|
+
_catEnd: catBefore,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Split given text into extended grapheme clusters.
|
|
148
|
+
*
|
|
149
|
+
* @param {string} text
|
|
150
|
+
* @return {IterableIterator<string>} iterator for grapheme clusters
|
|
151
|
+
*
|
|
152
|
+
* @see {@link graphemeSegments} if you need extra information.
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* [...splitGraphemes('abc')] // => ['a', 'b', 'c']
|
|
156
|
+
*/
|
|
157
|
+
function* splitGraphemes(text) {
|
|
158
|
+
for (let s of graphemeSegments(text)) yield s.segment;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Precompute a fast lookup table for BMP code points (0..0xFFFF)
|
|
163
|
+
* This table maps each code point to its Grapheme_Cluster_Break category.
|
|
164
|
+
* It is generated once at module load time using the grapheme_ranges data.
|
|
165
|
+
* The table is a Uint8Array of length 0x10000 (64KB), which is acceptable in memory.
|
|
166
|
+
* For code points >= 0x10000 we fall back to binary search.
|
|
167
|
+
*/
|
|
168
|
+
let bmpLookup = new Uint8Array(BMP_MAX + 1);
|
|
169
|
+
let bmpCursor = (() => {
|
|
170
|
+
let cursor = 0;
|
|
171
|
+
let cp = 0;
|
|
172
|
+
while (cp <= BMP_MAX) {
|
|
173
|
+
let range = _grapheme_data.grapheme_ranges[cursor++];
|
|
174
|
+
for (cp = range[0]; cp <= range[1]; cp++) {
|
|
175
|
+
bmpLookup[cp] = range[2];
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return cursor;
|
|
179
|
+
})();
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* `Grapheme_Cluster_Break` property value of a given codepoint
|
|
183
|
+
*
|
|
184
|
+
* @see https://www.unicode.org/reports/tr29/tr29-43.html#Default_Grapheme_Cluster_Table
|
|
185
|
+
*
|
|
186
|
+
* @param {number} cp
|
|
187
|
+
* @param {import('./_grapheme_data.js').GraphemeCategoryRange} cache
|
|
188
|
+
* @return {GraphemeCategoryNum}
|
|
189
|
+
*/
|
|
190
|
+
function cat(cp, cache) {
|
|
191
|
+
// Fast lookup for BMP (0x0000..0xFFFF) using precomputed table
|
|
192
|
+
if (cp <= BMP_MAX) {
|
|
193
|
+
return /** @type {GraphemeCategoryNum} */ (bmpLookup[cp]);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Use cached result
|
|
197
|
+
if (cp >= cache[0] && cp <= cache[1]) {
|
|
198
|
+
return cache[2];
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Binary search, starting from bmpCursor
|
|
202
|
+
let index = core.findUnicodeRangeIndex(cp, _grapheme_data.grapheme_ranges, bmpCursor);
|
|
203
|
+
if (index < 0) {
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const range = _grapheme_data.grapheme_ranges[index];
|
|
208
|
+
cache[0] = range[0];
|
|
209
|
+
cache[1] = range[1];
|
|
210
|
+
return (cache[2] = range[2]);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* @param {number} cp
|
|
214
|
+
* @return {boolean}
|
|
215
|
+
*/
|
|
216
|
+
function isIndicConjunctConsonant(cp) {
|
|
217
|
+
return core.findUnicodeRangeIndex(cp, _incb_data.consonant_ranges) >= 0;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* @param {number} cp
|
|
222
|
+
* @return {boolean}
|
|
223
|
+
*/
|
|
224
|
+
function isIndicConjunctLinker(cp) {
|
|
225
|
+
return (
|
|
226
|
+
cp === 2381 /* 0x094D */ ||
|
|
227
|
+
cp === 2509 /* 0x09CD */ ||
|
|
228
|
+
cp === 2765 /* 0x0ACD */ ||
|
|
229
|
+
cp === 2893 /* 0x0B4D */ ||
|
|
230
|
+
cp === 3149 /* 0x0C4D */ ||
|
|
231
|
+
cp === 3405 /* 0x0D4D */
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* @param {GraphemeCategoryNum} catBefore
|
|
237
|
+
* @param {GraphemeCategoryNum} catAfter
|
|
238
|
+
* @param {number} risCount Regional_Indicator state
|
|
239
|
+
* @param {boolean} emoji Extended_Pictographic state
|
|
240
|
+
* @param {boolean} incb Indic_Conjunct_Break state
|
|
241
|
+
* @return {boolean}
|
|
242
|
+
*
|
|
243
|
+
* @see https://www.unicode.org/reports/tr29/tr29-43.html#Grapheme_Cluster_Boundary_Rules
|
|
244
|
+
*/
|
|
245
|
+
function isBoundary(catBefore, catAfter, risCount, emoji, incb) {
|
|
246
|
+
// GB3
|
|
247
|
+
if (catBefore === 1 && catAfter === 6) {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// GB4
|
|
252
|
+
if (catBefore === 1 || catBefore === 2 || catBefore === 6) {
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// GB5
|
|
257
|
+
if (catAfter === 1 || catAfter === 2 || catAfter === 6) {
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Most common cases - GB9, GB9a extend rules
|
|
262
|
+
if (catAfter === 3 || catAfter === 14 || catAfter === 11) {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// GB6 - L x (L | V | LV | LVT)
|
|
267
|
+
if (catBefore === 5) {
|
|
268
|
+
return !(catAfter === 5 || catAfter === 7 || catAfter === 8 || catAfter === 13);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// GB7 - (LV | V) x (V | T)
|
|
272
|
+
if (
|
|
273
|
+
(catBefore === 7 || catBefore === 13) &&
|
|
274
|
+
(catAfter === 13 || catAfter === 12)
|
|
275
|
+
) {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// GB8 - (LVT | T) x T
|
|
280
|
+
if (
|
|
281
|
+
(catBefore === 8 || catBefore === 12) &&
|
|
282
|
+
catAfter === 12
|
|
283
|
+
) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// GB9b
|
|
288
|
+
if (catBefore === 9) {
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// GB9c
|
|
293
|
+
if (catAfter === 0 && incb) {
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// GB11
|
|
298
|
+
if (catBefore === 14 && catAfter === 4) {
|
|
299
|
+
return !emoji;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// GB12, GB13
|
|
303
|
+
if (catBefore === 10 && catAfter === 10) {
|
|
304
|
+
return risCount % 2 === 0;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// GB999
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
exports.graphemeSegments = graphemeSegments;
|
|
312
|
+
exports.splitGraphemes = splitGraphemes;
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { findUnicodeRangeIndex } from './core.js';
|
|
3
|
+
import { grapheme_ranges } from './_grapheme_data.js';
|
|
4
|
+
import { consonant_ranges } from './_incb_data.js';
|
|
5
|
+
|
|
6
|
+
// Copyright 2012-2018 The Rust Project Developers. See the COPYRIGHT
|
|
7
|
+
// file at the top-level directory of this distribution and at
|
|
8
|
+
// http://rust-lang.org/COPYRIGHT.
|
|
9
|
+
//
|
|
10
|
+
// Licensed under the MIT license
|
|
11
|
+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>.
|
|
12
|
+
//
|
|
13
|
+
// Modified original Rust library [source code]
|
|
14
|
+
// (https://github.com/unicode-rs/unicode-segmentation/blob/1f88570/src/grapheme.rs)
|
|
15
|
+
//
|
|
16
|
+
// to create JavaScript library [unicode-segmenter]
|
|
17
|
+
// (https://github.com/cometkim/unicode-segmenter)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
const BMP_MAX = 0xFFFF;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Unicode segmentation by extended grapheme rules.
|
|
24
|
+
*
|
|
25
|
+
* This is fully compatible with the {@link Intl.Segmenter.segment} API
|
|
26
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/segment
|
|
27
|
+
*
|
|
28
|
+
* @param {string} input
|
|
29
|
+
* @return {GraphemeSegmenter} iterator for grapheme cluster segments
|
|
30
|
+
*/
|
|
31
|
+
function* graphemeSegments(input) {
|
|
32
|
+
let cp = input.codePointAt(0);
|
|
33
|
+
|
|
34
|
+
// do nothing on empty string
|
|
35
|
+
if (cp == null) return;
|
|
36
|
+
|
|
37
|
+
/** Current cursor position. */
|
|
38
|
+
let cursor = cp <= BMP_MAX ? 1 : 2;
|
|
39
|
+
|
|
40
|
+
/** Total length of the input string. */
|
|
41
|
+
let len = input.length;
|
|
42
|
+
|
|
43
|
+
/** @type {import('./_grapheme_data.js').GraphemeCategoryRange} */
|
|
44
|
+
let cache = [0, 0, 2 /* GC_Control */];
|
|
45
|
+
|
|
46
|
+
/** Category of codepoint immediately preceding cursor */
|
|
47
|
+
let catBefore = cat(cp, cache);
|
|
48
|
+
|
|
49
|
+
/** @type {GraphemeCategoryNum | null} Category of codepoint immediately preceding cursor. */
|
|
50
|
+
let catAfter = null;
|
|
51
|
+
|
|
52
|
+
/** The number of RIS codepoints preceding `cursor`. */
|
|
53
|
+
let risCount = 0;
|
|
54
|
+
|
|
55
|
+
/** Emoji state */
|
|
56
|
+
let emoji = false;
|
|
57
|
+
|
|
58
|
+
/** InCB=Consonant */
|
|
59
|
+
let consonant = false;
|
|
60
|
+
|
|
61
|
+
/** InCB=Linker */
|
|
62
|
+
let linker = false;
|
|
63
|
+
|
|
64
|
+
/** InCB=Consonant InCB=Linker x InCB=Consonant */
|
|
65
|
+
let incb = false;
|
|
66
|
+
|
|
67
|
+
let index = 0;
|
|
68
|
+
|
|
69
|
+
/** Beginning category of a segment */
|
|
70
|
+
let _catBegin = catBefore;
|
|
71
|
+
|
|
72
|
+
/** Memoize the beginnig code point a the segment. */
|
|
73
|
+
let _hd = cp;
|
|
74
|
+
|
|
75
|
+
while (cursor < len) {
|
|
76
|
+
// Note: Lazily update `consonant` and `linker` state
|
|
77
|
+
// which is a extra overhead only for Hindi text.
|
|
78
|
+
if (cp >= 2325) {
|
|
79
|
+
if (!consonant && catBefore === 0) {
|
|
80
|
+
consonant = isIndicConjunctConsonant(cp);
|
|
81
|
+
} else if (catBefore === 3 /* Extend */) {
|
|
82
|
+
// Note: \p{InCB=Linker} is a subset of \p{Extend}
|
|
83
|
+
linker = isIndicConjunctLinker(cp);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
cp = /** @type {number} */ (input.codePointAt(cursor));
|
|
88
|
+
catAfter = cat(cp, cache);
|
|
89
|
+
|
|
90
|
+
if (catBefore === 10 /* Regional_Indicator */) {
|
|
91
|
+
risCount++;
|
|
92
|
+
} else {
|
|
93
|
+
risCount = 0;
|
|
94
|
+
if (
|
|
95
|
+
catAfter === 14 /* ZWJ */
|
|
96
|
+
&& (catBefore === 3 /* Extend */ || catBefore === 4 /* Extended_Pictographic */)
|
|
97
|
+
) {
|
|
98
|
+
emoji = true;
|
|
99
|
+
|
|
100
|
+
} else if (catAfter === 0 /* Any */ && cp >= 2325) {
|
|
101
|
+
// Note: Put GB9c rule checking here to reduce.
|
|
102
|
+
incb = consonant && linker && (consonant = isIndicConjunctConsonant(cp));
|
|
103
|
+
// It cannot be both a linker and a consonant.
|
|
104
|
+
linker = linker && !consonant;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (isBoundary(catBefore, catAfter, risCount, emoji, incb)) {
|
|
109
|
+
yield {
|
|
110
|
+
segment: input.slice(index, cursor),
|
|
111
|
+
index,
|
|
112
|
+
input,
|
|
113
|
+
_hd,
|
|
114
|
+
_catBegin,
|
|
115
|
+
_catEnd: catBefore,
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
// flush
|
|
119
|
+
emoji = false;
|
|
120
|
+
incb = false;
|
|
121
|
+
index = cursor;
|
|
122
|
+
_catBegin = catAfter;
|
|
123
|
+
_hd = cp;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
cursor += cp <= BMP_MAX ? 1 : 2;
|
|
127
|
+
catBefore = catAfter;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (index < len) {
|
|
131
|
+
yield {
|
|
132
|
+
segment: input.slice(index),
|
|
133
|
+
index,
|
|
134
|
+
input,
|
|
135
|
+
_hd,
|
|
136
|
+
_catBegin,
|
|
137
|
+
_catEnd: catBefore,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Split given text into extended grapheme clusters.
|
|
144
|
+
*
|
|
145
|
+
* @param {string} text
|
|
146
|
+
* @return {IterableIterator<string>} iterator for grapheme clusters
|
|
147
|
+
*
|
|
148
|
+
* @see {@link graphemeSegments} if you need extra information.
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* [...splitGraphemes('abc')] // => ['a', 'b', 'c']
|
|
152
|
+
*/
|
|
153
|
+
function* splitGraphemes(text) {
|
|
154
|
+
for (let s of graphemeSegments(text)) yield s.segment;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Precompute a fast lookup table for BMP code points (0..0xFFFF)
|
|
159
|
+
* This table maps each code point to its Grapheme_Cluster_Break category.
|
|
160
|
+
* It is generated once at module load time using the grapheme_ranges data.
|
|
161
|
+
* The table is a Uint8Array of length 0x10000 (64KB), which is acceptable in memory.
|
|
162
|
+
* For code points >= 0x10000 we fall back to binary search.
|
|
163
|
+
*/
|
|
164
|
+
let bmpLookup = new Uint8Array(BMP_MAX + 1);
|
|
165
|
+
let bmpCursor = (() => {
|
|
166
|
+
let cursor = 0;
|
|
167
|
+
let cp = 0;
|
|
168
|
+
while (cp <= BMP_MAX) {
|
|
169
|
+
let range = grapheme_ranges[cursor++];
|
|
170
|
+
for (cp = range[0]; cp <= range[1]; cp++) {
|
|
171
|
+
bmpLookup[cp] = range[2];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return cursor;
|
|
175
|
+
})();
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* `Grapheme_Cluster_Break` property value of a given codepoint
|
|
179
|
+
*
|
|
180
|
+
* @see https://www.unicode.org/reports/tr29/tr29-43.html#Default_Grapheme_Cluster_Table
|
|
181
|
+
*
|
|
182
|
+
* @param {number} cp
|
|
183
|
+
* @param {import('./_grapheme_data.js').GraphemeCategoryRange} cache
|
|
184
|
+
* @return {GraphemeCategoryNum}
|
|
185
|
+
*/
|
|
186
|
+
function cat(cp, cache) {
|
|
187
|
+
// Fast lookup for BMP (0x0000..0xFFFF) using precomputed table
|
|
188
|
+
if (cp <= BMP_MAX) {
|
|
189
|
+
return /** @type {GraphemeCategoryNum} */ (bmpLookup[cp]);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Use cached result
|
|
193
|
+
if (cp >= cache[0] && cp <= cache[1]) {
|
|
194
|
+
return cache[2];
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Binary search, starting from bmpCursor
|
|
198
|
+
let index = findUnicodeRangeIndex(cp, grapheme_ranges, bmpCursor);
|
|
199
|
+
if (index < 0) {
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const range = grapheme_ranges[index];
|
|
204
|
+
cache[0] = range[0];
|
|
205
|
+
cache[1] = range[1];
|
|
206
|
+
return (cache[2] = range[2]);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* @param {number} cp
|
|
210
|
+
* @return {boolean}
|
|
211
|
+
*/
|
|
212
|
+
function isIndicConjunctConsonant(cp) {
|
|
213
|
+
return findUnicodeRangeIndex(cp, consonant_ranges) >= 0;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* @param {number} cp
|
|
218
|
+
* @return {boolean}
|
|
219
|
+
*/
|
|
220
|
+
function isIndicConjunctLinker(cp) {
|
|
221
|
+
return (
|
|
222
|
+
cp === 2381 /* 0x094D */ ||
|
|
223
|
+
cp === 2509 /* 0x09CD */ ||
|
|
224
|
+
cp === 2765 /* 0x0ACD */ ||
|
|
225
|
+
cp === 2893 /* 0x0B4D */ ||
|
|
226
|
+
cp === 3149 /* 0x0C4D */ ||
|
|
227
|
+
cp === 3405 /* 0x0D4D */
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* @param {GraphemeCategoryNum} catBefore
|
|
233
|
+
* @param {GraphemeCategoryNum} catAfter
|
|
234
|
+
* @param {number} risCount Regional_Indicator state
|
|
235
|
+
* @param {boolean} emoji Extended_Pictographic state
|
|
236
|
+
* @param {boolean} incb Indic_Conjunct_Break state
|
|
237
|
+
* @return {boolean}
|
|
238
|
+
*
|
|
239
|
+
* @see https://www.unicode.org/reports/tr29/tr29-43.html#Grapheme_Cluster_Boundary_Rules
|
|
240
|
+
*/
|
|
241
|
+
function isBoundary(catBefore, catAfter, risCount, emoji, incb) {
|
|
242
|
+
// GB3
|
|
243
|
+
if (catBefore === 1 && catAfter === 6) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// GB4
|
|
248
|
+
if (catBefore === 1 || catBefore === 2 || catBefore === 6) {
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// GB5
|
|
253
|
+
if (catAfter === 1 || catAfter === 2 || catAfter === 6) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Most common cases - GB9, GB9a extend rules
|
|
258
|
+
if (catAfter === 3 || catAfter === 14 || catAfter === 11) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// GB6 - L x (L | V | LV | LVT)
|
|
263
|
+
if (catBefore === 5) {
|
|
264
|
+
return !(catAfter === 5 || catAfter === 7 || catAfter === 8 || catAfter === 13);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// GB7 - (LV | V) x (V | T)
|
|
268
|
+
if (
|
|
269
|
+
(catBefore === 7 || catBefore === 13) &&
|
|
270
|
+
(catAfter === 13 || catAfter === 12)
|
|
271
|
+
) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// GB8 - (LVT | T) x T
|
|
276
|
+
if (
|
|
277
|
+
(catBefore === 8 || catBefore === 12) &&
|
|
278
|
+
catAfter === 12
|
|
279
|
+
) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// GB9b
|
|
284
|
+
if (catBefore === 9) {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// GB9c
|
|
289
|
+
if (catAfter === 0 && incb) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// GB11
|
|
294
|
+
if (catBefore === 14 && catAfter === 4) {
|
|
295
|
+
return !emoji;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// GB12, GB13
|
|
299
|
+
if (catBefore === 10 && catAfter === 10) {
|
|
300
|
+
return risCount % 2 === 0;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// GB999
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export { graphemeSegments, splitGraphemes };
|
package/lib/primitive.cjs
CHANGED
|
@@ -9,6 +9,7 @@ const reactPopover = require('@seed-design/react-popover');
|
|
|
9
9
|
const reactProgress = require('@seed-design/react-progress');
|
|
10
10
|
const reactPullToRefresh = require('@seed-design/react-pull-to-refresh');
|
|
11
11
|
const reactRadioGroup = require('@seed-design/react-radio-group');
|
|
12
|
+
const reactSlider = require('@seed-design/react-slider');
|
|
12
13
|
const reactSnackbar = require('@seed-design/react-snackbar');
|
|
13
14
|
const reactSwitch = require('@seed-design/react-switch');
|
|
14
15
|
const reactTabs = require('@seed-design/react-tabs');
|
|
@@ -58,6 +59,12 @@ Object.keys(reactRadioGroup).forEach(k => {
|
|
|
58
59
|
get: () => reactRadioGroup[k]
|
|
59
60
|
});
|
|
60
61
|
});
|
|
62
|
+
Object.keys(reactSlider).forEach(k => {
|
|
63
|
+
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
get: () => reactSlider[k]
|
|
66
|
+
});
|
|
67
|
+
});
|
|
61
68
|
Object.keys(reactSnackbar).forEach(k => {
|
|
62
69
|
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
63
70
|
enumerable: true,
|