@tmlmobilidade/ui 20250826.1336.59 → 20250826.1437.53

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 (32) hide show
  1. package/dist/index.css +158 -0
  2. package/dist/index.css.map +1 -1
  3. package/dist/index.d.ts +45 -3
  4. package/dist/index.js +4 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/components/common/LineBadge/index.js +16 -0
  7. package/dist/src/components/common/LineBadge/index.js.map +1 -0
  8. package/dist/src/components/common/LineBadge/styles.module.css.js +4 -0
  9. package/dist/src/components/common/LineBadge/styles.module.css.js.map +1 -0
  10. package/dist/src/components/common/LineDisplay/index.js +21 -0
  11. package/dist/src/components/common/LineDisplay/index.js.map +1 -0
  12. package/dist/src/components/common/LineDisplay/styles.module.css.js +4 -0
  13. package/dist/src/components/common/LineDisplay/styles.module.css.js.map +1 -0
  14. package/dist/src/components/common/LineName/index.js +10 -0
  15. package/dist/src/components/common/LineName/index.js.map +1 -0
  16. package/dist/src/components/common/LineName/styles.module.css.js +4 -0
  17. package/dist/src/components/common/LineName/styles.module.css.js.map +1 -0
  18. package/dist/src/components/common/LineSelect/index.js +80 -0
  19. package/dist/src/components/common/LineSelect/index.js.map +1 -0
  20. package/dist/src/components/common/LineSelect/styles.module.css.js +4 -0
  21. package/dist/src/components/common/LineSelect/styles.module.css.js.map +1 -0
  22. package/dist/src/components/inputs/CoordinatesInput/index.js +2 -0
  23. package/dist/src/components/inputs/CoordinatesInput/index.js.map +1 -1
  24. package/dist/src/components/map/view/MapViewToolbar/index.js +2 -1
  25. package/dist/src/components/map/view/MapViewToolbar/index.js.map +1 -1
  26. package/dist/src/components/upload/FileUpload/index.js +2 -1
  27. package/dist/src/components/upload/FileUpload/index.js.map +1 -1
  28. package/dist/src/hooks/use-other-search.js +204 -0
  29. package/dist/src/hooks/use-other-search.js.map +1 -0
  30. package/dist/styles-no-reset.css +158 -0
  31. package/dist/styles.css +158 -0
  32. package/package.json +4 -2
