@rowsncolumns/utils 9.2.35

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 (154) hide show
  1. package/LICENSE.md +100 -0
  2. package/dist/cjs/array.d.ts +3 -0
  3. package/dist/cjs/array.d.ts.map +1 -0
  4. package/dist/cjs/array.js +19 -0
  5. package/dist/cjs/cell-data-helpers.d.ts +19 -0
  6. package/dist/cjs/cell-data-helpers.d.ts.map +1 -0
  7. package/dist/cjs/cell-data-helpers.js +64 -0
  8. package/dist/cjs/color.d.ts +20 -0
  9. package/dist/cjs/color.d.ts.map +1 -0
  10. package/dist/cjs/color.js +168 -0
  11. package/dist/cjs/colors.d.ts +2 -0
  12. package/dist/cjs/colors.d.ts.map +1 -0
  13. package/dist/cjs/colors.js +78 -0
  14. package/dist/cjs/conditional-format.d.ts +49 -0
  15. package/dist/cjs/conditional-format.d.ts.map +1 -0
  16. package/dist/cjs/conditional-format.js +227 -0
  17. package/dist/cjs/content-hash.d.ts +16 -0
  18. package/dist/cjs/content-hash.d.ts.map +1 -0
  19. package/dist/cjs/content-hash.js +72 -0
  20. package/dist/cjs/data-validation.d.ts +54 -0
  21. package/dist/cjs/data-validation.d.ts.map +1 -0
  22. package/dist/cjs/data-validation.js +249 -0
  23. package/dist/cjs/date.d.ts +15 -0
  24. package/dist/cjs/date.d.ts.map +1 -0
  25. package/dist/cjs/date.js +56 -0
  26. package/dist/cjs/dom.d.ts +10 -0
  27. package/dist/cjs/dom.d.ts.map +1 -0
  28. package/dist/cjs/dom.js +97 -0
  29. package/dist/cjs/formatter.d.ts +22 -0
  30. package/dist/cjs/formatter.d.ts.map +1 -0
  31. package/dist/cjs/formatter.js +264 -0
  32. package/dist/cjs/formula-refs.d.ts +7 -0
  33. package/dist/cjs/formula-refs.d.ts.map +1 -0
  34. package/dist/cjs/formula-refs.js +54 -0
  35. package/dist/cjs/formula.d.ts +80 -0
  36. package/dist/cjs/formula.d.ts.map +1 -0
  37. package/dist/cjs/formula.js +401 -0
  38. package/dist/cjs/index.d.ts +24 -0
  39. package/dist/cjs/index.d.ts.map +1 -0
  40. package/dist/cjs/index.js +26 -0
  41. package/dist/cjs/locale.d.ts +34 -0
  42. package/dist/cjs/locale.d.ts.map +1 -0
  43. package/dist/cjs/locale.js +260 -0
  44. package/dist/cjs/log.d.ts +4 -0
  45. package/dist/cjs/log.d.ts.map +1 -0
  46. package/dist/cjs/log.js +28 -0
  47. package/dist/cjs/memoize.d.ts +18 -0
  48. package/dist/cjs/memoize.d.ts.map +1 -0
  49. package/dist/cjs/memoize.js +128 -0
  50. package/dist/cjs/numbers.d.ts +19 -0
  51. package/dist/cjs/numbers.d.ts.map +1 -0
  52. package/dist/cjs/numbers.js +47 -0
  53. package/dist/cjs/selection.d.ts +88 -0
  54. package/dist/cjs/selection.d.ts.map +1 -0
  55. package/dist/cjs/selection.js +368 -0
  56. package/dist/cjs/shared-string-canonical.d.ts +18 -0
  57. package/dist/cjs/shared-string-canonical.d.ts.map +1 -0
  58. package/dist/cjs/shared-string-canonical.js +74 -0
  59. package/dist/cjs/sort.d.ts +15 -0
  60. package/dist/cjs/sort.d.ts.map +1 -0
  61. package/dist/cjs/sort.js +44 -0
  62. package/dist/cjs/string.d.ts +74 -0
  63. package/dist/cjs/string.d.ts.map +1 -0
  64. package/dist/cjs/string.js +237 -0
  65. package/dist/cjs/table-styles.d.ts +56 -0
  66. package/dist/cjs/table-styles.d.ts.map +1 -0
  67. package/dist/cjs/table-styles.js +362 -0
  68. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  69. package/dist/cjs/typeguards.d.ts +4 -0
  70. package/dist/cjs/typeguards.d.ts.map +1 -0
  71. package/dist/cjs/typeguards.js +15 -0
  72. package/dist/cjs/uuid.d.ts +8 -0
  73. package/dist/cjs/uuid.d.ts.map +1 -0
  74. package/dist/cjs/uuid.js +30 -0
  75. package/dist/cjs/vitest.config.d.ts +3 -0
  76. package/dist/cjs/vitest.config.d.ts.map +1 -0
  77. package/dist/cjs/vitest.config.js +9 -0
  78. package/dist/esm/array.d.ts +3 -0
  79. package/dist/esm/array.d.ts.map +1 -0
  80. package/dist/esm/array.js +14 -0
  81. package/dist/esm/cell-data-helpers.d.ts +19 -0
  82. package/dist/esm/cell-data-helpers.d.ts.map +1 -0
  83. package/dist/esm/cell-data-helpers.js +39 -0
  84. package/dist/esm/color.d.ts +20 -0
  85. package/dist/esm/color.d.ts.map +1 -0
  86. package/dist/esm/color.js +152 -0
  87. package/dist/esm/colors.d.ts +2 -0
  88. package/dist/esm/colors.d.ts.map +1 -0
  89. package/dist/esm/colors.js +75 -0
  90. package/dist/esm/conditional-format.d.ts +49 -0
  91. package/dist/esm/conditional-format.d.ts.map +1 -0
  92. package/dist/esm/conditional-format.js +219 -0
  93. package/dist/esm/content-hash.d.ts +16 -0
  94. package/dist/esm/content-hash.d.ts.map +1 -0
  95. package/dist/esm/content-hash.js +68 -0
  96. package/dist/esm/data-validation.d.ts +54 -0
  97. package/dist/esm/data-validation.d.ts.map +1 -0
  98. package/dist/esm/data-validation.js +237 -0
  99. package/dist/esm/date.d.ts +15 -0
  100. package/dist/esm/date.d.ts.map +1 -0
  101. package/dist/esm/date.js +46 -0
  102. package/dist/esm/dom.d.ts +10 -0
  103. package/dist/esm/dom.d.ts.map +1 -0
  104. package/dist/esm/dom.js +90 -0
  105. package/dist/esm/formatter.d.ts +22 -0
  106. package/dist/esm/formatter.d.ts.map +1 -0
  107. package/dist/esm/formatter.js +253 -0
  108. package/dist/esm/formula-refs.d.ts +7 -0
  109. package/dist/esm/formula-refs.d.ts.map +1 -0
  110. package/dist/esm/formula-refs.js +49 -0
  111. package/dist/esm/formula.d.ts +80 -0
  112. package/dist/esm/formula.d.ts.map +1 -0
  113. package/dist/esm/formula.js +298 -0
  114. package/dist/esm/index.d.ts +24 -0
  115. package/dist/esm/index.d.ts.map +1 -0
  116. package/dist/esm/index.js +23 -0
  117. package/dist/esm/locale.d.ts +34 -0
  118. package/dist/esm/locale.d.ts.map +1 -0
  119. package/dist/esm/locale.js +223 -0
  120. package/dist/esm/log.d.ts +4 -0
  121. package/dist/esm/log.d.ts.map +1 -0
  122. package/dist/esm/log.js +3 -0
  123. package/dist/esm/memoize.d.ts +18 -0
  124. package/dist/esm/memoize.d.ts.map +1 -0
  125. package/dist/esm/memoize.js +95 -0
  126. package/dist/esm/numbers.d.ts +19 -0
  127. package/dist/esm/numbers.d.ts.map +1 -0
  128. package/dist/esm/numbers.js +40 -0
  129. package/dist/esm/selection.d.ts +88 -0
  130. package/dist/esm/selection.d.ts.map +1 -0
  131. package/dist/esm/selection.js +311 -0
  132. package/dist/esm/shared-string-canonical.d.ts +18 -0
  133. package/dist/esm/shared-string-canonical.d.ts.map +1 -0
  134. package/dist/esm/shared-string-canonical.js +68 -0
  135. package/dist/esm/sort.d.ts +15 -0
  136. package/dist/esm/sort.d.ts.map +1 -0
  137. package/dist/esm/sort.js +39 -0
  138. package/dist/esm/string.d.ts +74 -0
  139. package/dist/esm/string.d.ts.map +1 -0
  140. package/dist/esm/string.js +213 -0
  141. package/dist/esm/table-styles.d.ts +56 -0
  142. package/dist/esm/table-styles.d.ts.map +1 -0
  143. package/dist/esm/table-styles.js +367 -0
  144. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  145. package/dist/esm/typeguards.d.ts +4 -0
  146. package/dist/esm/typeguards.d.ts.map +1 -0
  147. package/dist/esm/typeguards.js +7 -0
  148. package/dist/esm/uuid.d.ts +8 -0
  149. package/dist/esm/uuid.d.ts.map +1 -0
  150. package/dist/esm/uuid.js +25 -0
  151. package/dist/esm/vitest.config.d.ts +3 -0
  152. package/dist/esm/vitest.config.d.ts.map +1 -0
  153. package/dist/esm/vitest.config.js +7 -0
  154. package/package.json +49 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Sort sheets by index
