kireji 0.9.0 → 0.11.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 (165) hide show
  1. package/README.md +3 -3
  2. package/package.json +1 -1
  3. package/src/app/kireji/description +1 -1
  4. package/src/app/kireji/editor/sections/type.d.ts +1 -0
  5. package/src/app/kireji/editor/tab-group/routeID-distribute.js +3 -0
  6. package/src/app/kireji/issue-tracker/filters/apply.js +29 -0
  7. package/src/app/kireji/issue-tracker/filters/boolean/part.json +10 -0
  8. package/src/app/kireji/issue-tracker/filters/boolean/point.js +7 -0
  9. package/src/app/kireji/issue-tracker/filters/boolean/view-update.js +1 -0
  10. package/src/app/kireji/issue-tracker/filters/constants.js +2 -0
  11. package/src/app/kireji/issue-tracker/filters/dropdown/constants.js +2 -0
  12. package/src/app/kireji/issue-tracker/filters/dropdown/none/part.json +1 -0
  13. package/src/app/kireji/issue-tracker/filters/dropdown/part.html_.js +15 -0
  14. package/src/app/kireji/issue-tracker/filters/dropdown/part.json +3 -0
  15. package/src/app/kireji/issue-tracker/filters/dropdown/priority/part.json +1 -0
  16. package/src/app/kireji/issue-tracker/filters/dropdown/status/part.json +1 -0
  17. package/src/app/kireji/issue-tracker/filters/dropdown/type.d.ts +12 -0
  18. package/src/app/kireji/issue-tracker/filters/dropdown/view-update.js +10 -0
  19. package/src/app/kireji/issue-tracker/filters/order/by/date/part.json +1 -0
  20. package/src/app/kireji/issue-tracker/filters/order/by/part.json +9 -0
  21. package/src/app/kireji/issue-tracker/filters/order/by/priority/part.json +1 -0
  22. package/src/app/kireji/issue-tracker/filters/order/by/status/part.json +1 -0
  23. package/src/app/kireji/issue-tracker/filters/order/by/title/part.json +1 -0
  24. package/src/app/kireji/issue-tracker/filters/order/by/type.d.ts +11 -0
  25. package/src/app/kireji/issue-tracker/filters/order/by/view-update.js +2 -0
  26. package/src/app/kireji/issue-tracker/filters/order/descending/part.json +3 -0
  27. package/src/app/kireji/issue-tracker/filters/order/descending/view-update.js +6 -0
  28. package/src/app/kireji/issue-tracker/filters/order/part.json +3 -0
  29. package/src/app/kireji/issue-tracker/filters/order/type.d.ts +10 -0
  30. package/src/app/kireji/issue-tracker/filters/part.css +149 -0
  31. package/src/app/kireji/issue-tracker/filters/part.html_.js +10 -3
  32. package/src/app/kireji/issue-tracker/filters/part.json +10 -1
  33. package/src/app/kireji/issue-tracker/filters/point.js +27 -0
  34. package/src/app/kireji/issue-tracker/filters/priority/a/part.json +3 -0
  35. package/src/app/kireji/issue-tracker/filters/priority/b/part.json +3 -0
  36. package/src/app/kireji/issue-tracker/filters/priority/c/part.json +3 -0
  37. package/src/app/kireji/issue-tracker/filters/priority/part.json +3 -0
  38. package/src/app/kireji/issue-tracker/filters/priority/type.d.ts +11 -0
  39. package/src/app/kireji/issue-tracker/filters/status/doing/part.json +3 -0
  40. package/src/app/kireji/issue-tracker/filters/status/done/part.json +3 -0
  41. package/src/app/kireji/issue-tracker/filters/status/part.json +8 -0
  42. package/src/app/kireji/issue-tracker/filters/status/to-do/part.json +3 -0
  43. package/src/app/kireji/issue-tracker/filters/status/type.d.ts +11 -0
  44. package/src/app/kireji/issue-tracker/filters/type.d.ts +13 -2
  45. package/src/app/kireji/issue-tracker/filters/view-hydrate.js +15 -0
  46. package/src/app/kireji/issue-tracker/filters/view-update.js +1 -0
  47. package/src/app/kireji/issue-tracker/issues.html_.js +1 -0
  48. package/src/app/kireji/issue-tracker/part.css_.js +1 -1
  49. package/src/app/kireji/issue-tracker/part.html_.js +1 -2
  50. package/src/app/kireji/issue-tracker/pathname-translate-canonical.js +0 -3
  51. package/src/app/kireji/issue-tracker/sections/issues/1776193480/title +1 -1
  52. package/src/app/kireji/issue-tracker/sections/issues/1776205544/links_.js +1 -0
  53. package/src/app/kireji/issue-tracker/sections/issues/1776208669/links_.js +1 -0
  54. package/src/app/kireji/issue-tracker/sections/issues/1776208910/description +7 -1
  55. package/src/app/kireji/issue-tracker/sections/issues/1776209115/links_.js +3 -0
  56. package/src/app/kireji/issue-tracker/sections/issues/1776211364/description +1 -1
  57. package/src/app/kireji/issue-tracker/sections/issues/1776211364/links_.js +5 -1
  58. package/src/app/kireji/issue-tracker/sections/issues/1776212048/links_.js +3 -0
  59. package/src/app/kireji/issue-tracker/sections/issues/1776212294/links_.js +4 -0
  60. package/src/app/kireji/issue-tracker/sections/issues/1776212412/links_.js +3 -0
  61. package/src/app/kireji/issue-tracker/sections/issues/1776212585/links_.js +3 -0
  62. package/src/app/kireji/issue-tracker/sections/issues/1776212811/links_.js +3 -0
  63. package/src/app/kireji/issue-tracker/sections/issues/1776262432/description +1 -0
  64. package/src/app/kireji/issue-tracker/sections/issues/1776262432/links_.js +8 -0
  65. package/src/app/kireji/issue-tracker/sections/issues/1776262432/part.json +3 -0
  66. package/src/app/kireji/issue-tracker/sections/issues/1776262432/priority +1 -0
  67. package/src/app/kireji/issue-tracker/sections/issues/1776262432/status +1 -0
  68. package/src/app/kireji/issue-tracker/sections/issues/1776262432/title +1 -0
  69. package/src/app/kireji/issue-tracker/sections/issues/1776263309/description +3 -0
  70. package/src/app/kireji/issue-tracker/sections/issues/1776263309/links_.js +3 -0
  71. package/src/app/kireji/issue-tracker/sections/issues/1776263309/part.json +3 -0
  72. package/src/app/kireji/issue-tracker/sections/issues/1776263309/priority +1 -0
  73. package/src/app/kireji/issue-tracker/sections/issues/1776263309/status +1 -0
  74. package/src/app/kireji/issue-tracker/sections/issues/1776263309/title +1 -0
  75. package/src/app/kireji/issue-tracker/sections/issues/1776282415/description +1 -0
  76. package/src/app/kireji/issue-tracker/sections/issues/1776282415/links_.js +3 -0
  77. package/src/app/kireji/issue-tracker/sections/issues/1776282415/part.json +3 -0
  78. package/src/app/kireji/issue-tracker/sections/issues/1776282415/priority +1 -0
  79. package/src/app/kireji/issue-tracker/sections/issues/1776282415/status +1 -0
  80. package/src/app/kireji/issue-tracker/sections/issues/1776282415/title +1 -0
  81. package/src/app/kireji/issue-tracker/sections/issues/1776307785/affects_.js +3 -0
  82. package/src/app/kireji/issue-tracker/sections/issues/1776307785/description +1 -0
  83. package/src/app/kireji/issue-tracker/sections/issues/1776307785/part.json +3 -0
  84. package/src/app/kireji/issue-tracker/sections/issues/1776307785/priority +1 -0
  85. package/src/app/kireji/issue-tracker/sections/issues/1776307785/status +1 -0
  86. package/src/app/kireji/issue-tracker/sections/issues/1776307785/title +1 -0
  87. package/src/app/kireji/issue-tracker/sections/issues/1776316907/affects_.js +3 -0
  88. package/src/app/kireji/issue-tracker/sections/issues/1776316907/description +5 -0
  89. package/src/app/kireji/issue-tracker/sections/issues/1776316907/part.json +3 -0
  90. package/src/app/kireji/issue-tracker/sections/issues/1776316907/priority +1 -0
  91. package/src/app/kireji/issue-tracker/sections/issues/1776316907/status +1 -0
  92. package/src/app/kireji/issue-tracker/sections/issues/1776316907/title +1 -0
  93. package/src/app/kireji/issue-tracker/sections/issues/1776319745/affects_.js +3 -0
  94. package/src/app/kireji/issue-tracker/sections/issues/1776319745/description +7 -0
  95. package/src/app/kireji/issue-tracker/sections/issues/1776319745/part.json +3 -0
  96. package/src/app/kireji/issue-tracker/sections/issues/1776319745/priority +1 -0
  97. package/src/app/kireji/issue-tracker/sections/issues/1776319745/status +1 -0
  98. package/src/app/kireji/issue-tracker/sections/issues/1776319745/title +1 -0
  99. package/src/app/kireji/issue-tracker/sections/issues/1776320694/affects_.js +3 -0
  100. package/src/app/kireji/issue-tracker/sections/issues/1776320694/description +3 -0
  101. package/src/app/kireji/issue-tracker/sections/issues/1776320694/links_.js +3 -0
  102. package/src/app/kireji/issue-tracker/sections/issues/1776320694/part.json +3 -0
  103. package/src/app/kireji/issue-tracker/sections/issues/1776320694/priority +1 -0
  104. package/src/app/kireji/issue-tracker/sections/issues/1776320694/status +1 -0
  105. package/src/app/kireji/issue-tracker/sections/issues/1776320694/title +1 -0
  106. package/src/app/kireji/issue-tracker/sections/issues/1776321398/affects_.js +3 -0
  107. package/src/app/kireji/issue-tracker/sections/issues/1776321398/description +1 -0
  108. package/src/app/kireji/issue-tracker/sections/issues/1776321398/links_.js +3 -0
  109. package/src/app/kireji/issue-tracker/sections/issues/1776321398/part.json +3 -0
  110. package/src/app/kireji/issue-tracker/sections/issues/1776321398/priority +1 -0
  111. package/src/app/kireji/issue-tracker/sections/issues/1776321398/status +1 -0
  112. package/src/app/kireji/issue-tracker/sections/issues/1776321398/title +1 -0
  113. package/src/app/kireji/issue-tracker/sections/issues/1776321594/affects_.js +4 -0
  114. package/src/app/kireji/issue-tracker/sections/issues/1776321594/description +8 -0
  115. package/src/app/kireji/issue-tracker/sections/issues/1776321594/part.json +3 -0
  116. package/src/app/kireji/issue-tracker/sections/issues/1776321594/priority +1 -0
  117. package/src/app/kireji/issue-tracker/sections/issues/1776321594/status +1 -0
  118. package/src/app/kireji/issue-tracker/sections/issues/1776321594/title +1 -0
  119. package/src/app/kireji/issue-tracker/sections/issues/1776323037/affects_.js +3 -0
  120. package/src/app/kireji/issue-tracker/sections/issues/1776323037/description +1 -0
  121. package/src/app/kireji/issue-tracker/sections/issues/1776323037/part.json +3 -0
  122. package/src/app/kireji/issue-tracker/sections/issues/1776323037/priority +1 -0
  123. package/src/app/kireji/issue-tracker/sections/issues/1776323037/status +1 -0
  124. package/src/app/kireji/issue-tracker/sections/issues/1776323037/title +1 -0
  125. package/src/app/kireji/issue-tracker/sections/issues/issue/card.html_.js +2 -2
  126. package/src/app/kireji/issue-tracker/sections/issues/issue/date-nice.js +1 -0
  127. package/src/app/kireji/issue-tracker/sections/issues/issue/part.html_.js +3 -2
  128. package/src/app/kireji/issue-tracker/sections/issues/issue/part.json +3 -0
  129. package/src/app/kireji/issue-tracker/sections/issues/issue/type.d.ts +2 -0
  130. package/src/app/kireji/issue-tracker/static.css +125 -33
  131. package/src/app/kireji/issue-tracker/type.d.ts +3 -0
  132. package/src/app/kireji/meta-description +1 -1
  133. package/src/build.js +5 -2
  134. package/src/description +1 -1
  135. package/src/landing-model.json +19 -1
  136. package/src/parts/abstract/match/routeID-collect.js +1 -1
  137. package/src/parts/abstract/match/routeID-distribute.js +3 -3
  138. package/src/parts/abstract/mesh/build.js +7 -2
  139. package/src/parts/abstract/mesh/data-get.js +4 -3
  140. package/src/parts/abstract/mesh/ray-cast.js +2 -2
  141. package/src/parts/abstract/mesh/routeID-distribute.js +3 -0
  142. package/src/parts/abstract/mesh/type.d.ts +5 -1
  143. package/src/parts/abstract/mix/model_.js +2 -2
  144. package/src/parts/abstract/mix/routeID-distribute.js +2 -2
  145. package/src/parts/abstract/part/build.js +20 -12
  146. package/src/parts/abstract/part/part-.xcf +0 -0
  147. package/src/parts/abstract/part/part.json +6 -3
  148. package/src/parts/abstract/part/part.xcf +0 -0
  149. package/src/parts/abstract/part/routeID-set.js +1 -1
  150. package/src/parts/abstract/part/type.d.ts +13 -7
  151. package/src/parts/abstract/part-mask/routeID-distribute.js +3 -0
  152. package/src/parts/abstract/permutation/routeID-distribute.js +3 -0
  153. package/src/parts/core/gpu/buffer-create.js +12 -0
  154. package/src/parts/core/gpu/part.json +7 -1
  155. package/src/parts/core/gpu/type.d.ts +4 -0
  156. package/src/parts/core/hot-keys/combo_.js +2 -0
  157. package/src/parts/desktop/color/part.html_.js +1 -1
  158. package/src/parts/desktop/era/modern/part.css +5 -10
  159. package/src/parts/desktop/era/part.html_.js +1 -1
  160. package/src/parts/desktop/era/vintage/static.css +5 -7
  161. package/src/schema.kireji.json +2 -2
  162. package/src/schema.part.json +8 -1
  163. package/src/static.css +2 -1
  164. package/src/type.d.ts +6 -4
  165. package/src/parts/core/gpu/webgpu.d.ts +0 -251
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Kireji - *Web Framework*
2
2
  > **<sub>Part of the Kireji Project</sub>**<br><sup><i>omnia ex una linea</i></sup>