@@ -0,0 +1,204 @@
1
+ 'use client';
2
+ import ukkonen from 'ukkonen';
3
+
4
+ /* * */
5
+ /**
6
+ * Normalize a string by converting to lowercase, removing accents, and non-alphanumeric characters.
7
+ * @param str - The string to normalize.
8
+ * @returns The normalized string.
9
+ */
10
+ function normalizeString(str) {
11
+ const res = str.toLowerCase()
12
+ .normalize('NFD')
13
+ .replace(/[\u0300-\u036f]/g, '')
14
+ .replace(/[^a-z0-9 ]/g, '');
15
+ return res;
16
+ }
17
+ /**
18
+ *
19
+ * @param docs Array of documents to search through, documents with a true 'boost' key will have their score multiplied by the boostMultiplier.
20
+ * This is useful for prioritizing certain documents.
21
+ * @param scoring Object with the keys of the documents to search through and the weight of the search on each key.
22
+ * @param options Options for the search.
23
+ * @returns
24
+ */
25
+ function createDocCollection(docs, scoring, options = {}) {
26
+ const defaultOptions = {
27
+ boostMultiplier: 1.5,
28
+ minimumQueryLength: 1,
29
+ threshold: 2,
30
+ useLevenshtein: true,
31
+ };
32
+ const finalOptions = {
33
+ ...defaultOptions,
34
+ ...options,
35
+ };
36
+ const normalizedDocs = docs.map((doc) => {
37
+ const normalizedDoc = {};
38
+ for (const key in scoring) {
39
+ const v = doc[key];
40
+ if (typeof v === 'string') {
41
+ normalizedDoc[key] = normalizeString(v);
42
+ }
43
+ else if (Array.isArray(v)) {
44
+ normalizedDoc[key] = v.filter(v => v != null).map(normalizeString);
45
+ }
46
+ }
47
+ return { doc, normalized: normalizedDoc };
48
+ });
49
+ const levenshteinCache = new Map();
50
+ return {
51
+ search: (query) => searchDocuments(query, normalizedDocs, scoring, levenshteinCache, finalOptions),
52
+ };
53
+ }
54
+ /**
55
+ * Calculate the Levenshtein distance between two strings, using a cache to speed up the process.
56
+ * @param a - The first string.
57
+ * @param b - The second string.
58
+ * @param maxDistance - The maximum distance allowed. Stops early which significantly speeds up the process.
59
+ * @param levenshteinCache - The cache to store the results.
60
+ * @returns - The Levenshtein distance.
61
+ */
62
+ const levenshteinDistance = (a, b, maxDistance, levenshteinCache) => {
63
+ const cachekey = a + '\n' + b;
64
+ const cacheValue = levenshteinCache.get(cachekey);
65
+ if (cacheValue !== undefined) {
66
+ return cacheValue;
67
+ }
68
+ const res = ukkonen(a, b, maxDistance);
69
+ levenshteinCache.set(cachekey, res);
70
+ return res;
71
+ };
72
+ /**
73
+ * Calculate the score for a string, based on the number of consecutive query words that prefix match.
74
+ * "The quick brown fox" has a score of 1 for "quick brown" and 0 for "quick fox".
75
+ * @param text The text to score.
76
+ * @param queryWords The query words to match.
77
+ * @returns The context score.
78
+ */
79
+ const sequentialWordsMatchScore = (text, queryWords) => {
80
+ const textWords = text.split(' ');
81
+ let contextScore = 0;
82
+ for (let i = 0; i <= textWords.length - queryWords.length; i++) {
83
+ if (queryWords.every((qw, j) => isPrefixMatch(textWords[i + j] ?? '', qw))) {
84
+ contextScore++;
85
+ }
86
+ }
87
+ return contextScore;
88
+ };
89
+ /**
90
+ * Check if a word starts with a given prefix.
91
+ * @param word The word to check.
92
+ * @param prefix The prefix to match.
93
+ * @returns True if the word starts with the prefix, false otherwise.
94
+ */
95
+ const isPrefixMatch = (word, prefix) => {
96
+ const res = word.startsWith(prefix);
97
+ return res;
98
+ };
99
+ /**
100
+ * Search documents based on a query using prefix matching and fuzzy search.
101
+ * @param query - The search query.
102
+ * @param docs - Array of documents to search through. Each document should have 'primary' and 'secondary' fields.
103
+ * @returns Filtered and sorted documents based on relevance to the query.
104
+ */
105
+ function searchDocuments(query, docs, scoreWeights, levenshteinCache, options) {
106
+ /**
107
+ * Calculate the relevance score for a document based on the query words.
108
+ * @param doc - The document to score.
109
+ * @param queryWords - The query words to match.
110
+ * @returns - The relevance score.
111
+ */
112
+ const calculateScore = (doc, boost, queryWords, scoring) => {
113
+ let totalScore = 0;
114
+ // The algorithm implements a prefix search per word,
115
+ // followed by a fuzzy search if the prefix search is not successful
116
+ const matchWord = (documentSearchedWords, queryWord) => {
117
+ // fuzzy search tolerance increases very slightly with query word length
118
+ const maxLevDistance = Math.max(options.minimumQueryLength, Math.ceil(0.3 * queryWord.length));
119
+ const documentWordScores = documentSearchedWords.map((word) => {
120
+ // If the word is a prefix match, match, else fuzzy search and give lower score
121
+ if (isPrefixMatch(word, queryWord)) {
122
+ return 1;
123
+ }
124
+ // Check if the query is of enough size to be searched
125
+ else if (options.useLevenshtein === true && queryWord.length > options.minimumQueryLength && word.length > options.minimumQueryLength) {
126
+ // If the query is a number, we don't want to do a fuzzy search
127
+ if (Number.isNaN(Number(queryWord)) && levenshteinDistance(word, queryWord, maxLevDistance, levenshteinCache) < maxLevDistance) {
128
+ return 0.5;
129
+ }
130
+ }
131
+ return 0;
132
+ });
133
+ return Math.max(...documentWordScores);
134
+ };
135
+ // Calculate the score for each field in the document
136
+ for (const untypedKey in scoring) {
137
+ // Typescript magic for assuring the key is actually one of our keys
138
+ const key = untypedKey;
139
+ const documentValue = doc[key];
140
+ const multiplier = scoring[key] ?? 1;
141
+ // If the value is an array, we treat it as a list of words
142
+ if (Array.isArray(documentValue)) {
143
+ if (documentValue.length === 0) {
144
+ continue;
145
+ }
146
+ const documentStrings = documentValue;
147
+ if (queryWords.length > 0) {
148
+ // Match each query word against a locality.
149
+ // We do not match against each word in the locality as this would be very slow. TODO improve
150
+ queryWords.forEach((queryWord) => {
151
+ // The length penalty is a factor that decreases the score
152
+ // of a word match based on the length of the query word.
153
+ // This is to prevent short words from being too heavily weighted.
154
+ // The penalty is a factor of the length of the query word divided by 4
155
+ // The penalty is then clamped between 0 and 1.
156
+ const lengthPenalty = Math.min(queryWord.length / 4, 1);
157
+ totalScore += matchWord(documentStrings, queryWord) * multiplier * lengthPenalty;
158
+ });
159
+ }
160
+ }
161
+ else if (typeof documentValue === 'string') {
162
+ const documentWords = documentValue.split(' ');
163
+ queryWords.forEach((queryWord) => {
164
+ // See above
165
+ const lengthPenalty = Math.min(queryWord.length / 4, 1);
166
+ totalScore += matchWord(documentWords, queryWord) * multiplier * lengthPenalty;
167
+ });
168
+ if (queryWords.length > 1) {
169
+ totalScore += sequentialWordsMatchScore(documentValue, queryWords) * multiplier;
170
+ }
171
+ }
172
+ }
173
+ // For the query, it matches primary string first,
174
+ // then the secondary string the same way
175
+ if (boost) {
176
+ totalScore *= options.boostMultiplier;
177
+ }
178
+ return totalScore;
179
+ };
180
+ // Normalize query and split into words, filtering out words that are too short and that are not numbers
181
+ const queryWords = normalizeString(query)
182
+ .split(' ')
183
+ .filter((word) => word.length > 0 && (word.length >= options.minimumQueryLength || !Number.isNaN(Number(word))));
184
+ // Calculate the score for each document, using the normalized string
185
+ const scoredDocs = docs.map(doc => ({
186
+ doc: doc.doc,
187
+ score: calculateScore(doc.normalized, doc.doc.boost, queryWords, scoreWeights),
188
+ }));
189
+ // Sort the documents by score
190
+ const sortedScoreDocs = scoredDocs.sort((a, b) => b.score - a.score);
191
+ // Filter out documents with a score less than half of the top score
192
+ const bestScore = sortedScoreDocs[0]?.score;
193
+ const filteredScoreDocs = sortedScoreDocs.filter(scoredDoc => scoredDoc.score > Math.floor(bestScore ?? 0 / options.threshold) || bestScore === 0);
194
+ // If top score is 0, we filter out all documents
195
+ if (bestScore === 0) {
196
+ return [];
197
+ }
198
+ // Sort the documents by score and
199
+ return filteredScoreDocs.map(scoredDoc => scoredDoc.doc);
200
+ //
201
+ }
202
+
203
+ export { createDocCollection };
204
+ //# sourceMappingURL=use-other-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-other-search.js","sources":["../../../src/hooks/use-other-search.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -10715,6 +10715,164 @@ breakpoint-mobile {
10715
10715
  flex-wrap: wrap-reverse;
