@fusion.dev/helix-core 0.176.1 → 0.177.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 (28) hide show
  1. package/custom-elements.json +218 -70
  2. package/dist/controllers/chart-pointer-controller/chart-pointer-controller.d.ts +6 -0
  3. package/dist/controllers/chart-pointer-controller/chart-pointer-controller.js +2 -1
  4. package/dist/controllers/source-controller/source-controller.js +6 -2
  5. package/dist/helix-form-element/helix-form-element.d.ts +13 -3
  6. package/dist/helix-form-element/helix-form-element.js +23 -1
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.js +1 -0
  9. package/dist/mixins/mixin-chart-source/mixin-chart-source.d.ts +6 -0
  10. package/dist/mixins/mixin-chart-source/mixin-chart-source.js +14 -0
  11. package/dist/mixins/mixin-chart-status/mixin-chart-status.d.ts +21 -3
  12. package/dist/mixins/mixin-chart-status/mixin-chart-status.js +17 -0
  13. package/dist/mixins/mixin-picker-editing/mixin-picker-editing.js +13 -3
  14. package/dist/utils/audit-nesting/audit-nesting-off.d.ts +10 -0
  15. package/dist/utils/audit-nesting/audit-nesting-off.js +1 -0
  16. package/dist/utils/audit-nesting/audit-nesting.d.ts +19 -0
  17. package/dist/utils/audit-nesting/audit-nesting.js +19 -0
  18. package/dist/utils/audit-source/audit-source-off.d.ts +3 -1
  19. package/dist/utils/audit-source/audit-source-off.js +1 -0
  20. package/dist/utils/audit-source/audit-source.d.ts +6 -0
  21. package/dist/utils/audit-source/audit-source.js +14 -0
  22. package/dist/utils/number-format/number-format.js +3 -2
  23. package/dist/utils/read-data/read-data.d.ts +6 -0
  24. package/dist/utils/read-data/read-data.js +8 -0
  25. package/dist/utils/report-runtime/report-runtime.d.ts +7 -0
  26. package/dist/version.d.ts +1 -1
  27. package/dist/version.js +1 -1
  28. package/package.json +15 -4
@@ -12298,13 +12298,13 @@
12298
12298
  {
12299
12299
  "kind": "method",
12300
12300
  "name": "runPendingUpdate",
12301
- "privacy": "private",
12301
+ "privacy": "protected",
12302
12302
  "return": {
12303
12303
  "type": {
12304
12304
  "text": "void"
12305
12305
  }
12306
12306
  },
12307
- "description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously."
12307
+ "description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously.\n\nProtected for a control that submits on its own, which has to hand the\nform the verdict for what it holds now: Pin Input's `autosubmit`."
12308
12308
  },
12309
12309
  {
12310
12310
  "kind": "field",
@@ -12415,6 +12415,24 @@
12415
12415
  "privacy": "private",
12416
12416
  "description": "Stops listening for the labels in this control's tree."
12417
12417
  },
12418
+ {
12419
+ "kind": "method",
12420
+ "name": "formAssociatedCallback",
12421
+ "return": {
12422
+ "type": {
12423
+ "text": "void"
12424
+ }
12425
+ },
12426
+ "parameters": [
12427
+ {
12428
+ "name": "form",
12429
+ "type": {
12430
+ "text": "HTMLFormElement | null"
12431
+ }
12432
+ }
12433
+ ],
12434
+ "description": "Called by the browser when the control's form changes: watches the new\nform's `checkValidity()`, as connecting does for the form it starts in."
12435
+ },
12418
12436
  {
12419
12437
  "kind": "field",
12420
12438
  "name": "form",
@@ -12842,6 +12860,14 @@
12842
12860
  "package": "#audit-name"
12843
12861
  }
12844
12862
  },
12863
+ {
12864
+ "kind": "js",
12865
+ "name": "auditNesting",
12866
+ "declaration": {
12867
+ "name": "auditNesting",
12868
+ "package": "#audit-nesting"
12869
+ }
12870
+ },
12845
12871
  {
12846
12872
  "kind": "js",
12847
12873
  "name": "auditServed",
@@ -18135,6 +18161,17 @@
18135
18161
  "text": "ChartPointerController"
18136
18162
  },
18137
18163
  "description": "Finds the reading nearest the pointer, so the tooltip can sit on it."
18164
+ },
18165
+ {
18166
+ "kind": "method",
18167
+ "name": "renderTable",
18168
+ "privacy": "protected",
18169
+ "return": {
18170
+ "type": {
18171
+ "text": "TemplateResult | typeof nothing"
18172
+ }
18173
+ },
18174
+ "description": "The readings as a table, for a screen reader, where they were drawn from\n`data`: there is then no table on the page to read. Nothing otherwise."
18138
18175
  }
18139
18176
  ],
18140
18177
  "helix": {}
@@ -18171,13 +18208,6 @@
18171
18208
  "default": "new SourceController(this)",
18172
18209
  "description": "Resolves `for` and re-renders when the table behind it changes."
18173
18210
  },
18174
- {
18175
- "kind": "field",
18176
- "name": "pointer",
18177
- "readonly": true,
18178
- "default": "new ChartPointerController(this)",
18179
- "description": "Finds the reading nearest the pointer, so the tooltip can sit on it.\n\nPublic for the same reason `series` and `named` are: a protected member\ncannot be cast onto across unrelated classes, so it would be invisible to\nevery chart that needs it. Reading where a pointer is resting is a fair\nthing to ask a chart anyway."
18180
- },
18181
18211
  {
18182
18212
  "kind": "field",
18183
18213
  "name": "data",
@@ -18230,46 +18260,6 @@
18230
18260
  "words": true
18231
18261
  }
18232
18262
  },