3
3
 
4
- The **Kireji Web Framework** is a reactive full-stack web framework that can build and serve web apps and multi-origin web app ecosystems. It stores its runtime state in its routing system, achieving the information-theoretic lower bound of data compression. This enables comprehensive deep linking, session bookmarking without user accounts or local storage, peer-to-peer data sharing without uploads or accounts, and cross-origin communication without cookies or CORS.
4
+ The **Kireji Web Framework** is a reactive full-stack web framework that can build and serve web apps and multi-origin web ecosystems. It stores its runtime state in its routing system, achieving the information-theoretic lower bound of data compression. This enables comprehensive deep linking, session bookmarking without user accounts or local storage, peer-to-peer data sharing without uploads or accounts, and cross-origin communication without cookies or CORS.
5
5
  ## The Kireji Project
6
6
  The Kireji Project poses a question: **What if we could treat every web page as a point in a unified, mathematically mapped space?**
7
7
 
@@ -9,11 +9,11 @@ The Kireji Project poses a question: **What if we could treat every web page as
9
9
  | ---- | -------
10
10
  | [MPHF](https://github.com/kireji-app/mphf#readme) | [Coordinate System<br><sup>A bijective coordinate system for hashing structured data</sup>](https://github.com/kireji-app/mphf#readme)
11
11
  | **Kireji** | **Web Framework - ★ You are here<br><sup>A reactive web framework with MPHF routing</sup>**
12
- | [Demo](https://github.com/kireji-app/demo#readme) | [App Ecosystem<br><sup>An example app ecosystem demonstrating the project](https://github.com/kireji-app/demo#readme)</sup>
12
+ | [Demo](https://github.com/kireji-app/demo#readme) | [Ecosystem<br><sup>An example ecosystem demonstrating the project](https://github.com/kireji-app/demo#readme)</sup>
13
13
 
14
14
  ## Usage
15
15
 
16
- > <sub>Note: This framework is currently in alpha. Expect breaking changes with each version. Check out the [Demo App Ecosystem](https://github.com/kireji-app/demo#readme) to see a live project that uses this framework. Check back later to see if the framework has advanced into beta.</sub>
16
+ > <sub>Note: This framework is currently in alpha. Expect breaking changes with each version. Check out the [Demo Ecosystem](https://github.com/kireji-app/demo#readme) to see a live project that uses this framework. Check back later to see if the framework has advanced into beta.</sub>
17
17
 
18
18
  ```bash
19
19
  # In an empty git repo.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kireji",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "A web framework for stateful, entropy-perfect, multi-origin web applications. Currently in alpha. Expect breaking changes for version 0. Use with caution!",
5
5
  "files": [
6
6
  "src/",
@@ -1,4 +1,4 @@
1
- This application allows you to view all of the parts that define the Kireji Web Framework and the Demo App Ecosystem. It includes a sidebar pane and a property viewer pane.
1
+ This application allows you to view all of the parts that define the Kireji Web Framework and the Demo Ecosystem. It includes a sidebar pane and a property viewer pane.
2
2
 
3
3
  By clicking on a part in the sidebar, you can view the properties of that part and its contribution - if any - to the minimal perfect hash function that provides the ecosystem's optimal state compression.
4
4
 
@@ -3,6 +3,7 @@ declare interface IKirejiAppEditorSections
3
3
 
4
4
  // Subparts.
5
5
  readonly about: IKirejiAppEditorSection
6
+ readonly issues: IKirejiAppEditorSection
6
7
  readonly state: IKirejiAppEditorSection
7
8
  readonly stateSpace: IKirejiAppEditorSection
8
9
  readonly properties: IKirejiAppEditorSection
@@ -1,5 +1,8 @@
1
1
  tabGroup.updateRouteID(ROUTE_ID)
2
2
 
3
+ if (SKIP_RUNTIME_STATE_DISTRIBUTION)
4
+ return
5
+
3
6
  // Extract the number of open tabs.
4
7
  const numberOfTabsOpen = (() => {
5
8
  let estimate = tabGroup.tabBitDepths[ROUTE_ID.toString(2).length]
@@ -0,0 +1,29 @@
1
+ const {
2
+ order: { by, descending },
3
+ priority,
4
+ status
5
+ } = kirejiIssueFilters.model
6
+
7
+ const key = by === "date" ? "key" : by
8
+
9
+ return ISSUES
10
+ .filter(issue => status[issue.status] && priority[issue.priority.toLowerCase()])
11
+ .sort(({ [key]: a }, { [key]: b }) => {
12
+
13
+ // Logic: Handle the 'key' (timestamp) as a number
14
+ if (by === 'date') {
15
+ a = parseInt(a, 10)
16
+ b = parseInt(b, 10)
17
+ } else if (by === "title") {
18
+ a = a.toLowerCase()
19
+ b = b.toLowerCase()
20
+ }
21
+
22
+ if (a < b)
23
+ return descending ? 1 : -1
24
+
25
+ if (a > b)
26
+ return descending ? -1 : 1
27
+
28
+ return 0
29
+ })
@@ -0,0 +1,10 @@
1
+ {
2
+ "abstract": true,
3
+ "extends": "boolean",
4
+ "methods": {
5
+ "point": [
6
+ "POINTER_EVENT",
7
+ "TARGET_ELEMENT"
8
+ ]
9
+ }
10
+ }
@@ -0,0 +1,7 @@
1
+ pointer.handle({
2
+ click() {
3
+ boolean.toggle()
4
+ },
5
+ POINTER_EVENT,
6
+ TARGET_ELEMENT
7
+ })
@@ -0,0 +1 @@
1
+ Q(`#issue-tracker_kireji_app .toggle-control.${boolean.key}`).setAttribute("data-state", boolean.model ? "enabled" : "disabled")
@@ -0,0 +1,2 @@
1
+ const kirejiIssueFilters = this
2
+ const kirejiIssueTracker = kirejiIssueFilters[".."]
@@ -0,0 +1,2 @@
1
+ const kirejiIssueFiltersDropdown = this
2
+ const kirejiIssueFilters = kirejiIssueFiltersDropdown[".."]
@@ -0,0 +1,15 @@
1
+ const key = kirejiIssueFiltersDropdown.model
2
+
3
+ switch (key) {
4
+ case "none":
5
+ return ""
6
+
7
+ case "priority":
8
+ case "status":
9
+ return `<div id=issue-filter-dropdown class="issue-filter-dropdown-${key}">` + kirejiIssueFilters[key].map(boolean => (
10
+ `<span ${boolean.pointAttr()} id="color-control" tabIndex=0 data-state="${boolean.model ? "enabled" : "disabled"}" class="toggle-control ${boolean.key}">` + (
11
+ `<span class="label">${key === "status" ? boolean.key : boolean.key.toUpperCase()}:</span><flex-spacer></flex-spacer>` +
12
+ `<span class="base"><span class="handle"></span></span>`
13
+ ) + "</span>"
14
+ )).join("") + "</div>"
15
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "match"
3
+ }
@@ -0,0 +1,12 @@
1
+ declare interface IKirejiIssueFiltersDropdown
2
+ extends IMatch<IKirejiIssueFilters, IPartAny>,
3
+ IWebComponent {
4
+
5
+ // Subparts
6
+ readonly none: IPart<IKirejiIssueFiltersDropdown, null>
7
+ readonly order: IPart<IKirejiIssueFiltersDropdown, null>
8
+ readonly priority: IPart<IKirejiIssueFiltersDropdown, null>
9
+ readonly status: IPart<IKirejiIssueFiltersDropdown, null>
10
+ }
11
+
12
+ declare const kirejiIssueFiltersDropdown: IKirejiIssueFiltersDropdown
@@ -0,0 +1,10 @@
1
+ Q("#issue-filter-dropdown")?.remove()
2
+
3
+ if (kirejiIssueFiltersDropdown.model === "none")
4
+ return
5
+
6
+ Q(".issue-row.header").appendChild((() => {
7
+ const offscreen = document.createElement("div")
8
+ offscreen.innerHTML = kirejiIssueFiltersDropdown["part.html"]
9
+ return offscreen.querySelector("#issue-filter-dropdown")
10
+ })())
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "match",
3
+ "order": [
4
+ "title",
5
+ "priority",
6
+ "status",
7
+ "date"
8
+ ]
9
+ }
@@ -0,0 +1,11 @@
1
+ declare interface IKirejiIssueFiltersOrderBy
2
+ extends IMatch<IKirejiIssueFilters, IPartAny> {
3
+
4
+ // Subparts
5
+ readonly date: IPart<IKirejiIssueFiltersOrderBy, null>
6
+ readonly priority: IPart<IKirejiIssueFiltersOrderBy, null>
7
+ readonly status: IPart<IKirejiIssueFiltersOrderBy, null>
8
+ readonly title: IPart<IKirejiIssueFiltersOrderBy, null>
9
+ }
10
+
11
+ declare const kirejiIssueFiltersOrderBy: IKirejiIssueFiltersOrderBy
@@ -0,0 +1,2 @@
1
+ Q(".issue-row.header>[data-order]").removeAttribute("data-order")
2
+ Q(`.issue-row.header>.issue-${match.arm.key}`).setAttribute("data-order", "")
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "boolean"
3
+ }
@@ -0,0 +1,6 @@
1
+ const orders = ["descending", "ascending"]
2
+
3
+ if (boolean.model)
4
+ orders.reverse()
5
+
6
+ Q(".issue-row.header").classList.replace(...orders)
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "mix"
3
+ }
@@ -0,0 +1,10 @@
1
+ declare interface IKirejiIssueFiltersOrder
2
+ extends IMix<IKirejiIssueFilters, IPartAny>,
3
+ IWebComponent {
4
+
5
+ // Subparts
6
+ readonly by: IKirejiIssueFiltersOrderBy
7
+ readonly descending: IBoolean<IKirejiIssueFiltersOrder>
8
+ }
9
+
10
+ declare const kirejiIssueFiltersOrder: IKirejiIssueFiltersOrder
@@ -0,0 +1,149 @@
1
+ #issue-tracker_kireji_app .header svg {
2
+ display: block;
3
+ fill: none;
4
+ stroke: var(--fg);
5
+ stroke-width: 2;
6
+ height: var(--spacing);
7
+ stroke-linecap: round;
8
+ stroke-linejoin: round;
9
+ padding: 0 calc(var(--spacing) / 4);
10
+ }
11
+
12
+ body.modern #issue-tracker_kireji_app .header>span {
13
+ padding-left: calc(var(--spacing) * 1.5);
14
+ }
15
+
16
+ body.vintage #issue-tracker_kireji_app .header svg {
17
+ padding: 4px;
18
+ box-shadow: var(--deep-outset);
19
+ height: calc(8px + var(--spacing));
20
+ /* Modified version of `--deep-inset`. */
21
+ box-shadow:
22
+ inset -1px -1px black,
23
+ inset 0 1px var(--bg-light-er),
24
+ inset -2px -2px var(--bg-dark),
25
+ inset 1px 2px var(--bg-light-est);
26
+ }
27
+
28
+ body.vintage #issue-tracker_kireji_app .header>:is(.issue-status, .issue-priority) {
29
+ box-shadow:
30
+ inset 0 -1px black,
31
+ inset 1px 1px var(--bg-light-er),
32
+ inset -1px -2px var(--bg-dark),
33
+ inset 2px 2px var(--bg-light-est);
34
+ }
35
+
36
+ body.modern #issue-tracker_kireji_app .header {
37
+ --border-color: var(--bg);
38
+ border-bottom: 1px solid var(--border-color);
39
+ }
40
+
41
+ body.modern.dark #issue-tracker_kireji_app .header {
42
+ --border-color: var(--bg-un-mode);
43
+ }
44
+
45
+ body.vintage #issue-tracker_kireji_app .header {
46
+ margin-right: var(--scrollbar-width);
47
+ }
48
+
49
+ body.vintage #issue-tracker_kireji_app .header>* {
50
+ box-shadow: var(--deep-outset);
51
+ }
52
+
53
+ body.vintage #issue-tracker_kireji_app .header>[data-order]::before {
54
+ margin-right: 2px;
55
+ }
56
+
57
+ #issue-tracker_kireji_app .header>[data-order]::before {
58
+ content: "▼";
59
+ }
60
+
61
+ #issue-tracker_kireji_app .header.ascending>[data-order]::before {
62
+ content: "▲";
63
+ }
64
+
65
+ body.modern #issue-tracker_kireji_app .header>span:not([data-order]) {
66
+ content: "";
67
+ }
68
+
69
+ body.modern #issue-tracker_kireji_app .header>span::before {
70
+ position: absolute;
71
+ left: 0;
72
+ width: calc(1.5 * var(--spacing));
73
+ text-align: center;
74
+ }
75
+
76
+ body.vintage #issue-tracker_kireji_app .header:has(.issue-filter-dropdown-status)>.issue-filter-status,
77
+ body.vintage #issue-tracker_kireji_app .header:has(.issue-filter-dropdown-priority)>.issue-filter-priority,
78
+ body.vintage #issue-tracker_kireji_app .header>.down {
79
+ box-shadow: inset 0 0 0 1px var(--bg-dark-er);
80
+ background: var(--bg-checker), white;
81
+ padding: 5px 3px 3px 5px;
82
+ }
83
+
84
+ body.vintage #issue-tracker_kireji_app .header>.down {
85
+ background: transparent;
86
+ }
87
+
88
+ #issue-tracker_kireji_app #issue-filter-dropdown {
89
+ position: absolute;
90
+ top: 100%;
91
+ }
92
+
93
+ body.vintage #issue-tracker_kireji_app .issue-filter-dropdown-status {
94
+ right: calc(7 * var(--spacing));
95
+ }
96
+
97
+ body.vintage #issue-tracker_kireji_app .issue-filter-dropdown-priority {
98
+ right: 160px;
99
+ }
100
+
101
+ body.modern #issue-tracker_kireji_app .issue-filter-dropdown-status {
102
+ right: calc(7 * var(--spacing));
103
+ }
104
+
105
+ body.modern #issue-tracker_kireji_app .issue-filter-dropdown-priority {
106
+ right: calc(13 * var(--spacing));
107
+ }
108
+
109
+ #issue-tracker_kireji_app #issue-filter-dropdown {
110
+ background-color: var(--bg);
111
+ z-index: 1000;
112
+ }
113
+
114
+ body.vintage.dark #issue-tracker_kireji_app #issue-filter-dropdown {
115
+ background-color: var(--bg-dark);
116
+ }
117
+
118
+ body.modern #issue-tracker_kireji_app #issue-filter-dropdown {
119
+ padding: var(--spacing);
120
+ border-radius: calc(var(--spacing) / 2)
121
+ }
122
+
123
+ #issue-tracker_kireji_app:has(#issue-filter-dropdown) .issue-table {
124
+ pointer-events: none;
125
+ }
126
+
127
+ body.vintage #issue-tracker_kireji_app .header:after {
128
+ position: absolute;
129
+ right: calc(var(--scrollbar-width) * -1);
130
+ top: 0;
131
+ bottom: 0;
132
+ width: var(--scrollbar-width);
133
+ box-shadow: var(--deep-outset);
134
+ pointer-events: none;
135
+ content: "";
136
+ }
137
+
138
+ body.vintage #issue-tracker_kireji_app .header>:is(.issue-priority, .issue-status) {
139
+ width: calc(var(--column-width) - var(--spacing) - 8px);
140
+ }
141
+
142
+ body.modern #issue-tracker_kireji_app .header>:is(.issue-priority, .issue-status) {
143
+ width: calc(var(--column-width) - calc(1.5 * var(--spacing)));
144
+ text-align: center;
145
+ }
146
+
147
+ body.modern #issue-tracker_kireji_app .header>span:not(.issue-title) {
148
+ box-shadow: inset 0.5px 0 0 var(--border-color), -0.5px 0 0 var(--border-color);
149
+ }
@@ -1,6 +1,13 @@
1
+ const filterIcon = key => `<svg ${kirejiIssueFilters.pointAttr()} viewBox="0 0 24 24" class="issue-filter-${key}"><polygon points="22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3"></polygon></svg>`
2
+ const { by, descending } = kirejiIssueFilters.order.model
3
+ const dropdown = kirejiIssueFilters.dropdown.model
4
+
1
5
  return (
2
- "<section class=issue-filters>" + (
3
- "<h2>Filters</h2>" +
4
- "<p>Filter controls will go here</p>"
6
+ `<section class="issue-row header ${descending ? "descending" : "ascending"}">` + (
7
+ `<span ${kirejiIssueFilters.pointAttr()} class="issue-title"${by === "title" ? " data-order" : ""}>Issue</span>` +
8
+ `<span ${kirejiIssueFilters.pointAttr()} class="issue-priority"${by === "priority" ? " data-order" : ""} title="Priority">!</span>${filterIcon("priority")}` +
9
+ `<span ${kirejiIssueFilters.pointAttr()} class="issue-status"${by === "status" ? " data-order" : ""}>Status</span>${filterIcon("status")}` +
10
+ `<span ${kirejiIssueFilters.pointAttr()} class="issue-date"${by === "date" ? " data-order" : ""}>Created</span>` +
11
+ kirejiIssueFilters.dropdown["part.html"]
5
12
  ) + "</section>"
6
13
  )
@@ -1,3 +1,12 @@
1
1
  {
2
- "extends": "mix"
2
+ "extends": "mix",
3
+ "methods": {
4
+ "apply": [
5
+ "ISSUES"
6
+ ],
7
+ "point": [
8
+ "POINTER_EVENT",
9
+ "TARGET_ELEMENT"
10
+ ]
11
+ }
3
12
  }
@@ -0,0 +1,27 @@
1
+ pointer.handle({
2
+ click() {
3
+ if (TARGET_ELEMENT.hasAttribute("data-order")) {
4
+ kirejiIssueFilters.order.descending.toggle()
5
+ return
6
+ }
7
+
8
+ const className = TARGET_ELEMENT.classList.values().find(className => className.startsWith("issue-"))
9
+
10
+ if (!className)
11
+ throw "Unexpected item passed to issue filter's pointer handler."
12
+
13
+ const key = className.split("-").pop()
14
+
15
+ if (className.includes("filter")) {
16
+ if (kirejiIssueFilters.dropdown.model === key)
17
+ kirejiIssueFilters.dropdown.setModel("none")
18
+ else
19
+ kirejiIssueFilters.dropdown.setModel(key)
20
+ } else {
21
+ kirejiIssueFilters.order.descending.clear()
22
+ kirejiIssueFilters.order.by.setModel(key)
23
+ }
24
+ },
25
+ TARGET_ELEMENT,
26
+ POINTER_EVENT
27
+ })
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "boolean..."
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "boolean..."
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "boolean..."
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "mix"
3
+ }
@@ -0,0 +1,11 @@
1
+ declare interface IKirejiIssueFiltersPriority
2
+ extends IMix<IKirejiIssueFilters, IBoolean<IKirejiIssueFiltersPriority>>,
3
+ IWebComponent {
4
+
5
+ // Subparts
6
+ readonly a: IBoolean<IKirejiIssueFiltersPriority>
7
+ readonly b: IBoolean<IKirejiIssueFiltersPriority>
8
+ readonly c: IBoolean<IKirejiIssueFiltersPriority>
9
+ }
10
+
11
+ declare const kirejiIssueFiltersPriority: IKirejiIssueFiltersPriority
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "boolean..."
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "boolean..."
3
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "mix",
3
+ "order": [
4
+ "to-do",
5
+ "doing",
6
+ "done"
7
+ ]
8
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "boolean..."
3
+ }
@@ -0,0 +1,11 @@
1
+ declare interface IKirejiIssueFiltersStatus
2
+ extends IMix<IKirejiIssueFilters, IPartAny>,
3
+ IWebComponent {
4
+
5
+ // Subparts
6
+ readonly a: IBoolean<IKirejiIssueFiltersPriority>
7
+ readonly b: IBoolean<IKirejiIssueFiltersPriority>
8
+ readonly c: IBoolean<IKirejiIssueFiltersPriority>
9
+ }
10
+
11
+ declare const kirejiIssueFiltersStatus: IKirejiIssueFiltersStatus
@@ -1,6 +1,17 @@
1
1
  declare interface IKirejiIssueFilters
