@fusion.dev/helix-core 0.206.0 → 0.207.1

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 (59) hide show
  1. package/README.md +22 -13
  2. package/custom-elements.json +1 -37171
  3. package/dist/controllers/aria-forward-controller/aria-forward-controller.js +5 -6
  4. package/dist/controllers/category-axis-controller/category-axis-controller.d.ts +75 -0
  5. package/dist/controllers/category-axis-controller/category-axis-controller.js +128 -0
  6. package/dist/controllers/source-controller/source-controller.d.ts +2 -0
  7. package/dist/controllers/source-controller/source-controller.js +5 -2
  8. package/dist/controllers/virtualize-controller/virtualize-controller.d.ts +9 -0
  9. package/dist/controllers/virtualize-controller/virtualize-controller.js +10 -8
  10. package/dist/helix-element/helix-element.js +3 -21
  11. package/dist/helix-element/react-bridge.d.ts +17 -0
  12. package/dist/helix-element/react-bridge.js +54 -0
  13. package/dist/index.d.ts +8 -2
  14. package/dist/index.js +8 -2
  15. package/dist/mixins/mixin-chart-source/mixin-chart-source.d.ts +28 -0
  16. package/dist/mixins/mixin-chart-source/mixin-chart-source.js +76 -9
  17. package/dist/mixins/mixin-field/mixin-field.js +2 -0
  18. package/dist/mixins/mixin-tokens/mixin-tokens.js +2 -1
  19. package/dist/mixins/mixin-viewport/mixin-viewport.js +3 -2
  20. package/dist/utils/audit-children/audit-children.d.ts +1 -0
  21. package/dist/utils/audit-children/audit-children.js +2 -2
  22. package/dist/utils/audit-name/audit-name.js +2 -2
  23. package/dist/utils/audit-number/audit-number-off.d.ts +12 -0
  24. package/dist/utils/audit-number/audit-number-off.js +2 -0
  25. package/dist/utils/audit-number/audit-number.d.ts +23 -0
  26. package/dist/utils/audit-number/audit-number.js +21 -0
  27. package/dist/utils/category-labels/category-labels.d.ts +74 -0
  28. package/dist/utils/category-labels/category-labels.js +230 -0
  29. package/dist/utils/closest-name/closest-name.d.ts +11 -0
  30. package/dist/utils/closest-name/closest-name.js +35 -0
  31. package/dist/utils/custom-element/custom-element.js +11 -6
  32. package/dist/utils/draw-tooltip/draw-tooltip.js +3 -2
  33. package/dist/utils/host-words/host-words.js +2 -1
  34. package/dist/utils/how-to-register/how-to-register.d.ts +20 -0
  35. package/dist/utils/how-to-register/how-to-register.js +3 -0
  36. package/dist/utils/labels-of/labels-of.d.ts +23 -0
  37. package/dist/utils/labels-of/labels-of.js +8 -0
  38. package/dist/utils/line-path/line-path.d.ts +18 -0
  39. package/dist/utils/line-path/line-path.js +36 -0
  40. package/dist/utils/locale-of/locale-of.d.ts +40 -2
  41. package/dist/utils/locale-of/locale-of.js +30 -16
  42. package/dist/utils/number-converter/number-converter.d.ts +44 -0
  43. package/dist/utils/number-converter/number-converter.js +34 -0
  44. package/dist/utils/read-data/read-data.d.ts +1 -1
  45. package/dist/utils/read-data/read-data.js +23 -10
  46. package/dist/utils/read-series/read-series.js +9 -2
  47. package/dist/utils/report-runtime/report-runtime.d.ts +8 -0
  48. package/dist/utils/scale/scale.d.ts +7 -1
  49. package/dist/utils/scale/scale.js +9 -4
  50. package/dist/utils/scroll-item-into-view/scroll-item-into-view.d.ts +5 -0
  51. package/dist/utils/scroll-item-into-view/scroll-item-into-view.js +3 -2
  52. package/dist/utils/watch-labels/watch-labels.d.ts +4 -2
  53. package/dist/utils/watch-labels/watch-labels.js +14 -14
  54. package/dist/version.d.ts +1 -1
  55. package/dist/version.js +1 -1
  56. package/dist/words/held.d.ts +11 -3
  57. package/dist/words/words-locale.js +20 -8
  58. package/dist/words/words.js +10 -5
  59. package/package.json +16 -4