18233
- {
18234
- "kind": "field",
18235
- "name": "observedAttributes",
18236
- "type": {
18237
- "text": "string[]"
18238
- },
18239
- "static": true,
18240
- "description": "Hears an `aria-label` written on the chart, which no property mirrors,\nso a page that names the chart that way names its plot.\n\nLit observes the attributes of its own properties only, and `ariaLabel`\nbelongs to the platform.\n\nRead through `Reflect.get` with this class as the receiver, which is\nwhat `super.observedAttributes` means: Lit's getter finalizes whichever\nclass it is asked on, and asked on the base it would finalize the base\nand leave a subclass without its styles. A mixin's base has no static\nside TypeScript can see, so `super` cannot be written here.",
18241
- "readonly": true
18242
- },
18243
- {
18244
- "kind": "method",
18245
- "name": "attributeChangedCallback",
18246
- "return": {
18247
- "type": {
18248
- "text": "void"
18249
- }
18250
- },
18251
- "parameters": [
18252
- {
18253
- "name": "name",
18254
- "type": {
18255
- "text": "string"
18256
- }
18257
- },
18258
- {
18259
- "name": "old",
18260
- "type": {
18261
- "text": "string | null"
18262
- }
18263
- },
18264
- {
18265
- "name": "value",
18266
- "type": {
18267
- "text": "string | null"
18268
- }
18269
- }
18270
- ],
18271
- "description": "Called by the browser when an observed attribute changes. A new\n`aria-label` asks for an update, because it names the plot."
18272
- },
18273
18263
  {
18274
18264
  "kind": "field",
18275
18265
  "name": "series",
@@ -18288,24 +18278,6 @@
18288
18278
  "description": "The chart's name: an `aria-label` written on the chart, then `label`,\nthen the table's caption.\n\nThe fallback is the reason this is shared rather than copied: a caption is\nalready written, already the right words, and already the thing a reader\nof the table sees. A chart that made the consumer say it twice would be\nasking for the second one to drift.\n\n**An `aria-label` on the chart comes first**, because it is how a page\nnames an element, and the chart is a generic around its plot: written\non the host, the name reached nobody. The plot takes it, as Heatmap's\nstrip always did.",
18289
18279
  "readonly": true
18290
18280
  },
18291
- {
18292
- "kind": "field",
18293
- "name": "readingsKnown",
18294
- "type": {
18295
- "text": "boolean"
18296
- },
18297
- "description": "Whether the readings have been looked for: false on the server and\nwhile hydrating, where no table is resolved and no data is read. A\nchart says it has no readings only once this is true.",
18298
- "readonly": true
18299
- },
18300
- {
18301
- "kind": "field",
18302
- "name": "sourceRows",
18303
- "type": {
18304
- "text": "Row[]"
18305
- },
18306
- "description": "Every row of the table, with each cell's text and number.\n\nThis is where a tooltip's content comes from, and it is deliberately not\n`series`. A chart draws numbers; a reader resting a pointer on one wants\nwhat the table says, which is `$128k` and not `128000`, and often wants\nthe column beside it that nothing plotted at all.\n\n**Not `rows`.** It is the source table's rows, and `rows` on a chart is a\nname a chart wants for itself: `helix-heatmap` takes `rows=\"7\"` to mean a\ncalendar week, and declaring that against a base class whose `rows` is a\n`Row[]` getter is a type error at best. Name the member for what it holds\nrather than for the shortest word available.",
18307
- "readonly": true
18308
- },
18309
18281
  {
18310
18282
  "kind": "field",
18311
18283
  "name": "plottedColumns",
@@ -18395,6 +18367,17 @@
18395
18367
  },
18396
18368
  "description": "The number of readings, which the pointer position maps onto.",
18397
18369
  "readonly": true
18370
+ },
18371
+ {
18372
+ "kind": "method",
18373
+ "name": "renderTable",
18374
+ "privacy": "protected",
18375
+ "return": {
18376
+ "type": {
18377
+ "text": "TemplateResult | typeof nothing"
18378
+ }
18379
+ },
18380
+ "description": "The readings as a table, for a screen reader, where they were drawn from\n`data`: there is then no table on the page to read, and a chart's\nsummary gives only what the readings come to. Nothing where a table on\nthe page was read, which is already the readable version.\n\nThe `table` part, named by the chart, its cells as `data` writes them."
18398
18381
  }
18399
18382
  ],
18400
18383
  "attributes": [
@@ -18555,13 +18538,24 @@
18555
18538
  }
18556
18539
  },
18557
18540
  "description": "What stands in the plot while there is nothing to draw: the `loading`\nline, the `empty` line, or nothing while the table cannot be read yet."
18541
+ },
18542
+ {
18543
+ "kind": "method",
18544
+ "name": "renderEmpty",
18545
+ "privacy": "protected",
18546
+ "return": {
18547
+ "type": {
18548
+ "text": "TemplateResult"
18549
+ }
18550
+ },
18551
+ "description": "The plot while there is nothing to draw: a group named as the chart is,\nholding `renderStatus`."
18558
18552
  }
18559
18553
  ],
18560
18554
  "helix": {}
18561
18555
  },
18562
18556
  {
18563
18557
  "kind": "mixin",
18564
- "description": "What a chart shows in place of its drawing when it has no readings: words\nwhile they load, and words when the table it reads has none.\n\n**A blank box said neither.** A chart pointed at an empty table drew its\nplot at full height with nothing in it, which reads as a chart that failed,\nand one waiting for a request drew the same. `Table` and `Data Table` take\nthe same pair, `empty-text` and `loading-text` with `empty` and `loading`\nslots for markup, such as a link to add the first reading.\n\n**Nothing at all while the readings cannot be looked for**, which is a\nserver render and the hydrating one after it: there is no document to\nresolve `for` in and `data` is drawn on the client only, so \"No readings\"\nthere would be a claim about readings nobody has looked at. `Heatmap` keeps\nthe same rule for its own `empty-text`.\n\nApplied by the four charts that draw on axes. The slots and parts are\ndocumented on each of them, a class-level tag on a mixin reaching no\nmanifest.",
18558
+ "description": "What a chart shows in place of its drawing when it has no readings: words\nwhile they load, and words when the table it reads has none.\n\n**A blank box said neither.** A chart pointed at an empty table drew its\nplot at full height with nothing in it, which reads as a chart that failed,\nand one waiting for a request drew the same. `Table` and `Data Table` take\nthe same pair, `empty-text` and `loading-text` with `empty` and `loading`\nslots for markup, such as a link to add the first reading.\n\n**Nothing at all while the readings cannot be looked for**, which is a\nserver render and the hydrating one after it: there is no document to\nresolve `for` in and `data` is drawn on the client only, so \"No readings\"\nthere would be a claim about readings nobody has looked at. `Heatmap` keeps\nthe same rule for its own `empty-text`.\n\n**The plot keeps the chart's name while it has nothing to draw**, as a\ngroup around the words, so the chart is still found by its name.\n\n**Three custom states follow:** `active` while a reading is shown, under the\npointer or the keys, with its tooltip open; `empty` while the empty words\nstand in the plot; and `loading` while the loading words do.\n\nApplied by the four charts that draw on axes and by Donut Chart. The slots,\nparts and states are documented on each of them, a class-level tag on a\nmixin reaching no manifest.",
18565
18559
  "name": "MixinChartStatus",
18566
18560
  "members": [
18567
18561
  {
@@ -18621,6 +18615,17 @@
18621
18615
  }
18622
18616
  },
18623
18617
  "description": "What stands in the plot while there is nothing to draw: the `loading`\nline, the `empty` line, or nothing while the table cannot be read yet.\n\n`dir=\"auto\"`, so words in a right-to-left script read their own way in\na plot that holds itself left to right, as Scatter Chart's does."
18618
+ },
18619
+ {
18620
+ "kind": "method",
18621
+ "name": "renderEmpty",
18622
+ "privacy": "protected",
18623
+ "return": {
18624
+ "type": {
18625
+ "text": "TemplateResult"
18626
+ }
18627
+ },
18628
+ "description": "The plot while there is nothing to draw: a group named as the chart is,\nholding `renderStatus`. Not focusable, there being no reading to walk."
18624
18629
  }