2
- extends IMix<IKirejiIssueTrackerApp, IPartAny> {
2
+ extends IMix<IKirejiIssueTrackerApp, IPartAny>,
3
+ IWebComponent {
3
4
 
5
+ // Subparts
6
+ readonly dropdown: IKirejiIssueFiltersDropdown
7
+ readonly order: IKirejiIssueFiltersOrder
8
+ readonly priority: IKirejiIssueFiltersPriority
9
+ readonly status: IKirejiIssueFiltersStatus
10
+
11
+ // Serialized Properties.
12
+ readonly apply(ISSUES: IKirejiIssues): IKirejiIssue[]
4
13
  }
5
14
 
6
- declare const kirejiIssueFilters: IKirejiIssueFilters
15
+ declare const kirejiIssueFilters: IKirejiIssueFilters
16
+ /** The incoming argument for the kireji issue filter `apply()` method. */
17
+ declare const ISSUES: IKirejiIssues
@@ -0,0 +1,15 @@
1
+ client.promise.then(() => {
2
+
3
+ document.addEventListener('pointerdown', pointerEvent => {
4
+ const key = kirejiIssueFilters.dropdown.model
5
+ if (key !== "none" && !inRect(pointerEvent, Q("#issue-filter-dropdown").getBoundingClientRect())) {
6
+
7
+ if (inRect(pointerEvent, Q("#issue-tracker_kireji_app .issue-table").getBoundingClientRect()) || inRect(pointerEvent, Q(`#issue-tracker_kireji_app .header>.issue-filter-${key}`).getBoundingClientRect())) {
8
+ pointerEvent.stopPropagation()
9
+ pointerEvent.preventDefault()
10
+ }
11
+
12
+ kirejiIssueFilters.dropdown.setModel("none")
13
+ }
14
+ }, { capture: true })
15
+ })
@@ -0,0 +1 @@
1
+ Q(".issue-table>scroller->scroll-content").innerHTML = kirejiIssueTracker["issues.html"]
@@ -0,0 +1 @@
1
+ return kirejiIssueFilters.apply(kirejiIssueSections.issues).map(issue => issue["card.html"]).join("\n ")
@@ -1 +1 @@
1
- return kirejiIssueTracker.scroller["part.css"] + kirejiIssueTracker["static.css"]
1
+ return kirejiIssueTracker.scroller["part.css"] + kirejiIssueFilters["part.css"] + kirejiIssueTracker["static.css"]
@@ -1,5 +1,4 @@
1
1
  return kirejiIssueFilters["part.html"] + (
2
- // TODO: use filters here
3
- "<section class=issue-table>" + kirejiIssueTracker.scroller.wrap(kirejiIssueSections.issues.map(issue => issue["card.html"]).join("\n ")) + "</section>" +
2
+ "<section class=issue-table>" + kirejiIssueTracker.scroller.wrap(kirejiIssueTracker["issues.html"]) + "</section>" +
4
3
  `<section id=kireji-issue-modal>${kirejiIssueSections.arm["part.html"] ?? ""}</section>`
5
4
  )
@@ -11,9 +11,6 @@ if (!("kireji" in model.app))
11
11
  if (!("issue-tracker" in model.app.kireji))
12
12
  model.app.kireji["issue-tracker"] = {}
13
13
 
14
- // todo: add scroller
15
- // model.app.kireji["issue-tracker"].scroller = 0
16
-
17
14
  if (PATHNAME === "/") {
18
15
 
19
16
  if (HASH !== "#top")
@@ -1 +1 @@
1
- Add Issue Tracker App
1
+ Create Issue Tracker App
@@ -0,0 +1 @@
1
+ return [kirejiIssues[1776208669]]
@@ -0,0 +1 @@
1
+ return [kirejiIssues[1776205544]]
@@ -1 +1,7 @@
1
- Add alt attributes for all images. Allow deep zoom for low-vision users. Headings shouldn't skip levels (for example, an h4 appearing after an h1 with no h2 or h3 in-between).
1
+ Add alt attributes for all images. Allow deep zoom for low-vision users. Headings shouldn't skip levels (for example, an h4 appearing after an h1 with no h2 or h3 in-between).
2
+
3
+ Do a full pass on all apps examining their tab behavior. Consider assigning tabindex=0 to all and only the first primary element of each region that the user should be able to tab between. For example, having only the first item of a list of icons be tabbable. Then, perhaps try "moving" that tabindex attribute to other items in the same set when other keyboard keys are used (such as arrow keys).
4
+
5
+ Can the keyboard be used to control each app? What is it like to work with apps without a pointing device?
6
+
7
+ What do apps sound like when spoken aloud by a screen reader?
@@ -0,0 +1,3 @@
1
+ return [
2
+ kirejiIssues[1776263309],
3
+ ]
@@ -1 +1 @@
1
- After the implementation of dynamic instancing, but before cross-origin PWA, implement restored windows on desktop.parts. Consider having other hosts in the demo app ecosystem forward back to desktop.parts. Restored windows have their own subpermutation over the pinned (task bar) apps permutation. Note: an open app is actually just an app which is pinned to the task bar, but only those pinned apps can be viewed. These pinned tasks should be able to be reordered by dragging and dropping. Title bars should have a restore button. The desktop application should become an abstract which can be extended to create a desktop at any address so that framework users can implement all of their apps in a single domain if they want. Consider a "maximized on open" setting (or, conversely, a default window state) so that apps which are not currently pinned are opened into the given configuration as they are pinned. Forwarding all domains to the desktop (while pinning the apps that were just visited, especially if pinned maximized) would eliminate cross-origin full-screen and PWA problems. Consider if full-screened apps should have taskbar and titlebar visible. The presentation of sites on first visit should be considered - users won't know that it is an overall desktop they are visiting or this could distract them from the specific domain's intended content. Canonical links and SEO per-domain must still be handled correctly. Consider if an unopened task can be dragged from the menu and/or desktop in order to open it (pin and view it). Restored windows should be movable and resizable.
1
+ After the implementation of dynamic instancing, but before cross-origin PWA, implement restored windows on desktop.parts. Consider having other hosts in the Demo Ecosystem forward back to desktop.parts. Restored windows have their own subpermutation over the pinned (task bar) apps permutation. Note: an open app is actually just an app which is pinned to the task bar, but only those pinned apps can be viewed. These pinned tasks should be able to be reordered by dragging and dropping. Title bars should have a restore button. The desktop application should become an abstract which can be extended to create a desktop at any address so that framework users can implement all of their apps in a single domain if they want. Consider a "maximized on open" setting (or, conversely, a default window state) so that apps which are not currently pinned are opened into the given configuration as they are pinned. Forwarding all domains to the desktop (while pinning the apps that were just visited, especially if pinned maximized) would eliminate cross-origin full-screen and PWA problems. Consider if full-screened apps should have taskbar and titlebar visible. The presentation of sites on first visit should be considered - users won't know that it is an overall desktop they are visiting or this could distract them from the specific domain's intended content. Canonical links and SEO per-domain must still be handled correctly. Consider if an unopened task can be dragged from the menu and/or desktop in order to open it (pin and view it). Restored windows should be movable and resizable.