@santi020k/lumen-core 3.0.1 → 4.0.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.
Files changed (147) hide show
  1. package/PHONE_FLAG_LICENSE.txt +21 -0
  2. package/README.md +363 -3
  3. package/THIRD_PARTY_NOTICES.md +16 -2
  4. package/dist/ai-surfaces.d.ts +25 -0
  5. package/dist/ai-surfaces.d.ts.map +1 -0
  6. package/dist/ai-surfaces.js +162 -0
  7. package/dist/amount-field.d.ts +22 -0
  8. package/dist/amount-field.d.ts.map +1 -0
  9. package/dist/amount-field.js +207 -0
  10. package/dist/attachments.d.ts +15 -0
  11. package/dist/attachments.d.ts.map +1 -0
  12. package/dist/attachments.js +123 -0
  13. package/dist/bullet-chart.d.ts +33 -0
  14. package/dist/bullet-chart.d.ts.map +1 -0
  15. package/dist/bullet-chart.js +80 -0
  16. package/dist/chart-activation.d.ts +32 -0
  17. package/dist/chart-activation.d.ts.map +1 -0
  18. package/dist/chart-activation.js +97 -0
  19. package/dist/chart-interaction.d.ts +12 -0
  20. package/dist/chart-interaction.d.ts.map +1 -0
  21. package/dist/chart-interaction.js +274 -0
  22. package/dist/chart-models.d.ts +156 -0
  23. package/dist/chart-models.d.ts.map +1 -0
  24. package/dist/chart-models.js +348 -0
  25. package/dist/chart-motion.d.ts +6 -0
  26. package/dist/chart-motion.d.ts.map +1 -0
  27. package/dist/chart-motion.js +107 -0
  28. package/dist/charts.d.ts +58 -3
  29. package/dist/charts.d.ts.map +1 -1
  30. package/dist/charts.js +247 -18
  31. package/dist/code.js +1 -1
  32. package/dist/combobox.d.ts +7 -0
  33. package/dist/combobox.d.ts.map +1 -0
  34. package/dist/combobox.js +253 -0
  35. package/dist/comparison-chart.d.ts +32 -0
  36. package/dist/comparison-chart.d.ts.map +1 -0
  37. package/dist/comparison-chart.js +64 -0
  38. package/dist/components.d.ts +210 -25
  39. package/dist/components.d.ts.map +1 -1
  40. package/dist/components.js +102 -26
  41. package/dist/dashboard.d.ts +16 -0
  42. package/dist/dashboard.d.ts.map +1 -0
  43. package/dist/dashboard.js +21 -0
  44. package/dist/data.d.ts.map +1 -1
  45. package/dist/data.js +21 -5
  46. package/dist/dates.d.ts +13 -0
  47. package/dist/dates.d.ts.map +1 -0
  48. package/dist/dates.js +37 -0
  49. package/dist/device-frame.d.ts +25 -0
  50. package/dist/device-frame.d.ts.map +1 -0
  51. package/dist/device-frame.js +50 -0
  52. package/dist/direction.d.ts +3 -0
  53. package/dist/direction.d.ts.map +1 -0
  54. package/dist/direction.js +10 -0
  55. package/dist/extended-charts.d.ts +95 -0
  56. package/dist/extended-charts.d.ts.map +1 -0
  57. package/dist/extended-charts.js +175 -0
  58. package/dist/figma.d.ts.map +1 -1
  59. package/dist/figma.js +10 -1
  60. package/dist/forms.d.ts.map +1 -1
  61. package/dist/forms.js +18 -4
  62. package/dist/icon-data.generated.d.ts +1 -1
  63. package/dist/icon-data.generated.d.ts.map +1 -1
  64. package/dist/icon-data.generated.js +1 -1
  65. package/dist/icons.js +3 -4
  66. package/dist/illustrations.generated.d.ts +1 -1
  67. package/dist/image-comparison.d.ts +14 -0
  68. package/dist/image-comparison.d.ts.map +1 -0
  69. package/dist/image-comparison.js +48 -0
  70. package/dist/index.d.ts +35 -4
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +34 -3
  73. package/dist/media-viewport.d.ts +24 -0
  74. package/dist/media-viewport.d.ts.map +1 -0
  75. package/dist/media-viewport.js +119 -0
  76. package/dist/media-workspace.d.ts +27 -0
  77. package/dist/media-workspace.d.ts.map +1 -0
  78. package/dist/media-workspace.js +83 -0
  79. package/dist/message-scroller.d.ts +14 -0
  80. package/dist/message-scroller.d.ts.map +1 -0
  81. package/dist/message-scroller.js +113 -0
  82. package/dist/motion-workflows.d.ts +24 -0
  83. package/dist/motion-workflows.d.ts.map +1 -0
  84. package/dist/motion-workflows.js +220 -0
  85. package/dist/motion.d.ts +12 -0
  86. package/dist/motion.d.ts.map +1 -0
  87. package/dist/motion.js +96 -0
  88. package/dist/native-input.d.ts +25 -0
  89. package/dist/native-input.d.ts.map +1 -0
  90. package/dist/native-input.js +188 -0
  91. package/dist/phone-flags.generated.d.ts +2 -0
  92. package/dist/phone-flags.generated.d.ts.map +1 -0
  93. package/dist/phone-flags.generated.js +263 -0
  94. package/dist/phone.d.ts +4 -0
  95. package/dist/phone.d.ts.map +1 -1
  96. package/dist/phone.js +6 -1
  97. package/dist/rich-text.d.ts +7 -0
  98. package/dist/rich-text.d.ts.map +1 -1
  99. package/dist/rich-text.js +13 -0
  100. package/dist/rive.d.ts +37 -0
  101. package/dist/rive.d.ts.map +1 -0
  102. package/dist/rive.js +129 -0
  103. package/dist/schedule.d.ts.map +1 -1
  104. package/dist/schedule.js +63 -23
  105. package/dist/tab-indicator.d.ts +3 -0
  106. package/dist/tab-indicator.d.ts.map +1 -0
  107. package/dist/tab-indicator.js +57 -0
  108. package/dist/theme-audit.d.ts +16 -0
  109. package/dist/theme-audit.d.ts.map +1 -0
  110. package/dist/theme-audit.js +57 -0
  111. package/dist/theme-builder.d.ts +7 -1
  112. package/dist/theme-builder.d.ts.map +1 -1
  113. package/dist/theme-builder.js +45 -23
  114. package/dist/theme-presets.generated.d.ts +217 -0
  115. package/dist/theme-presets.generated.d.ts.map +1 -0
  116. package/dist/theme-presets.generated.js +231 -0
  117. package/dist/theme.d.ts +11 -3
  118. package/dist/theme.d.ts.map +1 -1
  119. package/dist/theme.js +56 -6
  120. package/dist/virtual-collection.d.ts +14 -0
  121. package/dist/virtual-collection.d.ts.map +1 -0
  122. package/dist/virtual-collection.js +132 -0
  123. package/dist/virtual-list.d.ts +7 -0
  124. package/dist/virtual-list.d.ts.map +1 -0
  125. package/dist/virtual-list.js +135 -0
  126. package/dist/virtual-window.d.ts +19 -0
  127. package/dist/virtual-window.d.ts.map +1 -0
  128. package/dist/virtual-window.js +84 -0
  129. package/dist/visual-effects.d.ts +6 -0
  130. package/dist/visual-effects.d.ts.map +1 -0
  131. package/dist/visual-effects.js +44 -0
  132. package/dist/world-map-data.generated.d.ts +9 -0
  133. package/dist/world-map-data.generated.d.ts.map +1 -0
  134. package/dist/world-map-data.generated.js +240 -0
  135. package/dist/world-map-navigation.d.ts +16 -0
  136. package/dist/world-map-navigation.d.ts.map +1 -0
  137. package/dist/world-map-navigation.js +53 -0
  138. package/dist/world-map-pan.d.ts +3 -0
  139. package/dist/world-map-pan.d.ts.map +1 -0
  140. package/dist/world-map-pan.js +66 -0
  141. package/dist/world-map-zoom.d.ts +13 -0
  142. package/dist/world-map-zoom.d.ts.map +1 -0
  143. package/dist/world-map-zoom.js +61 -0
  144. package/dist/world-map.d.ts +71 -0
  145. package/dist/world-map.d.ts.map +1 -0
  146. package/dist/world-map.js +143 -0
  147. package/package.json +51 -4