18625
18630
  ],
18626
18631
  "attributes": [
@@ -21057,6 +21062,17 @@
21057
21062
  "privacy": "protected",
21058
21063
  "readonly": true,
21059
21064
  "description": "A press that focuses the field opens the picker.\n\nA reader who presses into this control is choosing, and making them find\nthe trigger afterwards is a second action for something they have already\nasked for. Typing still works with it up, because the picker follows the\nfield rather than the other way round. Focus by Tab or by `focus()` opens\nnothing: see the mixin's note.\n\n**Only where focus arrived from outside this element**, which is the whole\nof the difficulty: picking shuts the panel and puts the caret back in the\nfield, so an unguarded version reopens the picker the reader just\nanswered. `relatedTarget` is where focus came from, so a hand-off from the\npicker or the trigger is left alone and only a genuine arrival opens\nanything. `returning` covers the hand-off `relatedTarget` cannot see, and\n`MixinPickerField` says why.\n\nOn the input rather than on the field, too. Focus does not bubble, so a\nlistener there covers the text and not the trigger, which is what keeps\npressing the trigger from opening the panel on focus and then shutting it\nagain on the click."
21065
+ },
21066
+ {
21067
+ "kind": "method",
21068
+ "name": "selectOnArrival",
21069
+ "privacy": "private",
21070
+ "return": {
21071
+ "type": {
21072
+ "text": "void"
21073
+ }
21074
+ },
21075
+ "description": "Selects the text a reader tabbed into, once the field shows it for\nediting, as Tab into a native `<input>` holding text selects all of it,\nfrom either side. Not when this element hands the caret back itself.\n\n**After the update**, because focus is what turns editing on, and the\ntext the field then writes put the caret at its end. Measured in\nChromium before this: Tab into a Time Input holding `14:30` left the\nselection at 5 to 5, and typing `9am` gave `14:309am`. A press keeps\nits caret where the pointer put it."
21060
21076
  }
21061
21077
  ],
21062
21078
  "attributes": [
@@ -24659,6 +24675,70 @@
24659
24675
  }
24660
24676
  ]
24661
24677
  },
24678
+ {
24679
+ "kind": "javascript-module",
24680
+ "path": "src/utils/audit-nesting/audit-nesting-off.ts",
24681
+ "declarations": [
24682
+ {
24683
+ "kind": "function",
24684
+ "name": "auditNesting",
24685
+ "description": "The unslotted-item warning in a production build: nothing.\n\n`#audit-nesting` resolves here unless the bundler or runtime asks for the\n`development` condition, so a production build carries none of the audit's\ncode. The signature is the audit's, so a call site reads the same in both\nbuilds. See `audit-nesting.ts`.",
24686
+ "type": {
24687
+ "text": "typeof audit"
24688
+ }
24689
+ }
24690
+ ],
24691
+ "exports": [
24692
+ {
24693
+ "kind": "js",
24694
+ "name": "auditNesting",
24695
+ "declaration": {
24696
+ "name": "auditNesting",
24697
+ "module": "src/utils/audit-nesting/audit-nesting-off.ts"
24698
+ }
24699
+ }
24700
+ ]
24701
+ },
24702
+ {
24703
+ "kind": "javascript-module",
24704
+ "path": "src/utils/audit-nesting/audit-nesting.ts",
24705
+ "declarations": [
24706
+ {
24707
+ "kind": "function",
24708
+ "name": "auditNesting",
24709
+ "return": {
24710
+ "type": {
24711
+ "text": "void"
24712
+ }
24713
+ },
24714
+ "parameters": [
24715
+ {
24716
+ "name": "host",
24717
+ "type": {
24718
+ "text": "HTMLElement"
24719
+ }
24720
+ },
24721
+ {
24722
+ "name": "slot",
24723
+ "type": {
24724
+ "text": "string"
24725
+ }
24726
+ }
24727
+ ],
24728
+ "description": "Reports an item nested in another item of its own tag without the slot that\nnests it, the one mistake that leaves a tree drawing the child as words.\n\n`<helix-tree-item>src<helix-tree-item>app.ts</helix-tree-item></helix-tree-item>`\nputs the inner item in the outer one's default slot, which is its label: the\nrow reads \"src app.ts\" and is drawn as a leaf. The item has to carry\n`slot=\"children\"`. **Nothing moves it there**, because writing `slot` onto\nan element the page rendered is a change to markup a server sent and a\nframework owns.\n\n**In a development build only**, as `missing-name` is: every item would pay\nfor a sentence meant for the person writing the page. Core imports it as\n`#audit-nesting`, which `package.json` resolves here under the `development`\ncondition and to `audit-nesting-off.ts`, which does nothing, everywhere else.\n\n`slot` is the name of the slot that nests an item."
24729
+ }
24730
+ ],
24731
+ "exports": [
24732
+ {
24733
+ "kind": "js",
24734
+ "name": "auditNesting",
24735
+ "declaration": {
24736
+ "name": "auditNesting",
24737
+ "module": "src/utils/audit-nesting/audit-nesting.ts"
24738
+ }
24739
+ }
24740
+ ]
24741
+ },
24662
24742
  {
24663
24743
  "kind": "javascript-module",
24664
24744
  "path": "src/utils/audit-served/audit-served-off.ts",
@@ -24746,6 +24826,14 @@
24746
24826
  "type": {
24747
24827
  "text": "typeof audit"
24748
24828
  }
24829
+ },
24830
+ {
24831
+ "kind": "function",
24832
+ "name": "auditData",
24833
+ "description": "The malformed-data warning in a production build: nothing.",
24834
+ "type": {
24835
+ "text": "typeof auditShape"
24836
+ }
24749
24837
  }