3
+ * @param sheets
4
+ * @returns
5
+ */
6
+ export const sortSheetsByIndex = (sheets, includeHidden) => {
7
+ const filtered = sheets
8
+ .filter(Boolean)
9
+ .filter((sheet) => includeHidden ? sheet.title : !sheet.hidden && sheet.title);
10
+ // Remove duplicate sheets with the same sheetId, keeping only the first occurrence
11
+ const seen = new Set();
12
+ const deduplicated = filtered.filter((sheet) => {
13
+ if (seen.has(sheet.sheetId)) {
14
+ return false;
15
+ }
16
+ seen.add(sheet.sheetId);
17
+ return true;
18
+ });
19
+ // Collect indices that are already defined
20
+ const usedIndices = new Set(deduplicated
21
+ .map((sheet) => sheet.index)
22
+ .filter((index) => index !== undefined && index !== null));
23
+ // Assign indices to sheets without one, starting from 0 and skipping used indices
24
+ let nextIndex = 0;
25
+ const getNextAvailableIndex = () => {
26
+ while (usedIndices.has(nextIndex)) {
27
+ nextIndex++;
28
+ }
29
+ return nextIndex++;
30
+ };
31
+ return deduplicated
32
+ .map((sheet) => {
33
+ return {
34
+ ...sheet,
35
+ index: sheet.index ?? getNextAvailableIndex(),
36
+ };
37
+ })
38
+ .sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
39
+ };
@@ -0,0 +1,74 @@
1
+ import type { CellInterface, GridRange } from "@rowsncolumns/common-types";
2
+ /**
3
+ * Convert cell to bounds.
4
+ * Its better to use gridref.current.getCellBounds() instead as it caters
5
+ * to merged cells
6
+ * @param cell
7
+ * @returns
8
+ */
9
+ export declare const convertCellToRange: (cell: CellInterface) => GridRange;
10
+ /**
11
+ * Converts address string to CellInterface
12
+ * @param address
13
+ */
14
+ export declare const addressToCell: (address: string, options?: {
15
+ position?: "start" | "end";
16
+ rowCount?: number;
17
+ columnCount?: number;
18
+ }) => CellInterface | null;
19
+ /**
20
+ * Gets column from address $G => G
21
+ * @param address
22
+ */
23
+ export declare const getColumnNameFromAddress: (address: string) => string | undefined;
24
+ /**
25
+ * Gets rowIndex from address $1 => 1
26
+ * @param address
27
+ */
28
+ export declare const getRowIndexFromAddress: (address: string) => string | undefined;
29
+ /**
30
+ * Convert cellInterface to address string
31
+ * @param cell
32
+ */
33
+ export declare const cellToAddress: (cell: CellInterface | null, isAbsoluteColumn?: boolean, isAbsoluteRow?: boolean, isFullColumn?: boolean, isFullRow?: boolean) => string | null;
34
+ /**
35
+ * Convert a cell range to address
36
+ * @param sheetName
37
+ * @param range
38
+ * @returns
39
+ */
40
+ export declare const cellRangeToAddress: (sheetName: string | undefined, range: GridRange) => string;
41
+ export declare const sanitizeSheetName: (name: string | undefined) => string | undefined;
42
+ /**
43
+ * Remove single quotes from sheetname
44
+ * 'Sheet Space!A4' => Sheet Space
45
+ * @param name
46
+ * @returns
47
+ */
48
+ export declare const desanitizeSheetName: (name: string | undefined) => string | undefined;
49
+ /**
50
+ * Escape special characters
51
+ * @param str
52
+ * @returns
53
+ */
54
+ export declare const escapeCharacters: (str: string) => string;
55
+ /**
56
+ * Get selection from start and end cell
57
+ * @param start
58
+ * @param end
59
+ * @param sheetName
60
+ * @returns
61
+ */
62
+ export declare const selectionBoundsFromCells: (start: CellInterface, end?: CellInterface | null) => GridRange;
63
+ export declare const supplant: (s: string, o: Record<string, any>) => string;
64
+ /**
65
+ * Normalize an external hyperlink target for the browser. A stored URL
66
+ * without a scheme ("paradigm.xyz") would otherwise be resolved relative to
67
+ * the current page. Prefixes https:// unless the URL already has a scheme
68
+ * (https:, mailto:, tel:, …), is protocol-relative ("//host"), or is a
69
+ * fragment/path reference.
70
+ * @param url
71
+ * @returns
72
+ */
73
+ export declare const normalizeExternalUrl: (url: string) => string;
74
+ //# sourceMappingURL=string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../string.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAK3E;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,aAAa,KAAG,SAKvD,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,MAAM,EACf,UAAS;IACP,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACjB,KACL,aAAa,GAAG,IAuDlB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,SAAS,MAAM,uBAEvD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,MAAM,uBAErD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,MAAM,aAAa,GAAG,IAAI,EAC1B,0BAAwB,EACxB,uBAAqB,EACrB,sBAAoB,EACpB,mBAAiB,KAChB,MAAM,GAAG,IAiBX,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,WAAW,MAAM,GAAG,SAAS,EAC7B,OAAO,SAAS,WAUjB,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,GAAG,SAAS,uBASzD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,GAAG,SAAS,uBAgB3D,CAAC;AAKF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,WAI3C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,GACnC,OAAO,aAAa,EACpB,MAAK,aAAa,GAAG,IAAY,KAChC,SAQF,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,WAKzD,CAAC;AAKF;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,GAAI,KAAK,MAAM,WAY/C,CAAC"}
@@ -0,0 +1,213 @@
1
+ import { isNil } from "./typeguards";
2
+ import { alpha2number, number2Alpha } from "./numbers";
3
+ import { MAX_COLUMN_COUNT, MAX_ROW_COUNT } from "./selection";
4
+ /**
5
+ * Convert cell to bounds.
6
+ * Its better to use gridref.current.getCellBounds() instead as it caters
7
+ * to merged cells
8
+ * @param cell
9
+ * @returns
10
+ */
11
+ export const convertCellToRange = (cell) => ({
12
+ startRowIndex: cell.rowIndex,
13
+ startColumnIndex: cell.columnIndex,
14
+ endRowIndex: cell.rowIndex,
15
+ endColumnIndex: cell.columnIndex,
16
+ });
17
+ /**
18
+ * Converts address string to CellInterface
19
+ * @param address
20
+ */
21
+ export const addressToCell = (address, options = {}) => {
22
+ const { position, rowCount, columnCount } = options;
23
+ const maxRow = typeof rowCount === "number"
24
+ ? Math.min(rowCount, MAX_ROW_COUNT)
25
+ : MAX_ROW_COUNT;
26
+ const maxColumn = typeof columnCount === "number"
27
+ ? Math.min(columnCount, MAX_COLUMN_COUNT)
28
+ : MAX_COLUMN_COUNT;
29
+ const regex = /\$?([A-Z]+)\$?(\d+)/gim;
30
+ let m;
31
+ const matches = [];
32
+ while ((m = regex.exec(address)) !== null) {
33
+ // This is necessary to avoid infinite loops with zero-width matches
34
+ if (m.index === regex.lastIndex) {
35
+ regex.lastIndex++;
36
+ }
37
+ // The result can be accessed through the `m`-variable.
38
+ m.forEach((match, groupIndex) => {
39
+ if (groupIndex > 0)
40
+ matches.push(match);
41
+ });
42
+ }
43
+ if (matches.length) {
44
+ const [columnAlpha, rowIndex] = matches;
45
+ return {
46
+ rowIndex: Math.min(parseInt(rowIndex), maxRow),
47
+ columnIndex: Math.min(alpha2number(columnAlpha), maxColumn),
48
+ };
49
+ }
50
+ // Column range
51
+ if (/^\$?([A-Z]+)$/gim.test(address) && rowCount !== undefined) {
52
+ const column = getColumnNameFromAddress(address);
53
+ if (!column) {
54
+ return null;
55
+ }
56
+ return {
57
+ rowIndex: position === "start" ? 1 : maxRow,
58
+ columnIndex: Math.min(alpha2number(column), maxColumn),
59
+ };
60
+ }
61
+ // Row range
62
+ if (/^\$?(\d+)$/gim.test(address) && columnCount !== undefined) {
63
+ const rowIndexString = getRowIndexFromAddress(address);
64
+ return {
65
+ rowIndex: Math.min(Number(rowIndexString), maxRow),
66
+ columnIndex: position === "start" ? 1 : maxColumn,
67
+ };
68
+ }
69
+ return null;
70
+ };
71
+ /**
72
+ * Gets column from address $G => G
73
+ * @param address
74
+ */
75
+ export const getColumnNameFromAddress = (address) => {
76
+ return /^\$?([A-Z]+)$/gim.exec(address)?.[1];
77
+ };
78
+ /**
79
+ * Gets rowIndex from address $1 => 1
80
+ * @param address
81
+ */
82
+ export const getRowIndexFromAddress = (address) => {
83
+ return /^\$?(\d+)$/gim.exec(address)?.[1];
84
+ };
85
+ /**
86
+ * Convert cellInterface to address string
87
+ * @param cell
88
+ */
89
+ export const cellToAddress = (cell, isAbsoluteColumn = false, isAbsoluteRow = false, isFullColumn = false, isFullRow = false) => {
90
+ if (!cell)
91
+ return null;
92
+ if (cell.columnIndex <= 0) {
93
+ // return null;
94
+ }
95
+ let columnAlpha = number2Alpha(Math.max(0, cell.columnIndex - 1));
96
+ let rowNumber = Math.max(0, cell.rowIndex);
97
+ if (isFullColumn) {
98
+ return columnAlpha;
99
+ }
100
+ if (isFullRow) {
101
+ return String(rowNumber);
102
+ }
103
+ return `${isAbsoluteColumn ? "$" : ""}${columnAlpha}${isAbsoluteRow ? "$" : ""}${rowNumber}`;
104
+ };
105
+ /**
106
+ * Convert a cell range to address
107
+ * @param sheetName
108
+ * @param range
109
+ * @returns
110
+ */
111
+ export const cellRangeToAddress = (sheetName, range) => {
112
+ const sheetNameStr = sheetName ? sanitizeSheetName(sheetName) + "!" : "";
113
+ return `${sheetNameStr}${cellToAddress({
114
+ rowIndex: range.startRowIndex,
115
+ columnIndex: range.startColumnIndex,
116
+ })}:${cellToAddress({
117
+ rowIndex: range.endRowIndex,
118
+ columnIndex: range.endColumnIndex,
119
+ })}`;
120
+ };
121
+ /* Sanitize sheet names */
122
+ export const sanitizeSheetName = (name) => {
123
+ if (name === void 0)
124
+ return void 0;
125
+ if (typeof name === "number")
126
+ return name;
127
+ if (/\s+|[^a-z|A-Z|0-9]/.test(name)) {
128
+ // Escape single quotes by doubling them for valid sheet references.
129
+ const escaped = name.replace(/'/g, "''");
130
+ return `'${escaped}'`;
131
+ }
132
+ return name;
133
+ };
134
+ /**
135
+ * Remove single quotes from sheetname
136
+ * 'Sheet Space!A4' => Sheet Space
137
+ * @param name
138
+ * @returns
139
+ */
140
+ export const desanitizeSheetName = (name) => {
141
+ if (isNil(name)) {
142
+ return undefined;
143
+ }
144
+ if (typeof name === "number") {
145
+ return name;
146
+ }
147
+ let result = name;
148
+ const hasTrailingBang = result.endsWith("!");
149
+ if (hasTrailingBang) {
150
+ result = result.slice(0, -1);
151
+ }
152
+ if (result.startsWith("'") && result.endsWith("'")) {
153
+ result = result.slice(1, -1).replace(/''/g, "'");
154
+ }
155
+ return hasTrailingBang ? `${result}!` : result;
156
+ };
157
+ // Special character
158
+ const SPECIAL_CHARACTERS = /([\\^$.*+?()[\]{}|])/gm;
159
+ /**
160
+ * Escape special characters
161
+ * @param str
162
+ * @returns
163
+ */
164
+ export const escapeCharacters = (str) => {
165
+ return SPECIAL_CHARACTERS.test(str)
166
+ ? str.replace(SPECIAL_CHARACTERS, "\\$1")
167
+ : str || "";
168
+ };
169
+ /**
170
+ * Get selection from start and end cell
171
+ * @param start
172
+ * @param end
173
+ * @param sheetName
174
+ * @returns
175
+ */
176
+ export const selectionBoundsFromCells = (start, end = start) => {
177
+ if (!end)
178
+ end = start;
179
+ return {
180
+ startRowIndex: Math.min(start.rowIndex, end.rowIndex),
181
+ startColumnIndex: Math.min(start.columnIndex, end.columnIndex),
182
+ endColumnIndex: Math.max(start.columnIndex, end.columnIndex),
183
+ endRowIndex: Math.max(start.rowIndex, end.rowIndex),
184
+ };
185
+ };
186
+ export const supplant = (s, o) => {
187
+ return s.replace(/{([^{}]*)}/g, (a, b) => {
188
+ const r = o[b];
189
+ return typeof r === "string" ? r : a;
190
+ });
191
+ };
192
+ // RFC 3986 scheme: ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) ":"
193
+ const URL_SCHEME = /^[a-zA-Z][a-zA-Z0-9+.-]*:/;
194
+ /**
195
+ * Normalize an external hyperlink target for the browser. A stored URL
196
+ * without a scheme ("paradigm.xyz") would otherwise be resolved relative to
197
+ * the current page. Prefixes https:// unless the URL already has a scheme
198
+ * (https:, mailto:, tel:, …), is protocol-relative ("//host"), or is a
199
+ * fragment/path reference.
200
+ * @param url
201
+ * @returns
202
+ */
203
+ export const normalizeExternalUrl = (url) => {
204
+ const trimmed = url.trim();
205
+ if (!trimmed ||
206
+ URL_SCHEME.test(trimmed) ||
207
+ trimmed.startsWith("//") ||
208
+ trimmed.startsWith("#") ||
209
+ trimmed.startsWith("/")) {
210
+ return trimmed;
211
+ }
212
+ return `https://${trimmed}`;
213
+ };
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Table styles and banded range utilities
3
+ * Shared between toolkit (import) and app (rendering)
4
+ */
5
+ import type { ColorIndex } from "@rowsncolumns/common-types";
6
+ export type Maybe<T> = T | null | undefined;
7
+ export type ColorTheme = {
8
+ theme: ColorIndex;
9
+ tint?: Maybe<number>;
10
+ };
11
+ export type Color = string | ColorTheme;
12
+ export type BorderStyle = "dotted" | "dashed" | "solid" | "thin" | "solid_medium" | "solid_thick" | "double";
13
+ export type Border = {
14
+ style: BorderStyle;
15
+ width: number;
16
+ color?: Maybe<Color>;
17
+ };
18
+ export type Borders = {
19
+ top?: Maybe<Border>;
20
+ bottom?: Maybe<Border>;
21
+ left?: Maybe<Border>;
22
+ right?: Maybe<Border>;
23
+ };
24
+ export type BandingProperties = {
25
+ headerColor?: Maybe<Color>;
26
+ footerColor?: Maybe<Color>;
27
+ firstBandColor?: Maybe<Color>;
28
+ secondBandColor?: Maybe<Color>;
29
+ headerBorder?: Maybe<Borders>;
30
+ footerBorder?: Maybe<Borders>;
31
+ firstBandBorder?: Maybe<Borders>;
32
+ secondBandBorder?: Maybe<Borders>;
33
+ totalRowColor?: Maybe<Color>;
34
+ totalRowBorder?: Maybe<Borders>;
35
+ };
36
+ export type BandedDefinition = {
37
+ rowProperties?: Maybe<BandingProperties>;
38
+ columnProperties?: Maybe<BandingProperties>;
39
+ };
40
+ export type TableTheme = "None" | "TableStyleLight1" | "TableStyleLight2" | "TableStyleLight3" | "TableStyleLight4" | "TableStyleLight5" | "TableStyleLight6" | "TableStyleLight7" | "TableStyleLight8" | "TableStyleLight9" | "TableStyleLight10" | "TableStyleLight11" | "TableStyleLight12" | "TableStyleLight13" | "TableStyleLight14" | "TableStyleLight15" | "TableStyleLight16" | "TableStyleLight17" | "TableStyleLight18" | "TableStyleLight19" | "TableStyleLight20" | "TableStyleLight21" | "TableStyleMedium1" | "TableStyleMedium2" | "TableStyleMedium3" | "TableStyleMedium4" | "TableStyleMedium5" | "TableStyleMedium6" | "TableStyleMedium7" | "TableStyleMedium8" | "TableStyleMedium9" | "TableStyleMedium10" | "TableStyleMedium11" | "TableStyleMedium12" | "TableStyleMedium13" | "TableStyleMedium14" | "TableStyleMedium15" | "TableStyleMedium16" | "TableStyleMedium17" | "TableStyleMedium18" | "TableStyleMedium19" | "TableStyleMedium20" | "TableStyleMedium21" | "TableStyleMedium22" | "TableStyleMedium23" | "TableStyleMedium24" | "TableStyleMedium25" | "TableStyleMedium26" | "TableStyleMedium27" | "TableStyleMedium28" | "TableStyleDark1" | "TableStyleDark2" | "TableStyleDark3" | "TableStyleDark4" | "TableStyleDark5" | "TableStyleDark6" | "TableStyleDark7" | "TableStyleDark8" | "TableStyleDark9" | "TableStyleDark10" | "TableStyleDark11";
41
+ type TableStyleEntry = [
42
+ theme: TableTheme,
43
+ firstBandStripeTint: number | undefined,
44
+ secondBandTint: number | undefined,
45
+ bandDefinition: BandedDefinition | undefined
46
+ ];
47
+ /**
48
+ * Get table border styles map with all table themes and their banded definitions
49
+ */
50
+ export declare const getTableBorderStyles: (showRowStripes: boolean | undefined, showColumnStripes: boolean | undefined) => Map<string, TableStyleEntry[]>;
51
+ /**
52
+ * Find the banded definition for a given table theme
53
+ */
54
+ export declare const findMatchingBandProperty: (tableTheme: TableTheme, showRowStripes: boolean | undefined, showColumnStripes: boolean | undefined) => BandedDefinition | undefined;
55
+ export {};
56
+ //# sourceMappingURL=table-styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-styles.d.ts","sourceRoot":"","sources":["../../table-styles.ts"],"names":[],"mappings":"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"}