@@ -0,0 +1,188 @@
1
+ const decimalFormatter = (locale) => {
2
+ try {
3
+ return new Intl.NumberFormat(locale, { useGrouping: false });
4
+ }
5
+ catch {
6
+ return new Intl.NumberFormat('en', { useGrouping: false });
7
+ }
8
+ };
9
+ const decimalSymbols = (locale) => {
10
+ const formatter = decimalFormatter(locale);
11
+ const parts = formatter.formatToParts(-1.1);
12
+ return {
13
+ decimal: parts.find(part => part.type === 'decimal')?.value ?? '.',
14
+ digits: Array.from({ length: 10 }, (_, digit) => formatter.format(digit)),
15
+ minus: parts.find(part => part.type === 'minusSign')?.value ?? '-'
16
+ };
17
+ };
18
+ const numericDigit = (character) => {
19
+ if (!/^\p{Decimal_Number}$/u.test(character))
20
+ return null;
21
+ const code = character.codePointAt(0);
22
+ if (code === undefined)
23
+ return null;
24
+ let start = code;
25
+ while (/^\p{Decimal_Number}$/u.test(String.fromCodePoint(start - 1)))
26
+ start -= 1;
27
+ return (code - start) % 10;
28
+ };
29
+ const scanDecimalDigits = (value, separator, localizedDigits) => {
30
+ let digits = '';
31
+ let decimalSeen = false;
32
+ let scale = 0;
33
+ for (const character of value) {
34
+ const localizedDigit = localizedDigits.indexOf(character);
35
+ const digit = localizedDigit < 0 ? numericDigit(character) : localizedDigit;
36
+ if (digit !== null) {
37
+ digits += String(digit);
38
+ if (decimalSeen)
39
+ scale += 1;
40
+ }
41
+ else if (character === separator && !decimalSeen)
42
+ decimalSeen = true;
43
+ else
44
+ return null;
45
+ }
46
+ return { digits, scale };
47
+ };
48
+ export const parseLumenDecimalDraft = (value, locale) => {
49
+ if (value === '')
50
+ return { kind: 'empty' };
51
+ if (value.length > 128)
52
+ return { kind: 'invalid' };
53
+ const symbols = decimalSymbols(locale);
54
+ const negative = value.startsWith(symbols.minus) || value.startsWith('-');
55
+ const signLength = value.startsWith(symbols.minus) ? symbols.minus.length : 1;
56
+ const unsigned = negative ? value.slice(signLength) : value;
57
+ const scanned = scanDecimalDigits(unsigned, symbols.decimal, symbols.digits);
58
+ if (!scanned)
59
+ return { kind: 'invalid' };
60
+ if (scanned.digits === '' || unsigned.endsWith(symbols.decimal))
61
+ return { kind: 'incomplete' };
62
+ return { coefficient: BigInt(scanned.digits) * (negative ? -1n : 1n), kind: 'valid', scale: scanned.scale };
63
+ };
64
+ const parseConfiguration = (value) => {
65
+ if (value === undefined)
66
+ return undefined;
67
+ for (const character of value) {
68
+ if (!'0123456789.-'.includes(character))
69
+ throw new RangeError('Decimal configuration must use ASCII digits.');
70
+ }
71
+ const parsed = parseLumenDecimalDraft(value, 'en-US');
72
+ if (parsed.kind !== 'valid')
73
+ throw new RangeError('Decimal configuration must be a complete ungrouped decimal of at most 128 characters.');
74
+ return parsed;
75
+ };
76
+ const compareDecimals = (left, right) => {
77
+ const scale = Math.max(left.scale, right.scale);
78
+ const difference = left.coefficient * 10n ** BigInt(scale - left.scale) -
79
+ right.coefficient * 10n ** BigInt(scale - right.scale);
80
+ return difference < 0n ? -1 : Number(difference > 0n);
81
+ };
82
+ const decimalConfiguration = (options) => {
83
+ const min = parseConfiguration(options.min);
84
+ const max = parseConfiguration(options.max);
85
+ const step = parseConfiguration(options.step ?? '1');
86
+ if (!step || step.coefficient <= 0n)
87
+ throw new RangeError('Decimal step must be positive.');
88
+ if (min && max && compareDecimals(min, max) > 0)
89
+ throw new RangeError('Decimal minimum must not exceed maximum.');
90
+ return { max, min, step };
91
+ };
92
+ export const isLumenDecimalInBounds = (value, options = {}) => {
93
+ const { max, min } = decimalConfiguration(options);
94
+ const draft = parseLumenDecimalDraft(value, options.locale);
95
+ return draft.kind === 'valid' &&
96
+ (!min || compareDecimals(draft, min) >= 0) &&
97
+ (!max || compareDecimals(draft, max) <= 0);
98
+ };
99
+ const localizeDigits = (value, digits) => {
100
+ let result = '';
101
+ for (const digit of value)
102
+ result += digits[Number(digit)] ?? digit;
103
+ return result;
104
+ };
105
+ const startingDecimal = (draft, min, max) => {
106
+ if (draft.kind === 'valid')
107
+ return draft;
108
+ if (draft.kind !== 'empty')
109
+ return null;
110
+ if (min)
111
+ return min;
112
+ if (max && max.coefficient < 0n)
113
+ return max;
114
+ return { coefficient: 0n, kind: 'valid', scale: 0 };
115
+ };
116
+ const formatDecimal = (value, locale) => {
117
+ const symbols = decimalSymbols(locale);
118
+ const negative = value.coefficient < 0n;
119
+ const absolute = negative ? -value.coefficient : value.coefficient;
120
+ const digits = absolute.toString().padStart(value.scale + 1, '0');
121
+ let fraction = value.scale > 0 ? digits.slice(-value.scale) : '';
122
+ while (fraction.endsWith('0'))
123
+ fraction = fraction.slice(0, -1);
124
+ const integer = value.scale > 0 ? digits.slice(0, -value.scale) : digits;
125
+ const localized = localizeDigits(integer, symbols.digits);
126
+ const localizedFraction = localizeDigits(fraction, symbols.digits);
127
+ return `${negative ? symbols.minus : ''}${localized}${fraction ? symbols.decimal + localizedFraction : ''}`;
128
+ };
129
+ export const stepLumenDecimalDraft = (value, direction, options = {}) => {
130
+ const { max, min, step } = decimalConfiguration(options);
131
+ const draft = parseLumenDecimalDraft(value, options.locale);
132
+ const start = startingDecimal(draft, min, max);
133
+ if (!start)
134
+ return null;
135
+ const scale = Math.max(start.scale, step.scale);
136
+ let result = {
137
+ coefficient: start.coefficient * 10n ** BigInt(scale - start.scale) +
138
+ BigInt(direction) * step.coefficient * 10n ** BigInt(scale - step.scale),
139
+ kind: 'valid',
140
+ scale
141
+ };
142
+ if (min && compareDecimals(result, min) < 0)
143
+ result = min;
144
+ if (max && compareDecimals(result, max) > 0)
145
+ result = max;
146
+ const formatted = formatDecimal(result, options.locale);
147
+ return formatted.length <= 128 ? formatted : null;
148
+ };
149
+ /** Single-editor numeric OTP normalization; separators are accepted, unrelated text is rejected. */
150
+ const validateOTPLength = (length) => {
151
+ if (!Number.isInteger(length) || length < 1 || length > 12) {
152
+ throw new RangeError('OTP length must be between 1 and 12.');
153
+ }
154
+ };
155
+ export const normalizeLumenNumericOTP = (proposal, length = 6) => {
156
+ validateOTPLength(length);
157
+ if (proposal.length > 128)
158
+ return null;
159
+ let result = '';
160
+ for (const character of proposal) {
161
+ const digit = numericDigit(character);
162
+ if (digit !== null)
163
+ result += String(digit);
164
+ else if (character !== '-' && character.trim() !== '')
165
+ return null;
166
+ if (result.length > length)
167
+ return null;
168
+ }
169
+ return result;
170
+ };
171
+ const isTimePart = (value, limit) => (typeof value === 'number' && Number.isInteger(value) && value >= 0 && value < limit);
172
+ export const isLumenTimeSelection = (value) => (typeof value === 'object' && value !== null && !Array.isArray(value) &&
173
+ 'hour' in value && 'minute' in value && isTimePart(value.hour, 24) && isTimePart(value.minute, 60));
174
+ const timeMinutes = (time) => time.hour * 60 + time.minute;
175
+ const validateTimeBounds = (min, max) => {
176
+ if ((min && !isLumenTimeSelection(min)) || (max && !isLumenTimeSelection(max))) {
177
+ throw new RangeError('Time bounds must contain valid wall-clock values.');
178
+ }
179
+ if (min && max && timeMinutes(min) > timeMinutes(max)) {
180
+ throw new RangeError('Time bounds must be ordered within one day.');
181
+ }
182
+ };
183
+ export const isLumenTimeInBounds = (value, min, max) => {
184
+ validateTimeBounds(min, max);
185
+ return isLumenTimeSelection(value) &&
186
+ (!min || timeMinutes(value) >= timeMinutes(min)) &&
187
+ (!max || timeMinutes(value) <= timeMinutes(max));
188
+ };
@@ -0,0 +1,2 @@
1
+ export declare const lumenPhoneFlagSources: Readonly<Record<string, string>>;
2
+ //# sourceMappingURL=phone-flags.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-flags.generated.d.ts","sourceRoot":"","sources":["../src/phone-flags.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoQlE,CAAA"}