24750
24838
  ],
24751
24839
  "exports": [
@@ -24756,6 +24844,14 @@
24756
24844
  "name": "auditSource",
24757
24845
  "module": "src/utils/audit-source/audit-source-off.ts"
24758
24846
  }
24847
+ },
24848
+ {
24849
+ "kind": "js",
24850
+ "name": "auditData",
24851
+ "declaration": {
24852
+ "name": "auditData",
24853
+ "module": "src/utils/audit-source/audit-source-off.ts"
24854
+ }
24759
24855
  }
24760
24856
  ]
24761
24857
  },
@@ -24786,6 +24882,24 @@
24786
24882
  }
24787
24883
  ],
24788
24884
  "description": "Reports a chart, a legend or a sparkline whose `for` names no table once the\npage has loaded, the one mistake that leaves it drawing nothing and saying\nnothing.\n\n**Read a task after `load`**, so a table later in the markup, or one a\nscript writes as the page starts, counts. A table a framework renders later\nthan that is reported, and the chart still draws it when it arrives.\n\n**In a development build only**, as `missing-name` is: every chart would pay\nfor a sentence meant for the person writing the page. Core imports it as\n`#audit-source`, which `package.json` resolves here under the `development`\ncondition and to `audit-source-off.ts`, which does nothing, everywhere else.\n\n`table` answers what `for` resolves to now: the table, or null."
24885
+ },
24886
+ {
24887
+ "kind": "function",
24888
+ "name": "auditData",
24889
+ "return": {
24890
+ "type": {
24891
+ "text": "void"
24892
+ }
24893
+ },
24894
+ "parameters": [
24895
+ {
24896
+ "name": "host",
24897
+ "type": {
24898
+ "text": "HTMLElement"
24899
+ }
24900
+ }
24901
+ ],
24902
+ "description": "Reports a chart whose `data` is not `{ columns, rows }`, such as an array of\nrows, once for each chart. The chart draws its empty state. In a development\nbuild only, as the missing-table warning is."
24789
24903
  }
24790
24904
  ],
24791
24905
  "exports": [
@@ -24796,6 +24910,14 @@
24796
24910
  "name": "auditSource",
24797
24911
  "module": "src/utils/audit-source/audit-source.ts"
24798
24912
  }
24913
+ },
24914
+ {
24915
+ "kind": "js",
24916
+ "name": "auditData",
24917
+ "declaration": {
24918
+ "name": "auditData",
24919
+ "module": "src/utils/audit-source/audit-source.ts"
24920
+ }
24799
24921
  }
24800
24922
  ]
24801
24923
  },
@@ -29913,6 +30035,24 @@
29913
30035
  "kind": "javascript-module",
29914
30036
  "path": "src/utils/read-data/read-data.ts",
29915
30037
  "declarations": [
30038
+ {
30039
+ "kind": "function",
30040
+ "name": "isChartData",
30041
+ "return": {
30042
+ "type": {
30043
+ "text": "data is ChartData"
30044
+ }
30045
+ },
30046
+ "parameters": [
30047
+ {
30048
+ "name": "data",
30049
+ "type": {
30050
+ "text": "unknown"
30051
+ }
30052
+ }
30053
+ ],
30054
+ "description": "Whether `data` has the shape a chart reads: an object with an array of\n`columns` and an array of `rows`, each row an array. Any other value draws\nthe empty state, where it would throw from the render."
30055
+ },
29916
30056
  {
29917
30057
  "kind": "function",
29918
30058
  "name": "seriesFromData",
@@ -29959,6 +30099,14 @@
29959
30099
  }
29960
30100
  ],
29961
30101
  "exports": [
30102
+ {
30103
+ "kind": "js",
30104
+ "name": "isChartData",
30105
+ "declaration": {
30106
+ "name": "isChartData",
30107
+ "module": "src/utils/read-data/read-data.ts"
30108
+ }
30109
+ },
29962
30110
  {
29963
30111
  "kind": "js",
29964
30112
  "name": "seriesFromData",
@@ -33810,7 +33958,7 @@
33810
33958
  "type": {
33811
33959
  "text": "string"
33812
33960
  },
33813
- "default": "'0.176.1'",
33961
+ "default": "'0.177.1'",
33814
33962
  "description": "The version of the package this file ships in.\n\n**Written by `fusion/scripts/version.mjs`** wherever it writes the package's\n`package.json`, and stamped back into the repository beside it after a\nrelease, so the two never disagree; a spec beside this holds them to it.\nNothing else in the running code knows which release it is."
33815
33963
  }
33816
33964
  ],
@@ -34446,6 +34594,6 @@
34446
34594
  ],
34447
34595
  "helix": {
34448
34596
  "package": "@fusion.dev/helix-core",
34449
- "version": "0.176.1"
34597
+ "version": "0.177.1"
34450
34598
  }
34451
34599
  }