@@ -5,6 +5,12 @@ export type Pack = Record<string, Record<string, Message | MessageTable>>;
5
5
  export type Speaker = Element & {
6
6
  locale?: string | undefined;
7
7
  };
8
+ /**
9
+ * What an element's locale is worked out from: its `locale`, then the `lang`
10
+ * read for it or `null` for none, and on a server or while hydrating, the
11
+ * default. See `sourceOf` in `words-locale.ts`.
12
+ */
13
+ export type LocaleSource = readonly [own: string, lang: string | null, fallback?: string];
8
14
  /** What the page has registered, kept on `globalThis`. */
9
15
  interface Held {
10
16
  /** Each locale's words, under its lowercase tag. */
@@ -19,8 +25,10 @@ interface Held {
19
25
  observed?: boolean;
20
26
  /** Finds a registered word for an element, set by the first `registerWords`. */
21
27
  find?: (host: Speaker, tag: string, name: string) => [Message | MessageTable, string] | undefined;
22
- /** Reads the locale an element speaks, set where `wordsLocale` is loaded. */
23
- locale?: (host: Speaker) => string;
28
+ /** Reads what an element's locale is worked out from, set where `wordsLocale` is loaded. */
29
+ source?: (host: Speaker) => LocaleSource;
30
+ /** Works out the locale from what `source` read. */
31
+ from?: (source: LocaleSource) => string;
24
32
  }
25
33
  /**
26
34
  * The page's words, held on `globalThis`.
@@ -32,7 +40,7 @@ interface Held {
32
40
  * **What every element reads, and nothing more.** An element with a word
33
41
  * property reads its English until a page registers words, so the lookup and
34
42
  * the locale chain arrive with `registerWords`, which puts its lookup in
35
- * `find`, and the locale with `wordsLocale`, which puts itself in `locale`. A
43
+ * `find`, and the locale with `wordsLocale`, which puts its reads in `source` and `from`. A
36
44
  * page that registers no words and formats no numbers ships neither: measured
37
45
  * on Button, 474 bytes of its 13,437 compressed.
38
46
  */
@@ -1,4 +1,4 @@
1
- import { localeOf, runtimeLocale } from '../utils/locale-of/locale-of.js';
1
+ import { localeOf, nearestLang, runtimeLocale, usableLocale } from '../utils/locale-of/locale-of.js';
2
2
  import { held, watchLang } from './held.js';
3
3
  const checked = new Map();
4
4
  const tagOf = (written) => {
@@ -14,18 +14,30 @@ const tagOf = (written) => {
14
14
  }
15
15
  return found;
16
16
  };
17
- export const wordsLocale = (element) => {
17
+ export const wordsLocale = (element) => localeFrom(sourceOf(element));
18
+ const sourceOf = (element) => {
18
19
  watchLang();
19
- const own = tagOf(element.locale || '');
20
- if (own) {
21
- return own;
20
+ const own = element.locale || '';
21
+ if (tagOf(own)) {
22
+ return [own, null];
22
23
  }
23
24
  if (typeof element.closest !== 'function' || element.hydrating) {
24
- return tagOf(element.getAttribute?.('lang') ?? '') || held.fallback;
25
+ return [own, element.getAttribute?.('lang') ?? '', held.fallback];
25
26
  }
26
- return localeOf(element) || runtimeLocale();
27
+ return [own, nearestLang(element) ?? null];
27
28
  };
28
- held.locale = wordsLocale;
29
+ const localeFrom = ([own, lang, fallback]) => {
30
+ const tag = tagOf(own);
31
+ if (tag) {
32
+ return tag;
33
+ }
34
+ if (fallback !== undefined) {
35
+ return tagOf(lang ?? '') || fallback;
36
+ }
37
+ return (lang === null ? '' : usableLocale(lang)) || runtimeLocale();
38
+ };
39
+ held.source = sourceOf;
40
+ held.from = localeFrom;
29
41
  export const handedLocale = (element) => {
30
42
  const own = typeof element.locale === 'string' ? element.locale : '';
31
43
  return element.hydrating ? own : localeOf(element, own);
@@ -39,17 +39,22 @@ const recheck = (host) => {
39
39
  }
40
40
  }
41
41
  };
42
+ const localeMoved = (before, after) => before !== undefined &&
43
+ after !== undefined &&
44
+ (before.length !== after.length || before.some((one, at) => one !== after[at])) &&
45
+ held.from?.(before) !== held.from?.(after);
42
46
  const watcher = (host) => {
43
47
  let stop;
44
- let locale = '';
48
+ let source;
45
49
  return {
46
50
  hostConnected: () => {
47
- locale = held.locale?.(host) ?? '';
51
+ source = held.source?.(host);
48
52
  stop = watchWords(() => {
49
53
  recheck(host);
50
- const now = held.locale?.(host) ?? '';
51
- if (now !== locale) {
52
- locale = now;
54
+ const now = held.source?.(host);
55
+ const moved = localeMoved(source, now);
56
+ source = now;
57
+ if (moved) {
53
58
  host.requestUpdate();
54
59
  }
55
60
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix-core",
3
3
  "description": "Helix element primitives: base classes, mixins, decorators, utilities.",
4
- "version": "0.206.0",
4
+ "version": "0.207.1",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -35,6 +35,12 @@
35
35
  "helix-development": "./dist/utils/audit-nesting/audit-nesting.js",
36
36
  "default": "./dist/utils/audit-nesting/audit-nesting-off.js"
37
37
  },
38
+ "./audits/number": {
39
+ "types": "./dist/utils/audit-number/audit-number.d.ts",
40
+ "development": "./dist/utils/audit-number/audit-number.js",
41
+ "helix-development": "./dist/utils/audit-number/audit-number.js",
42
+ "default": "./dist/utils/audit-number/audit-number-off.js"
43
+ },
38
44
  "./audits/react": {
39
45
  "types": "./dist/helix-element/react-audit.d.ts",
40
46
  "development": "./dist/helix-element/react-audit.js",
@@ -54,6 +60,7 @@
54
60
  "default": "./dist/utils/audit-source/audit-source-off.js"
55
61
  },
56
62
  "./custom-elements.json": "./custom-elements.json",
63
+ "./package.json": "./package.json",
57
64
  "./words": {
58
65
  "types": "./dist/words/index.d.ts",
59
66
  "default": "./dist/words/index.js"
@@ -74,12 +81,12 @@
74
81
  "bugs": "https://github.com/project-fusion/fusion/issues",
75
82
  "dependencies": {
76
83
  "@floating-ui/dom": "^1.8.0",
77
- "@fusion.dev/helix-icons": "0.206.0",
84
+ "@fusion.dev/helix-icons": "0.207.1",
78
85
  "tslib": "^2.8.1"
79
86
  },
80
87
  "devDependencies": {
81
- "@fusion.dev/helix-cem": "0.206.0",
82
- "@fusion.dev/helix-testing": "0.206.0",
88
+ "@fusion.dev/helix-cem": "0.207.1",
89
+ "@fusion.dev/helix-testing": "0.207.1",
83
90
  "@lit-labs/ssr": "^4.1.0",
84
91
  "lit": "^3.2.1"
85
92
  },
@@ -100,6 +107,11 @@
100
107
  "helix-development": "./src/utils/audit-nesting/audit-nesting.ts",
101
108
  "default": "./src/utils/audit-nesting/audit-nesting-off.ts"
102
109
  },
110
+ "#audit-number": {
111
+ "development": "./src/utils/audit-number/audit-number.ts",
112
+ "helix-development": "./src/utils/audit-number/audit-number.ts",
113
+ "default": "./src/utils/audit-number/audit-number-off.ts"
114
+ },
103
115
  "#audit-served": {
104
116
  "development": "./src/utils/audit-served/audit-served.ts",
105
117
  "helix-development": "./src/utils/audit-served/audit-served.ts",