10716
10716
  }
10717
10717
 
10718
+ /* * */
10719
+ /* BADGE */
10720
+
10721
+ .styles-module_badge__-PqgE {
10722
+ position: relative;
10723
+ display: flex;
10724
+ align-items: center;
10725
+ justify-content: center;
10726
+ font-weight: var(--font-weight-bold);
10727
+ line-height: 1;
10728
+ color: var(--color-system-background-100);
10729
+ letter-spacing: 1px;
10730
+ background-color: var(--color-system-text-200);
10731
+ border-radius: 999px;
10732
+
10733
+ &[data-size='md'] {
10734
+ min-width: 65px;
10735
+ max-width: 65px;
10736
+ min-height: 26px;
10737
+ max-height: 26px;
10738
+ font-size: 16px;
10739
+ }
10740
+
10741
+ &[data-size='lg'] {
10742
+ min-width: 85px;
10743
+ max-width: 85px;
10744
+ min-height: 34px;
10745
+ max-height: 34px;
10746
+ font-size: 22px;
10747
+ }
10748
+ }
10749
+
10750
+
10751
+ /* * */
10752
+ /* ALERT ICON */
10753
+
10754
+ .styles-module_alertIcon__JtR4k {
10755
+ position: absolute;
10756
+ top: -10px;
10757
+ right: -10px;
10758
+ display: flex;
10759
+ align-items: center;
10760
+ justify-content: center;
10761
+ width: 20px;
10762
+ height: 20px;
10763
+ color: var(--color-status-info-text);
10764
+ background-color: var(--color-primary-white);
10765
+ border-radius: 999px;
10766
+ }
10767
+ /* * */
10768
+ /* NAME */
10769
+
10770
+ .styles-module_name__nmepm {
10771
+ display: -webkit-box;
10772
+ justify-content: flex-start;
10773
+ width: 100%;
10774
+ overflow: hidden;
10775
+ text-overflow: ellipsis;
10776
+ -webkit-line-clamp: 3;
10777
+ color: var(--color-system-text-100);
10778
+ -webkit-box-orient: vertical;
10779
+ }
10780
+
10781
+ /* * */
10782
+ /* SIZE */
10783
+
10784
+ .styles-module_name__nmepm[data-size='md'] {
10785
+ font-size: 15px;
10786
+ font-weight: var(--font-weight-semibold);
10787
+ }
10788
+
10789
+ .styles-module_name__nmepm[data-size='lg'] {
10790
+ font-size: 20px;
10791
+ font-weight: var(--font-weight-semibold);
10792
+ }
10793
+
10794
+ /* * */
10795
+ /* ALIGN */
10796
+
10797
+ .styles-module_name__nmepm[data-align='left'] {
10798
+ align-items: flex-start;
10799
+ text-align: left;
10800
+ }
10801
+
10802
+ .styles-module_name__nmepm[data-align='center'] {
10803
+ align-items: center;
10804
+ text-align: center;
10805
+ }
10806
+ /* * */
10807
+ /* CONTAINER */
10808
+
10809
+ .styles-module_container__A88zF {
10810
+ display: flex;
10811
+ flex-direction: row;
10812
+ gap: var(--size-spacing-sm);
10813
+ align-items: center;
10814
+ justify-content: flex-start;
10815
+ }
10816
+
10817
+ /* * */
10818
+ /* COMBOBOX TARGET WRAPPER */
10819
+
10820
+ .styles-module_comboboxTargetWrapper__MxB1r {
10821
+ position: relative;
10822
+ width: 100%;
10823
+ height: auto;
10824
+ }
10825
+
10826
+ /* * */
10827
+ /* COMBOBOX TARGET INPUT */
10828
+
10829
+ .styles-module_comboboxTargetInput__Qle1Y {
10830
+ width: 100%;
10831
+ height: auto;
10832
+ max-height: none;
10833
+ padding: 13px calc(var(--size-spacing-md) + 30px);
10834
+ padding-bottom: 12px;
10835
+ font-size: 18px;
10836
+ line-height: 1;
10837
+ color: var(--color-system-text-100);
10838
+ background-color: var(--color-system-background-100);
10839
+ border: 1px solid var(--color-system-border-200);
10840
+ border-radius: 5px;
10841
+ }
10842
+
10843
+ /* * */
10844
+ /* COMBOBOX TARGET SECTION */
10845
+
10846
+ .styles-module_comboboxTargetSection__Q9IFI {
10847
+ position: absolute;
10848
+ display: flex;
10849
+ width: auto;
10850
+ padding: var(--size-spacing-sm);
10851
+ color: var(--color-system-text-300);
10852
+ }
10853
+
10854
+ .styles-module_comboboxTargetSection__Q9IFI[data-position="left"] {
10855
+ left: 1px;
10856
+ }
10857
+
10858
+ .styles-module_comboboxTargetSection__Q9IFI[data-position="right"] {
10859
+ right: 1px;
10860
+ }
10861
+
10862
+ /* * */
10863
+ /* COMBOBOX OPTION */
10864
+
10865
+ .styles-module_comboboxOption__gQmRA {
10866
+ padding: 6px;
10867
+ }
10868
+
10869
+ /* * */
10870
+ /* SELECTED */
10871
+
10872
+ .styles-module_selected__AYGBH {
10873
+ background-color: var(--color-system-background-200) !important;
10874
+ }
10875
+
10718
10876
  .styles-module_header__6dpaJ {
10719
10877
  position: sticky;
10720
10878
  top: 0;
package/dist/styles.css CHANGED
@@ -10770,6 +10770,164 @@ breakpoint-mobile {
10770
10770
  flex-wrap: wrap-reverse;
10771
10771
  }
10772
10772
 
10773
+ /* * */
10774
+ /* BADGE */
10775
+
10776
+ .styles-module_badge__-PqgE {
10777
+ position: relative;
10778
+ display: flex;
10779
+ align-items: center;
10780
+ justify-content: center;
10781
+ font-weight: var(--font-weight-bold);
10782
+ line-height: 1;
10783
+ color: var(--color-system-background-100);
10784
+ letter-spacing: 1px;
10785
+ background-color: var(--color-system-text-200);
10786
+ border-radius: 999px;
10787
+
10788
+ &[data-size='md'] {
10789
+ min-width: 65px;
10790
+ max-width: 65px;
10791
+ min-height: 26px;
10792
+ max-height: 26px;
10793
+ font-size: 16px;
10794
+ }
10795
+
10796
+ &[data-size='lg'] {
10797
+ min-width: 85px;
10798
+ max-width: 85px;
10799
+ min-height: 34px;
10800
+ max-height: 34px;
10801
+ font-size: 22px;
10802
+ }
10803
+ }
10804
+
10805
+
10806
+ /* * */
10807
+ /* ALERT ICON */
10808
+
10809
+ .styles-module_alertIcon__JtR4k {
10810
+ position: absolute;
10811
+ top: -10px;
10812
+ right: -10px;
10813
+ display: flex;
10814
+ align-items: center;
10815
+ justify-content: center;
10816
+ width: 20px;
10817
+ height: 20px;
10818
+ color: var(--color-status-info-text);
10819
+ background-color: var(--color-primary-white);
10820
+ border-radius: 999px;
10821
+ }
10822
+ /* * */
10823
+ /* NAME */
10824
+
10825
+ .styles-module_name__nmepm {
10826
+ display: -webkit-box;
10827
+ justify-content: flex-start;
10828
+ width: 100%;
10829
+ overflow: hidden;
10830
+ text-overflow: ellipsis;
10831
+ -webkit-line-clamp: 3;
10832
+ color: var(--color-system-text-100);
10833
+ -webkit-box-orient: vertical;
10834
+ }
10835
+
10836
+ /* * */
10837
+ /* SIZE */
10838
+
10839
+ .styles-module_name__nmepm[data-size='md'] {
10840
+ font-size: 15px;
10841
+ font-weight: var(--font-weight-semibold);
10842
+ }
10843
+
10844
+ .styles-module_name__nmepm[data-size='lg'] {
10845
+ font-size: 20px;
10846
+ font-weight: var(--font-weight-semibold);
10847
+ }
10848
+
10849
+ /* * */
10850
+ /* ALIGN */
10851
+
10852
+ .styles-module_name__nmepm[data-align='left'] {
10853
+ align-items: flex-start;
10854
+ text-align: left;
10855
+ }
10856
+
10857
+ .styles-module_name__nmepm[data-align='center'] {
10858
+ align-items: center;
10859
+ text-align: center;
10860
+ }
10861
+ /* * */
10862
+ /* CONTAINER */
10863
+
10864
+ .styles-module_container__A88zF {
10865
+ display: flex;
10866
+ flex-direction: row;
10867
+ gap: var(--size-spacing-sm);
10868
+ align-items: center;
10869
+ justify-content: flex-start;
10870
+ }
10871
+
10872
+ /* * */
10873
+ /* COMBOBOX TARGET WRAPPER */
10874
+
10875
+ .styles-module_comboboxTargetWrapper__MxB1r {
10876
+ position: relative;
10877
+ width: 100%;
10878
+ height: auto;
10879
+ }
10880
+
10881
+ /* * */
10882
+ /* COMBOBOX TARGET INPUT */
10883
+
10884
+ .styles-module_comboboxTargetInput__Qle1Y {
10885
+ width: 100%;
10886
+ height: auto;
10887
+ max-height: none;
10888
+ padding: 13px calc(var(--size-spacing-md) + 30px);
10889
+ padding-bottom: 12px;
10890
+ font-size: 18px;
10891
+ line-height: 1;
10892
+ color: var(--color-system-text-100);
10893
+ background-color: var(--color-system-background-100);
10894
+ border: 1px solid var(--color-system-border-200);
10895
+ border-radius: 5px;
10896
+ }
10897
+
10898
+ /* * */
10899
+ /* COMBOBOX TARGET SECTION */
10900
+
10901
+ .styles-module_comboboxTargetSection__Q9IFI {
10902
+ position: absolute;
10903
+ display: flex;
10904
+ width: auto;
10905
+ padding: var(--size-spacing-sm);
10906
+ color: var(--color-system-text-300);
10907
+ }
10908
+
10909
+ .styles-module_comboboxTargetSection__Q9IFI[data-position="left"] {
10910
+ left: 1px;
10911
+ }
10912
+
10913
+ .styles-module_comboboxTargetSection__Q9IFI[data-position="right"] {
10914
+ right: 1px;
10915
+ }
10916
+
10917
+ /* * */
10918
+ /* COMBOBOX OPTION */
10919
+
10920
+ .styles-module_comboboxOption__gQmRA {
10921
+ padding: 6px;
10922
+ }
10923
+
10924
+ /* * */
10925
+ /* SELECTED */
10926
+
10927
+ .styles-module_selected__AYGBH {
10928
+ background-color: var(--color-system-background-200) !important;
10929
+ }
10930
+
10773
10931
  .styles-module_header__6dpaJ {
10774
10932
  position: sticky;
10775
10933
  top: 0;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tmlmobilidade/ui",
3
3
  "description": "UI components for Transportes Metropolitanos de Lisboa (TML) web applications.",
4
- "version": "20250826.1336.59",
4
+ "version": "20250826.1437.53",
5
5
  "author": "João de Vasconcelos & Jusi Monteiro",
6
6
  "license": "AGPL-3.0-or-later",
7
7
  "publishConfig": {
@@ -42,6 +42,7 @@
42
42
  "path": false
43
43
  },
44
44
  "dependencies": {
45
+ "@carrismetropolitana/api-types": "^20250820.1130.53",
45
46
  "@mantine/core": "8.2.5",
46
47
  "@mantine/dates": "8.2.5",
47
48
  "@mantine/form": "8.2.5",
@@ -58,7 +59,8 @@
58
59
  "mantine-form-zod-resolver": "1.3.0",
59
60
  "maplibre-gl": "5.7.0",
60
61
  "react": "19.x",
61
- "react-viewport-list": "7.1.2"
62
+ "react-viewport-list": "7.1.2",
63
+ "ukkonen": "^2.2.0"
62
64
  },
63
65
  "devDependencies": {
64
66
  "@rollup/plugin-commonjs": "28.0.6",