@@ -50,6 +50,12 @@ export interface ChartPointerHost extends ReactiveControllerHost, HTMLElement {
50
50
  * The keys pass over a hidden reading, as they pass over a hidden series.
51
51
  */
52
52
  showsReading?(at: number): boolean;
53
+ /**
54
+ * The readings in the order the keys walk them, by place, for a chart whose
55
+ * drawing does not follow the table: a scatter's points from left to right.
56
+ * Absent, the keys walk the table's order.
57
+ */
58
+ readingOrder?(): number[];
53
59
  /**
54
60
  * Where PageUp or PageDown goes from the reading at `at`, by place among the
55
61
  * readings, for a chart whose page is no fixed count: a calendar's month.
@@ -58,6 +58,7 @@ export class ChartPointerController {
58
58
  if (this.at >= 0) {
59
59
  event.preventDefault();
60
60
  this.clear();
61
+ this.by = 'keyboard';
61
62
  }
62
63
  return;
63
64
  }
@@ -206,7 +207,7 @@ export class ChartPointerController {
206
207
  }
207
208
  shown() {
208
209
  const host = this.host;
209
- const all = Array.from({ length: host.readings }, (_, at) => at);
210
+ const all = host.readingOrder?.() ?? Array.from({ length: host.readings }, (_, at) => at);
210
211
  return host.showsReading === undefined
211
212
  ? all
212
213
  : all.filter((at) => host.showsReading?.(at) !== false);
@@ -1,6 +1,6 @@
1
- import { auditSource } from '@fusion.dev/helix-core/audits/source';
1
+ import { auditData, auditSource } from '@fusion.dev/helix-core/audits/source';
2
2
  import { elementById, searchableById } from '../../utils/element-by-id/element-by-id.js';
3
- import { rowsFromData, seriesFromData } from '../../utils/read-data/read-data.js';
3
+ import { isChartData, rowsFromData, seriesFromData, } from '../../utils/read-data/read-data.js';
4
4
  import { readRows, readSeries, seriesKey, } from '../../utils/read-series/read-series.js';
5
5
  import { wordsLocale } from '../../words/words-locale.js';
6
6
  const HIDDEN = new WeakMap();
@@ -29,6 +29,10 @@ export class SourceController {
29
29
  if (host.data === undefined || typeof host.closest !== 'function' || this.hydrating) {
30
30
  return undefined;
31
31
  }
32
+ if (!isChartData(host.data)) {
33
+ auditData(host);
34
+ return undefined;
35
+ }
32
36
  return host.data;
33
37
  }
34
38
  get known() {
@@ -228,8 +228,11 @@ export declare class HelixFormElement extends HelixElement {
228
228
  * A native control answers about the value it was just given, so the
229
229
  * questions a script can ask run the pending update first. Lit's
230
230
  * `performUpdate` is the documented way to run one synchronously.
231
+ *
232
+ * Protected for a control that submits on its own, which has to hand the
233
+ * form the verdict for what it holds now: Pin Input's `autosubmit`.
231
234
  */
232
- private runPendingUpdate;
235
+ protected runPendingUpdate(): void;
233
236
  /** Whether the control is checked when its form is submitted. */
234
237
  get willValidate(): boolean;
235
238
  /**
@@ -246,8 +249,10 @@ export declare class HelixFormElement extends HelixElement {
246
249
  * required `<input>` checked from a script fires `invalid` and does not match
247
250
  * `:user-invalid`, measured in Chromium. Every layer that takes `invalid` as
248
251
  * a reader's attempt asks this first, so a script that checks an untouched
249
- * field does not mark it wrong. A submission, `reportValidity()`, and the
250
- * reader's own edits still do.
252
+ * field does not mark it wrong. The same holds for `form.checkValidity()`,
253
+ * which fires `invalid` on every control in the form and marks no native
254
+ * one. A submission, `reportValidity()`, and the reader's own edits still
255
+ * mark it.
251
256
  */
252
257
  protected get checkingValidity(): boolean;
253
258
  /**
@@ -290,6 +295,11 @@ export declare class HelixFormElement extends HelixElement {
290
295
  private unwatchLabels;
291
296
  connectedCallback(): void;
292
297
  disconnectedCallback(): void;
298
+ /**
299
+ * Called by the browser when the control's form changes: watches the new
300
+ * form's `checkValidity()`, as connecting does for the form it starts in.
301
+ */
302
+ formAssociatedCallback(form: HTMLFormElement | null): void;
293
303
  /**
294
304
  * @internal Whether this control is a field that counts against implicit
295
305
  * submission: a single line of text, as `<input type="text">` is. Read by
@@ -41,6 +41,24 @@ const firstTabStop = (node) => {
41
41
  }
42
42
  return null;
43
43
  };
44
+ let formChecks = 0;
45
+ const watchedForms = new WeakSet();
46
+ const watchFormChecks = (form) => {
47
+ if (!form || watchedForms.has(form)) {
48
+ return;
49
+ }
50
+ watchedForms.add(form);
51
+ const check = form.checkValidity;
52
+ form.checkValidity = function checkValidity() {
53
+ formChecks += 1;
54
+ try {
55
+ return check.call(this);
56
+ }
57
+ finally {
58
+ formChecks -= 1;
59
+ }
60
+ };
61
+ };
44
62
  export class HelixFormElement extends HelixElement {
45
63
  static { this.formAssociated = true; }
46
64
  get isDisabled() {
@@ -172,7 +190,7 @@ export class HelixFormElement extends HelixElement {
172
190
  }
173
191
  }
174
192
  get checkingValidity() {
175
- return this.checkInProgress;
193
+ return this.checkInProgress || formChecks > 0;
176
194
  }
177
195
  reportValidity() {
178
196
  this.runPendingUpdate();
@@ -198,6 +216,7 @@ export class HelixFormElement extends HelixElement {
198
216
  }
199
217
  connectedCallback() {
200
218
  super.connectedCallback();
219
+ watchFormChecks(this.internals.form);
201
220
  this.addEventListener('click', this.focusFromLabel);
202
221
  this.addEventListener('invalid', this.refreshAnchor);
203
222
  this.unwatchLabels = watchLabels(this, () => this.requestUpdate());
@@ -209,6 +228,9 @@ export class HelixFormElement extends HelixElement {
209
228
  this.unwatchLabels?.();
210
229
  this.unwatchLabels = undefined;
211
230
  }
231
+ formAssociatedCallback(form) {
232
+ watchFormChecks(form);
233
+ }
212
234
  get blocksImplicitSubmission() {
213
235
  return false;
214
236
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { auditName } from '@fusion.dev/helix-core/audits/name';
2
+ export { auditNesting } from '@fusion.dev/helix-core/audits/nesting';
2
3
  export { auditServed } from '@fusion.dev/helix-core/audits/served';
3
4
  export { AriaForwardController, type AriaForwardOptions, } from './controllers/aria-forward-controller/aria-forward-controller.js';
4
5
  export { ArrivalController, type ArrivalOptions, } from './controllers/arrival-controller/arrival-controller.js';
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { auditName } from '@fusion.dev/helix-core/audits/name';
2
+ export { auditNesting } from '@fusion.dev/helix-core/audits/nesting';
2
3
  export { auditServed } from '@fusion.dev/helix-core/audits/served';
3
4
  export { AriaForwardController, } from './controllers/aria-forward-controller/aria-forward-controller.js';
4
5
  export { ArrivalController, } from './controllers/arrival-controller/arrival-controller.js';
@@ -1,3 +1,4 @@
1
+ import { nothing, type TemplateResult } from 'lit';
1
2
  import { ChartPointerController } from '../../controllers/chart-pointer-controller/chart-pointer-controller.js';
2
3
  import type { HelixElement } from '../../helix-element/helix-element.js';
3
4
  import type { ChartData } from '../../utils/read-data/read-data.js';
@@ -202,6 +203,11 @@ export declare class MixinChartSourceInterface {
202
203
  * Finds the reading nearest the pointer, so the tooltip can sit on it.
203
204
  */
204
205
  pointer: ChartPointerController;
206
+ /**
207
+ * The readings as a table, for a screen reader, where they were drawn from
208
+ * `data`: there is then no table on the page to read. Nothing otherwise.
209
+ */
210
+ protected renderTable(): TemplateResult | typeof nothing;
205
211
  }
206
212
  /**
207
213
  * The words a chart says a reading's place in by default, such as "2 of 12":
@@ -4,6 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
+ import { html, nothing } from 'lit';
7
8
  import { property } from 'lit/decorators.js';
8
9
  import { ChartPointerController } from '../../controllers/chart-pointer-controller/chart-pointer-controller.js';
9
10
  import { SourceController } from '../../controllers/source-controller/source-controller.js';
@@ -84,6 +85,19 @@ export const MixinChartSource = (Base) => {
84
85
  get readings() {
85
86
  return this.sourceRows.length;
86
87
  }
88
+ renderTable() {
89
+ const rows = this.sourceRows;
90
+ if (this.source.element || rows.length === 0) {
91
+ return nothing;
92
+ }
93
+ const width = Math.max(...rows.map((row) => row.cells.length));
94
+ const columns = Array.from({ length: width }, (_, cell) => this.columnName(cell));
95
+ return html `<table part="table">
96
+ ${this.named ? html `<caption>${this.named}</caption>` : nothing}
97
+ <thead><tr><th scope="col">${this.data?.columns[0] ?? ''}</th>${columns.map((name) => html `<th scope="col">${name}</th>`)}</tr></thead>
98
+ <tbody>${rows.map((row) => html `<tr><th scope="row">${row.label}</th>${columns.map((_, cell) => html `<td>${row.cells[cell]?.text ?? ''}</td>`)}</tr>`)}</tbody>
99
+ </table>`;
100
+ }
87
101
  }
88
102
  __decorate([
89
103
  property({ attribute: false })
@@ -5,6 +5,12 @@ type Constructor<T> = new (...args: any[]) => T;
5
5
  interface ChartHost extends HelixElement {
6
6
  /** Whether the readings have been looked for, which a server never does. */
7
7
  readonly readingsKnown: boolean;
8
+ /** The chart's name, which the plot keeps while it has nothing to draw. */
9
+ readonly named: string;
10
+ /** The reading shown, by its place, or -1 for none. */
11
+ readonly pointer: {
12
+ readonly at: number;
13
+ };
8
14
  }
9
15
  /**
10
16
  * The public surface `MixinChartStatus` adds.
@@ -34,6 +40,11 @@ export declare class MixinChartStatusInterface {
34
40
  * line, the `empty` line, or nothing while the table cannot be read yet.
35
41
  */
36
42
  protected renderStatus(): TemplateResult | typeof nothing;
43
+ /**
44
+ * The plot while there is nothing to draw: a group named as the chart is,
45
+ * holding `renderStatus`.
46
+ */
47
+ protected renderEmpty(): TemplateResult;
37
48
  }
38
49
  /**
39
50
  * What a chart shows in place of its drawing when it has no readings: words
@@ -51,9 +62,16 @@ export declare class MixinChartStatusInterface {
51
62
  * there would be a claim about readings nobody has looked at. `Heatmap` keeps
52
63
  * the same rule for its own `empty-text`.
53
64
  *
54
- * Applied by the four charts that draw on axes. The slots and parts are
55
- * documented on each of them, a class-level tag on a mixin reaching no
56
- * manifest.
65
+ * **The plot keeps the chart's name while it has nothing to draw**, as a
66
+ * group around the words, so the chart is still found by its name.
67
+ *
68
+ * **Three custom states follow:** `active` while a reading is shown, under the
69
+ * pointer or the keys, with its tooltip open; `empty` while the empty words
70
+ * stand in the plot; and `loading` while the loading words do.
71
+ *
72
+ * Applied by the four charts that draw on axes and by Donut Chart. The slots,
73
+ * parts and states are documented on each of them, a class-level tag on a
74
+ * mixin reaching no manifest.
57
75
  */
58
76
  export declare const MixinChartStatus: <T extends Constructor<ChartHost>>(Base: T) => T & Constructor<MixinChartStatusInterface>;
59
77
  export {};
@@ -6,6 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { html, nothing } from 'lit';
8
8
  import { property } from 'lit/decorators.js';
9
+ import { CHART_PLOT } from '../../controllers/chart-pointer-controller/chart-pointer-controller.js';
9
10
  import { words } from '../../words/words.js';
