@marianmeres/stuic 3.181.0 → 3.183.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 (44) hide show
  1. package/README.md +1 -1
  2. package/dist/components/FieldsBuilder/FieldsBuilder.svelte +101 -150
  3. package/dist/components/FieldsBuilder/FieldsBuilder.svelte.d.ts +10 -1
  4. package/dist/components/FieldsBuilder/README.md +82 -3
  5. package/dist/components/FieldsBuilder/_internal/ColumnsEditor.svelte +624 -0
  6. package/dist/components/FieldsBuilder/_internal/ColumnsEditor.svelte.d.ts +41 -0
  7. package/dist/components/FieldsBuilder/_internal/ExtrasEditor.svelte +174 -0
  8. package/dist/components/FieldsBuilder/_internal/ExtrasEditor.svelte.d.ts +20 -0
  9. package/dist/components/FieldsBuilder/_internal/column-meta.d.ts +27 -0
  10. package/dist/components/FieldsBuilder/_internal/column-meta.js +15 -0
  11. package/dist/components/FieldsBuilder/i18n-sk.js +17 -0
  12. package/dist/components/FieldsBuilder/i18n.d.ts +17 -0
  13. package/dist/components/FieldsBuilder/i18n.js +17 -0
  14. package/dist/components/FieldsBuilder/index.css +20 -0
  15. package/dist/components/FieldsBuilder/index.d.ts +2 -2
  16. package/dist/components/FieldsBuilder/types.d.ts +39 -0
  17. package/dist/components/FieldsBuilder/utils.d.ts +36 -1
  18. package/dist/components/FieldsBuilder/utils.js +180 -55
  19. package/dist/components/Input/FieldAssets.svelte +9 -132
  20. package/dist/components/Input/FieldSingleAsset.svelte +876 -0
  21. package/dist/components/Input/FieldSingleAsset.svelte.d.ts +135 -0
  22. package/dist/components/Input/FieldTable.svelte +907 -0
  23. package/dist/components/Input/FieldTable.svelte.d.ts +98 -0
  24. package/dist/components/Input/README.md +467 -20
  25. package/dist/components/Input/_internal/asset-helpers.d.ts +16 -0
  26. package/dist/components/Input/_internal/asset-helpers.js +46 -0
  27. package/dist/components/Input/_internal/paste-target.d.ts +15 -0
  28. package/dist/components/Input/_internal/paste-target.js +114 -0
  29. package/dist/components/Input/field-single-asset-i18n-sk.d.ts +21 -0
  30. package/dist/components/Input/field-single-asset-i18n-sk.js +49 -0
  31. package/dist/components/Input/field-single-asset-i18n.d.ts +68 -0
  32. package/dist/components/Input/field-single-asset-i18n.js +75 -0
  33. package/dist/components/Input/field-table-i18n-sk.d.ts +21 -0
  34. package/dist/components/Input/field-table-i18n-sk.js +41 -0
  35. package/dist/components/Input/field-table-i18n.d.ts +60 -0
  36. package/dist/components/Input/field-table-i18n.js +66 -0
  37. package/dist/components/Input/field-table-number.d.ts +48 -0
  38. package/dist/components/Input/field-table-number.js +86 -0
  39. package/dist/components/Input/index.css +801 -0
  40. package/dist/components/Input/index.d.ts +7 -0
  41. package/dist/components/Input/index.js +7 -0
  42. package/docs/domains/actions.md +3 -3
  43. package/docs/domains/components.md +45 -38
  44. package/package.json +1 -1
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Locale-aware number parsing and formatting for `FieldTable`'s `number` cells.
3
+ *
4
+ * Pure functions (no DOM), so they can be unit-tested in the fast node project.
5
+ * The rule they implement is "never guess": a typed value is either read as one
6
+ * unambiguous number, or rejected.
7
+ */
8
+ /**
9
+ * The decimal separator `Intl` uses for `locale` (`"."` for `en`, `","` for `sk`).
10
+ * `undefined` means the runtime's default locale. An unknown locale falls back to `"."`.
11
+ */
12
+ export function decimalSeparator(locale) {
13
+ try {
14
+ const parts = new Intl.NumberFormat(locale, { useGrouping: false }).formatToParts(1.1);
15
+ return parts.find((p) => p.type === "decimal")?.value ?? ".";
16
+ }
17
+ catch {
18
+ return ".";
19
+ }
20
+ }
21
+ // an optional sign, then digits with at most one dot ("12", "12.", ".5", "-3.2");
22
+ // no exponent, no hex, no trailing garbage
23
+ const DECIMAL_RE = /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)$/;
24
+ /**
25
+ * Parses what a user typed into a number cell.
26
+ *
27
+ * - Whitespace anywhere (including NBSP / narrow NBSP) is stripped: `"1 000"` → `1000`.
28
+ * - `"."` is always accepted as the decimal separator.
29
+ * - `","` is accepted as the decimal separator **only** when `locale` uses it. Under an
30
+ * English locale `"1,000"` is rejected — it is never silently read as a thousands group.
31
+ * - Two separators (`"1.2.3"`, `"1,2,3"`, `"1,000.5"`) are rejected.
32
+ * - A Unicode minus (`"−5"`, what `Intl` formats in some locales) reads as a minus sign.
33
+ * - Blank is `{ ok: true, value: null }`.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * parseCellNumber("4.2", "sk"); // { ok: true, value: 4.2 }
38
+ * parseCellNumber("4,2", "sk"); // { ok: true, value: 4.2 }
39
+ * parseCellNumber("4,2", "en"); // { ok: false }
40
+ * parseCellNumber("1 000", "en"); // { ok: true, value: 1000 }
41
+ * parseCellNumber("", "en"); // { ok: true, value: null }
42
+ * ```
43
+ */
44
+ export function parseCellNumber(raw, locale) {
45
+ let s = String(raw ?? "")
46
+ .replace(/\s+/g, "")
47
+ .replace(/−/g, "-");
48
+ if (s === "")
49
+ return { ok: true, value: null };
50
+ const dots = (s.match(/\./g) ?? []).length;
51
+ const commas = (s.match(/,/g) ?? []).length;
52
+ if (dots + commas > 1)
53
+ return { ok: false };
54
+ if (commas === 1) {
55
+ if (decimalSeparator(locale) !== ",")
56
+ return { ok: false };
57
+ s = s.replace(",", ".");
58
+ }
59
+ if (!DECIMAL_RE.test(s))
60
+ return { ok: false };
61
+ const n = Number(s);
62
+ if (!Number.isFinite(n))
63
+ return { ok: false };
64
+ return { ok: true, value: n };
65
+ }
66
+ /**
67
+ * Formats a number for display in a number cell: no grouping, up to 20 fraction
68
+ * digits (so `4.2` is never rounded away), Latin digits, the locale's decimal
69
+ * separator. A Slovak user sees `4,2` for `4.2`; an English one `4.2`.
70
+ *
71
+ * A non-finite input yields `""`.
72
+ */
73
+ export function formatCellNumber(n, locale) {
74
+ if (typeof n !== "number" || !Number.isFinite(n))
75
+ return "";
76
+ try {
77
+ return new Intl.NumberFormat(locale, {
78
+ useGrouping: false,
79
+ maximumFractionDigits: 20,
80
+ numberingSystem: "latn",
81
+ }).format(n);
82
+ }
83
+ catch {
84
+ return String(n);
85
+ }
86
+ }