@breakside/jskit 2026.9.0 → 2026.10.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 (60) hide show
  1. package/Frameworks/DOM.jsframework/Info.json +2 -2
  2. package/Frameworks/DOM.jsframework/io.breakside.JSKit.DOM-bundle.js +2 -2
  3. package/Frameworks/FontKit.jsframework/Info.json +2 -2
  4. package/Frameworks/FontKit.jsframework/io.breakside.JSKit.FontKit-bundle.js +2 -2
  5. package/Frameworks/Foundation.jsframework/Info.json +2 -2
  6. package/Frameworks/Foundation.jsframework/JS/JSColor.js +5 -0
  7. package/Frameworks/Foundation.jsframework/JS/JSPath.js +482 -49
  8. package/Frameworks/Foundation.jsframework/JS/JSSpec.js +5 -1
  9. package/Frameworks/Foundation.jsframework/JS/String+JS.js +78 -2
  10. package/Frameworks/Foundation.jsframework/io.breakside.JSKit.Foundation-bundle.js +2 -2
  11. package/Frameworks/SecurityKit.jsframework/Info.json +2 -2
  12. package/Frameworks/SecurityKit.jsframework/io.breakside.JSKit.SecurityKit-bundle.js +2 -2
  13. package/Info.json +2 -2
  14. package/Node/DocCommand.js +5 -2
  15. package/Node/Docs/DocClass.js +2 -2
  16. package/Node/Docs/DocComponent.js +6 -4
  17. package/Node/Docs/DocDictionaryProperty.js +2 -2
  18. package/Node/Docs/DocEnumOption.js +2 -2
  19. package/Node/Docs/DocFunction.js +2 -2
  20. package/Node/Docs/DocProperty.js +2 -2
  21. package/Node/Docs/DocProtocol.js +1 -1
  22. package/Node/Docs/DocSpec.js +1 -1
  23. package/Node/Docs/DocSpecProperty.js +2 -2
  24. package/Node/Docs/DocTopicBasedComponent.js +2 -2
  25. package/Node/Documentation.js +10 -2
  26. package/Node/HTMLBuilder.js +3 -1
  27. package/Node/HTMLProjectServer.js +39 -1
  28. package/Node/io.breakside.jskit-bundle.js +4 -4
  29. package/Resources/doc-default.css +1 -9
  30. package/Root/Frameworks/APIKit/Info.yaml +1 -1
  31. package/Root/Frameworks/APIKitTesting/Info.yaml +1 -1
  32. package/Root/Frameworks/AuthKit/Info.yaml +1 -1
  33. package/Root/Frameworks/CSSOM/Info.yaml +1 -1
  34. package/Root/Frameworks/ChartKit/Info.yaml +1 -1
  35. package/Root/Frameworks/ConferenceKit/Info.yaml +1 -1
  36. package/Root/Frameworks/DBKit/Info.yaml +1 -1
  37. package/Root/Frameworks/DOM/Info.yaml +1 -1
  38. package/Root/Frameworks/Dispatch/Info.yaml +1 -1
  39. package/Root/Frameworks/FontKit/Info.yaml +1 -1
  40. package/Root/Frameworks/Foundation/Info.yaml +1 -1
  41. package/Root/Frameworks/Foundation/JSColor.js +5 -0
  42. package/Root/Frameworks/Foundation/JSPath.js +482 -49
  43. package/Root/Frameworks/Foundation/JSSpec.js +5 -1
  44. package/Root/Frameworks/Foundation/String+JS.js +78 -2
  45. package/Root/Frameworks/ImageKit/Info.yaml +1 -1
  46. package/Root/Frameworks/MediaKit/Info.yaml +1 -1
  47. package/Root/Frameworks/MediaKitUI/Info.yaml +1 -1
  48. package/Root/Frameworks/NotificationKit/Info.yaml +1 -1
  49. package/Root/Frameworks/PDFKit/Info.yaml +1 -1
  50. package/Root/Frameworks/QRKit/Info.yaml +1 -1
  51. package/Root/Frameworks/SearchKit/Info.yaml +1 -1
  52. package/Root/Frameworks/SecurityKit/Info.yaml +1 -1
  53. package/Root/Frameworks/ServerKit/Info.yaml +1 -1
  54. package/Root/Frameworks/ServerKitTesting/Info.yaml +1 -1
  55. package/Root/Frameworks/TestKit/Info.yaml +1 -1
  56. package/Root/Frameworks/UIKit/Info.yaml +1 -1
  57. package/Root/Frameworks/UIKit/UIListView.js +11 -3
  58. package/Root/Frameworks/UIKit/UIOutlineView.js +65 -5
  59. package/Root/Frameworks/UIKitTesting/Info.yaml +1 -1
  60. package/package.json +1 -1