10
11
  export const MixinChartStatus = (Base) => {
11
12
  class ChartStatusElement extends Base {
@@ -24,6 +25,22 @@ export const MixinChartStatus = (Base) => {
24
25
  ? html `<p dir="auto" part="empty"><slot name="empty">${this.emptyText}</slot></p>`
25
26
  : nothing;
26
27
  }
28
+ renderEmpty() {
29
+ const named = this.named;
30
+ return html `<div
31
+ aria-label=${named || nothing}
32
+ id=${CHART_PLOT}
33
+ part="plot"
34
+ role=${named ? 'group' : nothing}
35
+ >${this.renderStatus()}</div>`;
36
+ }
37
+ updated(changed) {
38
+ super.updated(changed);
39
+ const root = this.renderRoot;
40
+ this.toggleState('active', this.pointer.at >= 0);
41
+ this.toggleState('empty', root.querySelector('[part="empty"]') !== null);
42
+ this.toggleState('loading', root.querySelector('[part="loading"]') !== null);
43
+ }
27
44
  }
28
45
  __decorate([
29
46
  words,
@@ -55,10 +55,11 @@ export const MixinPickerEditing = (Base) => {
55
55
  const pressed = this.pressing;
56
56
  this.pressing = false;
57
57
  const from = event.relatedTarget;
58
- if (!pressed || this.open || this.isDisabled || this.returning) {
59
- return;
58
+ const inside = from instanceof Node && Boolean(this.renderRoot?.contains?.(from));
59
+ if (!pressed && !this.returning) {
60
+ this.selectOnArrival();
60
61
  }
61
- if (from instanceof Node && this.renderRoot?.contains?.(from)) {
62
+ if (!pressed || this.open || this.isDisabled || this.returning || inside) {
62
63
  return;
63
64
  }
64
65
  this.requestOpen(true);
@@ -90,6 +91,15 @@ export const MixinPickerEditing = (Base) => {
90
91
  this.removeEventListener('click', this.handlePress);
91
92
  this.removeEventListener('keydown', this.handleEditKey);
92
93
  }
94
+ selectOnArrival() {
95
+ void this.updateComplete.then(() => {
96
+ const control = this.control;
97
+ const root = this.renderRoot;
98
+ if (control && root?.activeElement === control) {
99
+ control.select();
100
+ }
101
+ });
102
+ }
93
103
  }
94
104
  __decorate([
95
105
  property({ attribute: 'readonly', reflect: true, type: Boolean })
@@ -0,0 +1,10 @@
1
+ import type { auditNesting as audit } from './audit-nesting.js';
2
+ /**
3
+ * The unslotted-item warning in a production build: nothing.
4
+ *
5
+ * `#audit-nesting` resolves here unless the bundler or runtime asks for the
6
+ * `development` condition, so a production build carries none of the audit's
7
+ * code. The signature is the audit's, so a call site reads the same in both
8
+ * builds. See `audit-nesting.ts`.
9
+ */
10
+ export declare const auditNesting: typeof audit;
@@ -0,0 +1 @@
1
+ export const auditNesting = () => { };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Reports an item nested in another item of its own tag without the slot that
3
+ * nests it, the one mistake that leaves a tree drawing the child as words.
4
+ *
5
+ * `<helix-tree-item>src<helix-tree-item>app.ts</helix-tree-item></helix-tree-item>`
6
+ * puts the inner item in the outer one's default slot, which is its label: the
7
+ * row reads "src app.ts" and is drawn as a leaf. The item has to carry
8
+ * `slot="children"`. **Nothing moves it there**, because writing `slot` onto
9
+ * an element the page rendered is a change to markup a server sent and a
10
+ * framework owns.
11
+ *
12
+ * **In a development build only**, as `missing-name` is: every item would pay
13
+ * for a sentence meant for the person writing the page. Core imports it as
14
+ * `#audit-nesting`, which `package.json` resolves here under the `development`
15
+ * condition and to `audit-nesting-off.ts`, which does nothing, everywhere else.
16
+ *
17
+ * `slot` is the name of the slot that nests an item.
18
+ */
19
+ export declare const auditNesting: (host: HTMLElement, slot: string) => void;
@@ -0,0 +1,19 @@
1
+ import { reportRuntime } from '../report-runtime/report-runtime.js';
2
+ const audited = new WeakSet();
3
+ export const auditNesting = (host, slot) => {
4
+ if (audited.has(host)) {
5
+ return;
6
+ }
7
+ const stray = [...host.children].find((child) => child.localName === host.localName && !child.hasAttribute('slot'));
8
+ if (!stray) {
9
+ return;
10
+ }
11
+ audited.add(host);
12
+ reportRuntime({
13
+ kind: 'unslotted-item',
14
+ message: `<${host.localName}> holds a <${stray.localName}> in its default slot, which is its ` +
15
+ `label, so the inner item is read as words in the row and drawn as no branch. Add ` +
16
+ `slot="${slot}" to each nested <${stray.localName}>.`,
17
+ tag: host.localName,
18
+ });
19
+ };
@@ -1,4 +1,4 @@
1
- import type { auditSource as audit } from './audit-source.js';
1
+ import type { auditSource as audit, auditData as auditShape } from './audit-source.js';
2
2
  /**
3
3
  * The missing-table warning in a production build: nothing.
4
4
  *
@@ -8,3 +8,5 @@ import type { auditSource as audit } from './audit-source.js';
8
8
  * builds. See `audit-source.ts`.
9
9
  */
10
10
  export declare const auditSource: typeof audit;
11
+ /** The malformed-data warning in a production build: nothing. */
12
+ export declare const auditData: typeof auditShape;
@@ -1 +1,2 @@
1
1
  export const auditSource = () => { };
2
+ export const auditData = () => { };
@@ -17,3 +17,9 @@
17
17
  export declare const auditSource: (host: HTMLElement & {
18
18
  for: string;
19
19
  }, table: () => Element | null) => void;
20
+ /**
21
+ * Reports a chart whose `data` is not `{ columns, rows }`, such as an array of
22
+ * rows, once for each chart. The chart draws its empty state. In a development
23
+ * build only, as the missing-table warning is.
24
+ */
25
+ export declare const auditData: (host: HTMLElement) => void;
@@ -1,5 +1,6 @@
1
1
  import { reportRuntime } from '../report-runtime/report-runtime.js';
2
2
  const audited = new WeakSet();
3
+ const misshapen = new WeakSet();
3
4
  export const auditSource = (host, table) => {
4
5
  if (host.for === '' || audited.has(host) || typeof document === 'undefined') {
5
6
  return;
@@ -25,3 +26,16 @@ export const auditSource = (host, table) => {
25
26
  window.addEventListener('load', read, { once: true });
26
27
  }
27
28
  };
29
+ export const auditData = (host) => {
30
+ if (misshapen.has(host)) {
31
+ return;
32
+ }
33
+ misshapen.add(host);
34
+ reportRuntime({
35
+ kind: 'malformed-data',
36
+ message: `<${host.localName}> was given \`data\` that is not { columns, rows }, so it draws nothing. ` +
37
+ "Pass an object such as { columns: ['Month', 'Sales'], rows: [['Jan', 10]] }, each row " +
38
+ 'an array.',
39
+ tag: host.localName,
40
+ });
41
+ };
@@ -32,8 +32,9 @@ export const parseNumber = (text, locale = '', options) => {
32
32
  const parts = format.formatToParts(-12345.6);
33
33
  const one = format.formatToParts(1);
34
34
  const of = (type, from = parts) => from.filter((part) => part.type === type).map((part) => part.value);
35
- const group = of('group')[0] ?? ',';
36
- const decimal = of('decimal')[0] ?? '.';
35
+ const plain = formatter(locale, undefined).formatToParts(-12345.6);
36
+ const group = of('group')[0] ?? of('group', plain)[0] ?? ',';
37
+ const decimal = of('decimal')[0] ?? of('decimal', plain)[0] ?? '.';
37
38
  const named = (from) => [
38
39
  ...of('currency', from),
39
40
  ...of('percentSign', from),
@@ -37,6 +37,12 @@ export interface ChartData {
37
37
  */
38
38
  rows: ReadonlyArray<readonly [label: string, ...cells: ChartDatum[]]>;
39
39
  }
40
+ /**
41
+ * Whether `data` has the shape a chart reads: an object with an array of
42
+ * `columns` and an array of `rows`, each row an array. Any other value draws
43
+ * the empty state, where it would throw from the render.
44
+ */
45
+ export declare const isChartData: (data: unknown) => data is ChartData;
40
46
  /**
41
47
  * Reads `data` as series, one per column after the first, as `readSeries`
42
48
  * reads a table: a column with no numbers in it is not a series, and a blank
@@ -1,3 +1,11 @@
1
+ export const isChartData = (data) => {
2
+ const shape = data;
3
+ return (typeof shape === 'object' &&
4
+ shape !== null &&
5
+ Array.isArray(shape.columns) &&
6
+ Array.isArray(shape.rows) &&
7
+ shape.rows.every((row) => Array.isArray(row)));
8
+ };
1
9
  const cellOf = (datum, locale) => {
2
10
  if (datum === null || datum === undefined) {
3
11
  return { text: '' };
@@ -30,6 +30,8 @@ export type RuntimeKind =
30
30
  | 'fullscreen-refused'
31
31
  /** A rating's `min` is no score between 0 and its `max`. */
32
32
  | 'min-out-of-range'
33
+ /** A chart's `data` is not `{ columns, rows }`, so it draws its empty state. Development builds only. */
34
+ | 'malformed-data'
33
35
  /** A Stat was given one of Trend's directions, `up`, `down` or `neutral`, which lay nothing out. */
34
36
  | 'misread-direction'
35
37
  /** A React handler prop names an event the element never dispatches itself. Development builds only. */
@@ -99,6 +101,11 @@ export type RuntimeKind =
99
101
  | 'unscannable-logo'
100
102
  /** A virtualized list's box has no height of its own, so its window never settles. */
101
103
  | 'unsettled-window'
104
+ /**
105
+ * An item is nested in another of its tag without the slot that nests it, so it is read as
106
+ * the label. Development builds only.
107
+ */
108
+ | 'unslotted-item'
102
109
  /** A native button in a Button Group with `selection-mode`, which cannot be told it is pressed. */
103
110
  | 'untold-toggle'
104
111
  /** A slotted trigger is a plain element, which cannot be told it opens something. */
package/dist/version.d.ts CHANGED
@@ -6,4 +6,4 @@
6
6
  * release, so the two never disagree; a spec beside this holds them to it.
7
7
  * Nothing else in the running code knows which release it is.
8
8
  */
9
- export declare const VERSION = "0.176.1";
9
+ export declare const VERSION = "0.177.1";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = '0.176.1';
1
+ export const VERSION = '0.177.1';
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.176.1",
4
+ "version": "0.177.1",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -23,6 +23,12 @@
23
23
  "helix-development": "./dist/utils/audit-name/audit-name.js",
24
24
  "default": "./dist/utils/audit-name/audit-name-off.js"
25
25
  },
26
+ "./audits/nesting": {
27
+ "types": "./dist/utils/audit-nesting/audit-nesting.d.ts",
28
+ "development": "./dist/utils/audit-nesting/audit-nesting.js",
29
+ "helix-development": "./dist/utils/audit-nesting/audit-nesting.js",
30
+ "default": "./dist/utils/audit-nesting/audit-nesting-off.js"
31
+ },
26
32
  "./audits/react": {
27
33
  "types": "./dist/helix-element/react-audit.d.ts",
28
34
  "development": "./dist/helix-element/react-audit.js",
@@ -62,11 +68,11 @@
62
68
  "bugs": "https://github.com/project-fusion/fusion/issues",
63
69
  "dependencies": {
64
70
  "@floating-ui/dom": "^1.8.0",
65
- "@fusion.dev/helix-icons": "0.176.1"
71
+ "@fusion.dev/helix-icons": "0.177.1"
66
72
  },
67
73
  "devDependencies": {
68
- "@fusion.dev/helix-cem": "0.176.1",
69
- "@fusion.dev/helix-testing": "0.176.1",
74
+ "@fusion.dev/helix-cem": "0.177.1",
75
+ "@fusion.dev/helix-testing": "0.177.1",
70
76
  "@lit-labs/ssr": "^4.1.0",
71
77
  "lit": "^3.2.1"
72
78
  },
@@ -77,6 +83,11 @@
77
83
  "helix-development": "./src/utils/audit-name/audit-name.ts",
78
84
  "default": "./src/utils/audit-name/audit-name-off.ts"
79
85
  },
86
+ "#audit-nesting": {
87
+ "development": "./src/utils/audit-nesting/audit-nesting.ts",
88
+ "helix-development": "./src/utils/audit-nesting/audit-nesting.ts",
89
+ "default": "./src/utils/audit-nesting/audit-nesting-off.ts"
90
+ },
80
91
  "#audit-served": {
81
92
  "development": "./src/utils/audit-served/audit-served.ts",
82
93
  "helix-development": "./src/utils/audit-served/audit-served.ts",