@@ -1592,7 +1592,7 @@ String.printf_formatter = {
1592
1592
 
1593
1593
  x: function(arg, options){
1594
1594
  // TODO: obey any other options
1595
- var str = arg.toString(16);
1595
+ var str = Math.floor(arg).toString(16);
1596
1596
  if (options.width){
1597
1597
  if (options.zero){
1598
1598
  str = str.leftPaddedString('0', options.width);
@@ -1633,7 +1633,83 @@ String.printf_formatter = {
1633
1633
  if (Math.abs(arg) < 0.000001){
1634
1634
  arg = 0;
1635
1635
  }
1636
- return (arg !== null && arg !== undefined && arg.toString) ? arg.toString() : arg;
1636
+ var n = arg;
1637
+ if (n === null){
1638
+ return "null";
1639
+ }
1640
+ if (n === undefined){
1641
+ return "undefined";
1642
+ }
1643
+ if (isNaN(n)){
1644
+ return "NaN";
1645
+ }
1646
+ if (!isFinite(n)){
1647
+ if (n < 0){
1648
+ return "-Inf";
1649
+ }
1650
+ return "Inf";
1651
+ }
1652
+
1653
+ // Prefix & Suffix
1654
+ var negative = n < 0;
1655
+ var prefix = "";
1656
+ if (negative){
1657
+ n = -n;
1658
+ prefix = "-";
1659
+ }
1660
+
1661
+ // Integer
1662
+ var maximumFractionDigits = options.precision || 6;
1663
+ var minimumFractionDigits = options.precision || 0;
1664
+ var minimumIntegerDigits = options.zero ? 1 : 0;
1665
+ var integer = Math.floor(n);
1666
+ var fraction = n - integer;
1667
+ var maximumFraction = Math.pow(10, maximumFractionDigits);
1668
+ fraction = Math.round(fraction * maximumFraction);
1669
+ if (fraction >= maximumFraction){
1670
+ integer += 1;
1671
+ fraction = 0;
1672
+ }
1673
+ var str = (integer !== 0 || (minimumIntegerDigits === 0 && minimumFractionDigits === 0)) ? integer.toString() : "";
1674
+ var zeroFillCount = minimumIntegerDigits - str.length;
1675
+ var i, l;
1676
+ if (zeroFillCount > 0){
1677
+ var fill = "";
1678
+ for (i = 0; i < zeroFillCount; ++i){
1679
+ fill += "0";
1680
+ }
1681
+ str = fill + str;
1682
+ }
1683
+
1684
+ // Decimal
1685
+ if (maximumFraction > 0){
1686
+ if (minimumFractionDigits > 0 || fraction !== 0){
1687
+ if (minimumFractionDigits > 0 || fraction !== 0){
1688
+ str += ".";
1689
+ var fractionString = fraction.toString();
1690
+ while (fractionString.length < maximumFractionDigits){
1691
+ fractionString = "0" + fractionString;
1692
+ }
1693
+ while (fractionString.length > minimumFractionDigits && fractionString[fractionString.length - 1] === "0"){
1694
+ fractionString = fractionString.substr(0, fractionString.length - 1);
1695
+ }
1696
+ str += fractionString;
1697
+ }
1698
+ }
1699
+ }
1700
+ str = prefix + str;
1701
+ if (options.width){
1702
+ if (options.zero){
1703
+ str = str.leftPaddedString('0', options.width);
1704
+ }else if (options.left_justified){
1705
+ str = str.rightPaddedString(' ', options.width);
1706
+ }else{
1707
+ str = str.leftPaddedString(' ', options.width);
1708
+ }
1709
+ }else if (str === ""){
1710
+ str = "0";
1711
+ }
1712
+ return str;
1637
1713
  },
1638
1714
 
1639
1715
  b: function(arg, options){
@@ -3,7 +3,7 @@ JSBundle.bundles['io.breakside.JSKit.Foundation'] = {
3
3
  "Info": {
4
4
  "JSBundleType": "framework",
5
5
  "JSBundleIdentifier": "io.breakside.JSKit.Foundation",
6
- "JSBundleVersion": "2026.9.0",
6
+ "JSBundleVersion": "2026.10.0",
7
7
  "JSDevelopmentLanguage": "en",
8
8
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
9
9
  "JSBundleEnvironments": {
@@ -11,7 +11,7 @@ JSBundle.bundles['io.breakside.JSKit.Foundation'] = {
11
11
  "node": "Foundation+Node.js"
12
12
  },
13
13
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
14
- "GitRevision": "7481a2557e5555dbf2a58e88ba6720b16de86277"
14
+ "GitRevision": "4f9f54d7fd9b56bd8c893ac8689a8efee1958ee5"
15
15
  },
16
16
  "Resources": [
17
17
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "JSBundleType": "framework",
3
3
  "JSBundleIdentifier": "io.breakside.JSKit.SecurityKit",
4
- "JSBundleVersion": "2026.9.0",
4
+ "JSBundleVersion": "2026.10.0",
5
5
  "JSDevelopmentLanguage": "en",
6
6
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
7
7
  "JSBundleEnvironments": {
@@ -9,5 +9,5 @@
9
9
  "node": "SecurityKit+Node.js"
10
10
  },
11
11
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
12
- "GitRevision": "7481a2557e5555dbf2a58e88ba6720b16de86277"
12
+ "GitRevision": "4f9f54d7fd9b56bd8c893ac8689a8efee1958ee5"
13
13
  }
@@ -3,7 +3,7 @@ JSBundle.bundles['io.breakside.JSKit.SecurityKit'] = {
3
3
  "Info": {
4
4
  "JSBundleType": "framework",
5
5
  "JSBundleIdentifier": "io.breakside.JSKit.SecurityKit",
6
- "JSBundleVersion": "2026.9.0",
6
+ "JSBundleVersion": "2026.10.0",
7
7
  "JSDevelopmentLanguage": "en",
8
8
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
9
9
  "JSBundleEnvironments": {
@@ -11,7 +11,7 @@ JSBundle.bundles['io.breakside.JSKit.SecurityKit'] = {
11
11
  "node": "SecurityKit+Node.js"
12
12
  },
13
13
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
14
- "GitRevision": "7481a2557e5555dbf2a58e88ba6720b16de86277"
14
+ "GitRevision": "4f9f54d7fd9b56bd8c893ac8689a8efee1958ee5"
15
15
  },
16
16
  "Resources": [],
17
17
  "ResourceLookup": {
package/Info.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "JSBundleType": "node",
3
3
  "JSBundleIdentifier": "io.breakside.jskit",
4
- "JSBundleVersion": "2026.9.0",
4
+ "JSBundleVersion": "2026.10.0",
5
5
  "JSExecutableName": "jskit",
6
6
  "NPMOrganization": "breakside",
7
7
  "JSResources": [
8
8
  "Tests/HTMLTestRunner.js",
9
9
  "Tests/NodeTestRunner.js"
10
10
  ],
11
- "GitRevision": "7481a2557e5555dbf2a58e88ba6720b16de86277"
11
+ "GitRevision": "4f9f54d7fd9b56bd8c893ac8689a8efee1958ee5"
12
12
  }
@@ -26,8 +26,8 @@ JSClass("DocCommand", Command, {
26
26
  options: {
27
27
  input: {kind: "positional", help: "The root documentation file to start with"},
28
28
  output: {kind: "positional", help: "The directory in which to output the generated documentation"},
29
- sublime: {kind: "flag", help: "Generate Sublime Text completions"}
30
- // style: {default: null, help: "The stylesheet to use"}
29
+ sublime: {kind: "flag", help: "Generate Sublime Text completions"},
30
+ stylesheet: {default: null, help: "Path to the stylesheet to use for docs"},
31
31
  },
32
32
 
33
33
  run: async function(){
@@ -37,6 +37,9 @@ JSClass("DocCommand", Command, {
37
37
  var documentation = Documentation.initWithRootURL(rootURL, this.fileManager);
38
38
  documentation.printer = printer;
39
39
  documentation.outputDirectoryURL = this.fileManager.urlForPath(this.arguments.output, workspaceURL);
40
+ if (this.arguments.stylesheet){
41
+ documentation.customStylesheetURL = this.fileManager.urlForPath(this.arguments.stylesheet, workspaceURL);
42
+ }
40
43
 
41
44
  if (this.arguments.sublime){
42
45
  await documentation.sublime();
@@ -67,7 +67,7 @@
67
67
  elements.push(inherits);
68
68
  inherits.setAttribute("class", "inherits");
69
69
  let header = inherits.appendChild(document.createElement("header"));
70
- let h1 = header.appendChild(document.createElement("h1"));
70
+ let h1 = header.appendChild(document.createElement("h2"));
71
71
  h1.setAttribute("outline-level", "1");
72
72
  h1.appendChild(document.createTextNode("Inherits From"));
73
73
  let p = inherits.appendChild(document.createElement("p"));
@@ -87,7 +87,7 @@
87
87
  elements.push(section);
88
88
  section.setAttribute("class", "implements");
89
89
  let header = section.appendChild(document.createElement("header"));
90
- let h1 = header.appendChild(document.createElement("h1"));
90
+ let h1 = header.appendChild(document.createElement("h2"));
91
91
  h1.setAttribute("outline-level", "1");
92
92
  h1.appendChild(document.createTextNode("Implements"));
93
93
  let ul = section.appendChild(document.createElement("ul"));
@@ -300,7 +300,7 @@ JSClass("DocComponent", JSObject, {
300
300
  let section = document.createElement('section');
301
301
  section.setAttribute('class', 'see');
302
302
  let header = document.createElement('header');
303
- let h1 = header.appendChild(document.createElement("h1"));
303
+ let h1 = header.appendChild(document.createElement("h2"));
304
304
  h1.appendChild(document.createTextNode('See Also'));
305
305
  let p = document.createElement('p');
306
306
  section.appendChild(header);
@@ -428,10 +428,10 @@ JSClass("DocComponent", JSObject, {
428
428
  let description = document.createElement("section");
429
429
  elements.push(description);
430
430
  description.setAttribute("class", "description");
431
- let markdown = this.createMarkdownWithString(this.description);
431
+ let markdown = this.createMarkdownWithString(this.description,);
432
432
  let children = markdown.htmlElementsForDocument(document);
433
433
  if (children.length === 0 || children[0].tagName != markdown.htmlOptions.firstLevelHeaderTagName){
434
- let h1 = description.appendChild(document.createElement("h1"));
434
+ let h1 = description.appendChild(document.createElement(markdown.htmlOptions.firstLevelHeaderTagName));
435
435
  h1.appendChild(document.createTextNode(this.titleForDescriptionSection));
436
436
  h1.setAttribute("outline-level", "1");
437
437
  }
@@ -591,7 +591,7 @@ JSClass("DocComponent", JSObject, {
591
591
  codeSectionElement: function(document, title, lines){
592
592
  var section = document.createElement("section");
593
593
  var header = section.appendChild(document.createElement("header"));
594
- var h1 = header.appendChild(document.createElement("h1"));
594
+ var h1 = header.appendChild(document.createElement("h2"));
595
595
  h1.appendChild(document.createTextNode(title));
596
596
  var code = section.appendChild(document.createElement("div"));
597
597
  code.setAttribute("class", "code");
@@ -865,6 +865,8 @@ JSClass("DocComponent", JSObject, {
865
865
 
866
866
  createMarkdownWithString: function(string){
867
867
  let markdown = Markdown.initWithString(string);
868
+ markdown.htmlOptions.firstLevelHeaderTagName = "h2";
869
+ markdown.htmlOptions.secondLevelHeaderTagName = "h3";
868
870
  markdown.delegate = this;
869
871
  return markdown;
870
872
  },
@@ -45,7 +45,7 @@
45
45
  elements.splice(index++, 0, typeSection);
46
46
  typeSection.setAttribute("class", "return");
47
47
  let header = typeSection.appendChild(document.createElement("header"));
48
- let h1 = header.appendChild(document.createElement("h1"));
48
+ let h1 = header.appendChild(document.createElement("h2"));
49
49
  h1.appendChild(document.createTextNode("Value Type"));
50
50
  let p = typeSection.appendChild(document.createElement("p"));
51
51
  let code = p.appendChild(document.createElement("code"));
@@ -65,7 +65,7 @@
65
65
  section.setAttribute("class", "variations");
66
66
  elements.push(section);
67
67
  let header = section.appendChild(document.createElement("header"));
68
- let h1 = header.appendChild(document.createElement("h1"));
68
+ let h1 = header.appendChild(document.createElement("h2"));
69
69
  h1.appendChild(document.createTextNode("Alternate Forms"));
70
70
 
71
71
  let ul = section.appendChild(document.createElement("ul"));
@@ -57,7 +57,7 @@
57
57
  elements.splice(index++, 0, params);
58
58
  params.setAttribute("class", "parameters");
59
59
  let header = params.appendChild(document.createElement("header"));
60
- let h1 = header.appendChild(document.createElement("h1"));
60
+ let h1 = header.appendChild(document.createElement("h2"));
61
61
  h1.setAttribute("outline-level", "1");
62
62
  h1.appendChild(document.createTextNode("Parameters"));
63
63
  let dl = fn.argumentListElement(document, this);
@@ -69,7 +69,7 @@
69
69
  elements.splice(index++, 0, returnSection);
70
70
  returnSection.setAttribute("class", "return");
71
71
  let header = returnSection.appendChild(document.createElement("header"));
72
- let h1 = header.appendChild(document.createElement("h1"));
72
+ let h1 = header.appendChild(document.createElement("h2"));
73
73
  h1.setAttribute("outline-level", "1");
74
74
  h1.appendChild(document.createTextNode("Return Value"));
75
75
 
@@ -66,7 +66,7 @@
66
66
  elements.splice(index++, 0, params);
67
67
  params.setAttribute("class", "parameters");
68
68
  let header = params.appendChild(document.createElement("header"));
69
- let h1 = header.appendChild(document.createElement("h1"));
69
+ let h1 = header.appendChild(document.createElement("h2"));
70
70
  h1.setAttribute("outline-level", "1");
71
71
  h1.appendChild(document.createTextNode("Parameters"));
72
72
  let dl = this.argumentListElement(document, this);
@@ -78,7 +78,7 @@
78
78
  elements.splice(index++, 0, returnSection);
79
79
  returnSection.setAttribute("class", "return");
80
80
  let header = returnSection.appendChild(document.createElement("header"));
81
- let h1 = header.appendChild(document.createElement("h1"));
81
+ let h1 = header.appendChild(document.createElement("h2"));
82
82
  h1.setAttribute("outline-level", "1");
83
83
  h1.appendChild(document.createTextNode("Return Value"));
84
84
  if (this.valueType){
@@ -62,7 +62,7 @@
62
62
  elements.splice(index++, 0, typeSection);
63
63
  typeSection.setAttribute("class", "return");
64
64
  let header = typeSection.appendChild(document.createElement("header"));
65
- let h1 = header.appendChild(document.createElement("h1"));
65
+ let h1 = header.appendChild(document.createElement("h2"));
66
66
  h1.appendChild(document.createTextNode("Value Type"));
67
67
  let p = typeSection.appendChild(document.createElement("p"));
68
68
  let code = p.appendChild(document.createElement("code"));
@@ -85,7 +85,7 @@
85
85
  section.setAttribute("class", "variations");
86
86
  elements.push(section);
87
87
  let header = section.appendChild(document.createElement("header"));
88
- let h1 = header.appendChild(document.createElement("h1"));
88
+ let h1 = header.appendChild(document.createElement("h2"));
89
89
  h1.appendChild(document.createTextNode("Alternate Forms"));
90
90
 
91
91
  let ul = section.appendChild(document.createElement("ul"));
@@ -54,7 +54,7 @@
54
54
  elements.push(inherits);
55
55
  inherits.setAttribute("class", "inherits");
56
56
  let header = inherits.appendChild(document.createElement("header"));
57
- let h1 = header.appendChild(document.createElement("h1"));
57
+ let h1 = header.appendChild(document.createElement("h2"));
58
58
  h1.appendChild(document.createTextNode("Inherits From"));
59
59
  let p = inherits.appendChild(document.createElement("p"));
60
60
  let code = p.appendChild(document.createElement("code"));
@@ -57,7 +57,7 @@
57
57
  elements.push(inherits);
58
58
  inherits.setAttribute("class", "inherits");
59
59
  let header = inherits.appendChild(document.createElement("header"));
60
- let h1 = header.appendChild(document.createElement("h1"));
60
+ let h1 = header.appendChild(document.createElement("h2"));
61
61
  h1.appendChild(document.createTextNode("Inherits From"));
62
62
  let p = inherits.appendChild(document.createElement("p"));
63
63
  let code = p.appendChild(document.createElement("code"));
@@ -42,7 +42,7 @@
42
42
  elements.splice(index++, 0, typeSection);
43
43
  typeSection.setAttribute("class", "return");
44
44
  let header = typeSection.appendChild(document.createElement("header"));
45
- let h1 = header.appendChild(document.createElement("h1"));
45
+ let h1 = header.appendChild(document.createElement("h2"));
46
46
  h1.appendChild(document.createTextNode("Resolved Value Type"));
47
47
  let p = typeSection.appendChild(document.createElement("p"));
48
48
  let code = p.appendChild(document.createElement("code"));
@@ -65,7 +65,7 @@
65
65
  section.setAttribute("class", "variations");
66
66
  elements.push(section);
67
67
  let header = section.appendChild(document.createElement("header"));
68
- let h1 = header.appendChild(document.createElement("h1"));
68
+ let h1 = header.appendChild(document.createElement("h2"));
69
69
  h1.appendChild(document.createTextNode("Alternate Forms"));
70
70
 
71
71
  let ul = section.appendChild(document.createElement("ul"));
@@ -79,7 +79,7 @@
79
79
  elements.push(topicsSection);
80
80
  topicsSection.setAttribute("class", "topics");
81
81
  let header = topicsSection.appendChild(document.createElement("header"));
82
- let h1 = header.appendChild(document.createElement("h1"));
82
+ let h1 = header.appendChild(document.createElement("h2"));
83
83
  h1.setAttribute("outline-level", "1");
84
84
  h1.appendChild(document.createTextNode("Topics"));
85
85
  for (let i = 0, l = this.topics.length; i < l; ++i){
@@ -88,7 +88,7 @@
88
88
  let section = topicsSection.appendChild(document.createElement("section"));
89
89
  section.setAttribute("class", "topic");
90
90
  let header = section.appendChild(document.createElement("header"));
91
- let h1 = header.appendChild(document.createElement("h1"));
91
+ let h1 = header.appendChild(document.createElement("h3"));
92
92
  h1.appendChild(document.createTextNode(topic.name));
93
93
  h1.setAttribute("outline-level", "2");
94
94
  let div = section.appendChild(document.createElement('div'));
@@ -44,6 +44,7 @@ JSClass("Documentation", JSObject, {
44
44
  this.fileManager = fileManager;
45
45
  },
46
46
 
47
+ customStylesheetURL: null,
47
48
  stylesheetURL: null,
48
49
  rootURL: null,
49
50
  outputDirectoryURL: null,
@@ -197,8 +198,15 @@ JSClass("Documentation", JSObject, {
197
198
  var stylesURL = this.wwwURL.appendingPathComponent('_style', true);
198
199
  var metadata = JSBundle.mainBundle.metadataForResourceName('doc-default', 'css');
199
200
  var contents = await JSBundle.mainBundle.getResourceData(metadata);
200
- this.stylesheetURL = stylesURL.appendingPathComponent('default.css');
201
- await this.fileManager.createFileAtURL(this.stylesheetURL, contents);
201
+ var defaultStyleURL = stylesURL.appendingPathComponent('default.css');
202
+ await this.fileManager.createFileAtURL(defaultStyleURL, contents);
203
+ if (this.customStylesheetURL !== null){
204
+ var customStyleURL = stylesURL.appendingPathComponent(this.customStylesheetURL.lastPathComponent);
205
+ await this.fileManager.copyItemAtURL(this.customStylesheetURL, customStyleURL);
206
+ this.stylesheetURL = customStyleURL;
207
+ }else{
208
+ this.stylesheetURL = defaultStyleURL;
209
+ }
202
210
  },
203
211
 
204
212
  loadSource: async function(url){
@@ -1197,7 +1197,9 @@ JSClass("HTMLBuilder", Builder, {
1197
1197
  this.httpServer.tlsKeyFileURL = JSURL.initWithString(this.arguments['tls-key'], this.workingDirectoryURL);
1198
1198
  }
1199
1199
  }
1200
- this.httpServer.run();
1200
+ await this.httpServer.run();
1201
+ }else{
1202
+ await this.httpServer.reload();
1201
1203
  }
1202
1204
  }else{
1203
1205
  if (this.httpServer !== null){
@@ -49,6 +49,7 @@ JSClass("HTMLProjectServer", JSObject, {
49
49
  _nodeHttpServer: null,
50
50
 
51
51
  run: async function(){
52
+ await this.reload();
52
53
  var scheme = "http";
53
54
  if (this.tlsCertificateFileURL !== null && this.tlsKeyFileURL !== null){
54
55
  scheme = "https";
@@ -81,6 +82,10 @@ JSClass("HTMLProjectServer", JSObject, {
81
82
  }
82
83
  },
83
84
 
85
+ reload: async function(){
86
+ await this.loadFilenameMap();
87
+ },
88
+
84
89
  stop: function(completion, target){
85
90
  if (!completion){
86
91
  completion = Promise.completion();
@@ -107,6 +112,32 @@ JSClass("HTMLProjectServer", JSObject, {
107
112
  "/apple-touch-icon-precomposed.png"
108
113
  ])),
109
114
 
115
+ filenameMap: null,
116
+
117
+ loadFilenameMap: async function(){
118
+ this.filenameMap = {};
119
+ var configFiles = this.project.info.HMTLManifestConfiguration || [];
120
+ if (!(configFiles instanceof Array)){
121
+ configFiles = [configFiles];
122
+ }
123
+
124
+ for (let i = 0, l = configFiles.length; i < l; ++i){
125
+ let config = configFiles[i];
126
+ if (typeof(config) == "string"){
127
+ let url = this.project.url.appendingPathComponent(configFiles[i]);
128
+ let contents = await this.fileManager.contentsAtURL(url);
129
+ let json = contents.stringByDecodingUTF8();
130
+ config = JSON.parse(json);
131
+ }
132
+ for (let k in config){
133
+ let item = config[k];
134
+ if (item.path && item.path !== k){
135
+ this.filenameMap[item.path] = k;
136
+ }
137
+ }
138
+ }
139
+ },
140
+
110
141
  _handleNodeRequest: async function(nodeRequest, nodeResponse){
111
142
  let statusCode = null;
112
143
  let headers = {};
@@ -141,6 +172,12 @@ JSClass("HTMLProjectServer", JSObject, {
141
172
  }
142
173
  }
143
174
  }
175
+ if (this.project.info.HTMLDocViewer){
176
+ if (this.filenameMap["docs" + url.path]){
177
+ statusCode = 302;
178
+ headers.Location = "/#" + url.path;
179
+ }
180
+ }
144
181
  if (statusCode === null){
145
182
  if (url.pathComponents.length === 2){
146
183
  if (url.pathComponents[1] === "index.html"){
@@ -161,7 +198,8 @@ JSClass("HTMLProjectServer", JSObject, {
161
198
  headers["Cache-Control"] = "max-age=315360000"; // ~10 years
162
199
  headers.Etag = url.lastPathComponent;
163
200
  }
164
- let fileURL = this.wwwURL.appendingPathComponents(url.pathComponents.slice(1));
201
+ let path = url.pathComponents.slice(1).join("/");
202
+ let fileURL = this.wwwURL.appendingPathComponents((this.filenameMap[path] || path).split("/"));
165
203
  let exists = await this.fileManager.itemExistsAtURL(fileURL);
166
204
  if (exists){
167
205
  let attributes = await this.fileManager.attributesOfItemAtURL(fileURL);
@@ -3,22 +3,22 @@ JSBundle.bundles['io.breakside.jskit'] = {
3
3
  "Info": {
4
4
  "JSBundleType": "node",
5
5
  "JSBundleIdentifier": "io.breakside.jskit",
6
- "JSBundleVersion": "2026.9.0",
6
+ "JSBundleVersion": "2026.10.0",
7
7
  "JSExecutableName": "jskit",
8
8
  "NPMOrganization": "breakside",
9
9
  "JSResources": [
10
10
  "Tests/HTMLTestRunner.js",
11
11
  "Tests/NodeTestRunner.js"
12
12
  ],
13
- "GitRevision": "7481a2557e5555dbf2a58e88ba6720b16de86277"
13
+ "GitRevision": "4f9f54d7fd9b56bd8c893ac8689a8efee1958ee5"
14
14
  },
15
15
  "Resources": [
16
16
  {
17
17
  "path": "doc-default.css",
18
18
  "ext": ".css",
19
- "byte_size": 11088,
19
+ "byte_size": 10906,
20
20
  "mimetype": "text/css",
21
- "hash": "fb20238b7c988f0d959bad2d071b06000068a39d",
21
+ "hash": "8e97b7b1e6c054c8490b19d2c4d64d14ad96cd3f",
22
22
  "nodeBundlePath": "Resources/doc-default.css"
23
23
  },
24
24
  {
@@ -21,11 +21,7 @@ article.doc h1,h2,h3,h4,h5,h5,b,strong{
21
21
  font-weight: 600;
22
22
  }
23
23
 
24
- article.doc > section > header > h1, article.doc > section > h1{
25
- font-size: 1.4em;
26
- }
27
-
28
- article.doc > section > section > header > h1{
24
+ article.doc h3{
29
25
  font-size: 1em;
30
26
  }
31
27
 
@@ -221,10 +217,6 @@ article.doc > section{
221
217
  margin-bottom: 40px;
222
218
  }
223
219
 
224
- article.doc > section.description h2{
225
- font-size: 1em;
226
- }
227
-
228
220
  article.doc > section.note{
229
221
  display: flex;
230
222
  flex-direction: row;
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.APIKit
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSIncludeDirectories:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.APIKitTesting
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.AuthKit
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.CSSOM
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ChartKit
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2021 Breakside Inc.
6
6
  # JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ConferenceKit
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.DBKit
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.DOM
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.Dispatch
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSCopyright: Copyright © 2020 Breakside Inc.
5
5
  JSBundleEnvironments:
6
6
  html: Dispatch+HTML.js
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.FontKit
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.Foundation
3
- JSBundleVersion: 2026.9.0
3
+ JSBundleVersion: 2026.10.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments: