@prestack/thread-ui 0.0.1 → 0.1.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 (279) hide show
  1. package/CHANGELOG.md +177 -0
  2. package/dist/ui/animations/anm_appear.ts +13 -0
  3. package/dist/ui/animations/anm_blur_in.ts +19 -0
  4. package/dist/ui/animations/anm_blur_out.ts +18 -0
  5. package/dist/ui/animations/anm_dismiss.ts +18 -0
  6. package/dist/ui/animations/anm_drop.ts +19 -0
  7. package/dist/ui/animations/anm_fall.ts +18 -0
  8. package/dist/ui/animations/anm_flash.ts +18 -0
  9. package/dist/ui/animations/anm_glow.ts +16 -0
  10. package/dist/ui/animations/anm_lift.ts +16 -0
  11. package/dist/ui/animations/anm_nudge.ts +16 -0
  12. package/dist/ui/animations/anm_pop_in.ts +23 -0
  13. package/dist/ui/animations/anm_pop_out.ts +22 -0
  14. package/dist/ui/animations/anm_press.ts +12 -0
  15. package/dist/ui/animations/anm_pulse.ts +13 -0
  16. package/dist/ui/animations/anm_rise.ts +19 -0
  17. package/dist/ui/animations/anm_shake.ts +13 -0
  18. package/dist/ui/animations/anm_slide_in_left.ts +19 -0
  19. package/dist/ui/animations/anm_slide_in_right.ts +19 -0
  20. package/dist/ui/animations/anm_slide_out_left.ts +18 -0
  21. package/dist/ui/animations/anm_slide_out_right.ts +18 -0
  22. package/dist/ui/animations/anm_spin.ts +12 -0
  23. package/dist/ui/animations/anm_swell.ts +16 -0
  24. package/dist/ui/animations/anm_wobble.ts +24 -0
  25. package/dist/ui/animations/anm_zoom_in.ts +19 -0
  26. package/dist/ui/animations/anm_zoom_out.ts +18 -0
  27. package/dist/ui/animations.js +2 -3
  28. package/dist/ui/animations.ts +316 -0
  29. package/dist/ui/attach.js +13 -10
  30. package/dist/ui/attach.ts +607 -0
  31. package/dist/ui/charts.tsx +74 -0
  32. package/dist/ui/checked.d.ts +2 -2
  33. package/dist/ui/checked.ts +32 -0
  34. package/dist/ui/collector.ts +140 -0
  35. package/dist/ui/compositions.d.ts +11 -2
  36. package/dist/ui/compositions.js +283 -59
  37. package/dist/ui/compositions.ts +633 -0
  38. package/dist/ui/consent.ts +55 -0
  39. package/dist/ui/content.tsx +39 -0
  40. package/dist/ui/contrast.ts +27 -0
  41. package/dist/ui/controls.tsx +30 -0
  42. package/dist/ui/disclosure.tsx +22 -0
  43. package/dist/ui/dismiss-layer.ts +87 -0
  44. package/dist/ui/door.ts +140 -0
  45. package/dist/ui/drag.ts +316 -0
  46. package/dist/ui/elements/accordion.js +2 -2
  47. package/dist/ui/elements/accordion.tsx +47 -0
  48. package/dist/ui/elements/accordion.works.ts +66 -0
  49. package/dist/ui/elements/aspect-ratio.js +1 -1
  50. package/dist/ui/elements/aspect-ratio.tsx +30 -0
  51. package/dist/ui/elements/aspect-ratio.works.ts +5 -0
  52. package/dist/ui/elements/avatar.js +1 -1
  53. package/dist/ui/elements/avatar.tsx +33 -0
  54. package/dist/ui/elements/avatar.works.ts +16 -0
  55. package/dist/ui/elements/badge.js +1 -1
  56. package/dist/ui/elements/badge.tsx +32 -0
  57. package/dist/ui/elements/badge.works.ts +9 -0
  58. package/dist/ui/elements/bars.js +2 -2
  59. package/dist/ui/elements/bars.tsx +49 -0
  60. package/dist/ui/elements/bars.works.ts +29 -0
  61. package/dist/ui/elements/box.js +3 -2
  62. package/dist/ui/elements/box.tsx +35 -0
  63. package/dist/ui/elements/breadcrumb.js +2 -2
  64. package/dist/ui/elements/breadcrumb.tsx +37 -0
  65. package/dist/ui/elements/breadcrumb.works.ts +24 -0
  66. package/dist/ui/elements/button.js +1 -1
  67. package/dist/ui/elements/button.tsx +45 -0
  68. package/dist/ui/elements/button.works.tsx +52 -0
  69. package/dist/ui/elements/column.js +1 -1
  70. package/dist/ui/elements/column.tsx +28 -0
  71. package/dist/ui/elements/consent.js +2 -2
  72. package/dist/ui/elements/consent.tsx +70 -0
  73. package/dist/ui/elements/consent.works.tsx +132 -0
  74. package/dist/ui/elements/donut.js +2 -2
  75. package/dist/ui/elements/donut.tsx +44 -0
  76. package/dist/ui/elements/donut.works.ts +42 -0
  77. package/dist/ui/elements/each.js +1 -1
  78. package/dist/ui/elements/each.tsx +33 -0
  79. package/dist/ui/elements/each.works.tsx +82 -0
  80. package/dist/ui/elements/empty.js +1 -1
  81. package/dist/ui/elements/empty.tsx +32 -0
  82. package/dist/ui/elements/field.js +1 -1
  83. package/dist/ui/elements/field.tsx +44 -0
  84. package/dist/ui/elements/field.works.ts +65 -0
  85. package/dist/ui/elements/funnel.js +2 -2
  86. package/dist/ui/elements/funnel.tsx +49 -0
  87. package/dist/ui/elements/funnel.works.ts +37 -0
  88. package/dist/ui/elements/gauge.js +1 -1
  89. package/dist/ui/elements/gauge.tsx +39 -0
  90. package/dist/ui/elements/gauge.works.ts +42 -0
  91. package/dist/ui/elements/glyph.js +1 -1
  92. package/dist/ui/elements/glyph.tsx +29 -0
  93. package/dist/ui/elements/glyph.works.tsx +42 -0
  94. package/dist/ui/elements/grid.js +1 -1
  95. package/dist/ui/elements/grid.tsx +28 -0
  96. package/dist/ui/elements/heatmap.js +2 -2
  97. package/dist/ui/elements/heatmap.tsx +47 -0
  98. package/dist/ui/elements/heatmap.works.ts +24 -0
  99. package/dist/ui/elements/hit-box.js +1 -1
  100. package/dist/ui/elements/hit-box.tsx +46 -0
  101. package/dist/ui/elements/hit-box.works.tsx +576 -0
  102. package/dist/ui/elements/image.js +1 -1
  103. package/dist/ui/elements/image.tsx +28 -0
  104. package/dist/ui/elements/line-chart.js +2 -2
  105. package/dist/ui/elements/line-chart.tsx +44 -0
  106. package/dist/ui/elements/line-chart.works.ts +41 -0
  107. package/dist/ui/elements/link.js +1 -1
  108. package/dist/ui/elements/link.tsx +37 -0
  109. package/dist/ui/elements/link.works.ts +25 -0
  110. package/dist/ui/elements/media.js +1 -1
  111. package/dist/ui/elements/media.tsx +56 -0
  112. package/dist/ui/elements/menu.js +2 -2
  113. package/dist/ui/elements/menu.tsx +50 -0
  114. package/dist/ui/elements/menu.works.tsx +153 -0
  115. package/dist/ui/elements/money.js +1 -1
  116. package/dist/ui/elements/money.tsx +28 -0
  117. package/dist/ui/elements/money.works.ts +9 -0
  118. package/dist/ui/elements/pagination.js +2 -2
  119. package/dist/ui/elements/pagination.tsx +38 -0
  120. package/dist/ui/elements/pagination.works.ts +20 -0
  121. package/dist/ui/elements/progress.js +1 -1
  122. package/dist/ui/elements/progress.tsx +33 -0
  123. package/dist/ui/elements/progress.works.ts +8 -0
  124. package/dist/ui/elements/radio-group.js +2 -2
  125. package/dist/ui/elements/radio-group.tsx +49 -0
  126. package/dist/ui/elements/radio-group.works.ts +33 -0
  127. package/dist/ui/elements/row.js +1 -1
  128. package/dist/ui/elements/row.tsx +28 -0
  129. package/dist/ui/elements/scatter.js +1 -1
  130. package/dist/ui/elements/scatter.tsx +41 -0
  131. package/dist/ui/elements/scatter.works.ts +38 -0
  132. package/dist/ui/elements/select.js +2 -2
  133. package/dist/ui/elements/select.tsx +42 -0
  134. package/dist/ui/elements/select.works.ts +5 -0
  135. package/dist/ui/elements/separator.js +1 -1
  136. package/dist/ui/elements/separator.tsx +30 -0
  137. package/dist/ui/elements/skeleton.js +1 -1
  138. package/dist/ui/elements/skeleton.tsx +30 -0
  139. package/dist/ui/elements/slider.js +1 -1
  140. package/dist/ui/elements/slider.tsx +33 -0
  141. package/dist/ui/elements/slider.works.ts +5 -0
  142. package/dist/ui/elements/sparkline.js +1 -1
  143. package/dist/ui/elements/sparkline.tsx +36 -0
  144. package/dist/ui/elements/sparkline.works.ts +32 -0
  145. package/dist/ui/elements/spinner.js +1 -1
  146. package/dist/ui/elements/spinner.tsx +32 -0
  147. package/dist/ui/elements/stack.js +1 -1
  148. package/dist/ui/elements/stack.tsx +28 -0
  149. package/dist/ui/elements/stat.js +1 -1
  150. package/dist/ui/elements/stat.tsx +35 -0
  151. package/dist/ui/elements/stat.works.ts +14 -0
  152. package/dist/ui/elements/surface.js +1 -1
  153. package/dist/ui/elements/surface.tsx +35 -0
  154. package/dist/ui/elements/surface.works.ts +9 -0
  155. package/dist/ui/elements/table.js +2 -2
  156. package/dist/ui/elements/table.tsx +61 -0
  157. package/dist/ui/elements/table.works.ts +30 -0
  158. package/dist/ui/elements/tabs.js +2 -2
  159. package/dist/ui/elements/tabs.tsx +47 -0
  160. package/dist/ui/elements/tabs.works.ts +84 -0
  161. package/dist/ui/elements/text.js +1 -1
  162. package/dist/ui/elements/text.tsx +32 -0
  163. package/dist/ui/elements/textarea.js +1 -1
  164. package/dist/ui/elements/textarea.tsx +37 -0
  165. package/dist/ui/elements/textarea.works.ts +5 -0
  166. package/dist/ui/elements/time.js +1 -1
  167. package/dist/ui/elements/time.tsx +34 -0
  168. package/dist/ui/elements/time.works.ts +25 -0
  169. package/dist/ui/elements/toggle.js +1 -1
  170. package/dist/ui/elements/toggle.tsx +33 -0
  171. package/dist/ui/elements/toggle.works.ts +5 -0
  172. package/dist/ui/elements/tooltip.js +1 -1
  173. package/dist/ui/elements/tooltip.tsx +39 -0
  174. package/dist/ui/elements/tooltip.works.ts +77 -0
  175. package/dist/ui/elements/value.js +1 -1
  176. package/dist/ui/elements/value.tsx +30 -0
  177. package/dist/ui/elements/value.works.ts +9 -0
  178. package/dist/ui/elements.ts +127 -0
  179. package/dist/ui/focus-scope.ts +121 -0
  180. package/dist/ui/fonts.ts +355 -0
  181. package/dist/ui/generators/dev.js +2 -1
  182. package/dist/ui/generators/dev.ts +80 -0
  183. package/dist/ui/generators/elements.d.ts +1 -11
  184. package/dist/ui/generators/elements.js +44 -14
  185. package/dist/ui/generators/elements.ts +794 -0
  186. package/dist/ui/generators/i18n.js +2 -3
  187. package/dist/ui/generators/i18n.ts +300 -0
  188. package/dist/ui/generators/icons.js +3 -12
  189. package/dist/ui/generators/icons.ts +214 -0
  190. package/dist/ui/generators/react.js +13 -5
  191. package/dist/ui/generators/react.ts +269 -0
  192. package/dist/ui/generators/routes.d.ts +1 -0
  193. package/dist/ui/generators/routes.js +99 -83
  194. package/dist/ui/generators/routes.ts +743 -0
  195. package/dist/ui/generators/show.js +4 -12
  196. package/dist/ui/generators/show.ts +260 -0
  197. package/dist/ui/generators/styles.js +3 -4
  198. package/dist/ui/generators/styles.ts +669 -0
  199. package/dist/ui/generators/variants.js +2 -3
  200. package/dist/ui/generators/variants.ts +204 -0
  201. package/dist/ui/i18n/catalogs/en.ts +191 -0
  202. package/dist/ui/i18n/format.ts +221 -0
  203. package/dist/ui/i18n/locales.ts +33 -0
  204. package/dist/ui/i18n/parse.ts +315 -0
  205. package/dist/ui/i18n/translator.ts +31 -0
  206. package/dist/ui/i18n/types.ts +96 -0
  207. package/dist/ui/icons.ts +331 -0
  208. package/dist/ui/islands/map.ts +58 -0
  209. package/dist/ui/localizations.ts +75 -0
  210. package/dist/ui/material.ts +236 -0
  211. package/dist/ui/materials/mat_bordered.ts +13 -0
  212. package/dist/ui/materials/mat_ceramic.ts +13 -0
  213. package/dist/ui/materials/mat_clay.ts +13 -0
  214. package/dist/ui/materials/mat_elevated.ts +24 -0
  215. package/dist/ui/materials/mat_flat.ts +34 -0
  216. package/dist/ui/materials/mat_glass.ts +20 -0
  217. package/dist/ui/materials/mat_lit.ts +13 -0
  218. package/dist/ui/materials/mat_moulded.ts +11 -0
  219. package/dist/ui/materials.js +2 -3
  220. package/dist/ui/materials.ts +205 -0
  221. package/dist/ui/modes.ts +44 -0
  222. package/dist/ui/navigation.tsx +32 -0
  223. package/dist/ui/positioning.ts +90 -0
  224. package/dist/ui/presented.tsx +119 -0
  225. package/dist/ui/provider.d.ts +2 -0
  226. package/dist/ui/provider.js +7 -1
  227. package/dist/ui/provider.tsx +182 -0
  228. package/dist/ui/render-loop.ts +133 -0
  229. package/dist/ui/roving-focus.ts +161 -0
  230. package/dist/ui/screens.js +22 -22
  231. package/dist/ui/screens.ts +141 -0
  232. package/dist/ui/scroll-lock.ts +28 -0
  233. package/dist/ui/series.ts +97 -0
  234. package/dist/ui/signals.ts +386 -0
  235. package/dist/ui/styleguide.ts +231 -0
  236. package/dist/ui/styleguides.ts +374 -0
  237. package/dist/ui/themes.ts +22 -0
  238. package/dist/ui/token.js +1 -1
  239. package/dist/ui/token.ts +78 -0
  240. package/dist/ui/tokens/shadow.ts +25 -0
  241. package/dist/ui/tokens.js +1 -2
  242. package/dist/ui/tokens.ts +234 -0
  243. package/dist/ui/validators.ts +232 -0
  244. package/dist/ui/variant.d.ts +1 -0
  245. package/dist/ui/variant.js +3 -0
  246. package/dist/ui/variant.ts +352 -0
  247. package/dist/ui/variants/var_avatar-round.ts +14 -0
  248. package/dist/ui/variants/var_bubble-me.ts +14 -0
  249. package/dist/ui/variants/var_bubble-them.ts +13 -0
  250. package/dist/ui/variants/var_button-border.ts +76 -0
  251. package/dist/ui/variants/var_button-cta.ts +76 -0
  252. package/dist/ui/variants/var_button-destructive-ghost.ts +72 -0
  253. package/dist/ui/variants/var_button-destructive.ts +76 -0
  254. package/dist/ui/variants/var_button-fill.ts +76 -0
  255. package/dist/ui/variants/var_button-ghost.ts +72 -0
  256. package/dist/ui/variants/var_button-glass.ts +55 -0
  257. package/dist/ui/variants/var_button-normal.ts +76 -0
  258. package/dist/ui/variants/var_button-quiet.ts +74 -0
  259. package/dist/ui/variants/var_card.ts +17 -0
  260. package/dist/ui/variants/var_chip.ts +13 -0
  261. package/dist/ui/variants/var_choice.ts +15 -0
  262. package/dist/ui/variants/var_framed.ts +10 -0
  263. package/dist/ui/variants/var_glyph-plain.ts +11 -0
  264. package/dist/ui/variants/var_input.ts +43 -0
  265. package/dist/ui/variants/var_link-inline.ts +29 -0
  266. package/dist/ui/variants/var_list-row.ts +34 -0
  267. package/dist/ui/variants/var_rule.ts +10 -0
  268. package/dist/ui/variants/var_skeleton-block.ts +12 -0
  269. package/dist/ui/variants/var_spinner-turning.ts +12 -0
  270. package/dist/ui/variants/var_stat-tile.ts +13 -0
  271. package/dist/ui/variants/var_tab-bar.ts +15 -0
  272. package/dist/ui/variants/var_tap-target.ts +25 -0
  273. package/dist/ui/variants.ts +64 -0
  274. package/dist/ui/wrappers.d.ts +4 -1
  275. package/dist/ui/wrappers.js +60 -20
  276. package/dist/ui/wrappers.tsx +426 -0
  277. package/package.json +8 -2
  278. package/dist/ui/makers/message.d.ts +0 -1
  279. package/dist/ui/makers/message.js +0 -230
@@ -0,0 +1,74 @@
1
+ 'use client'
2
+
3
+ import { formatValue } from './validators.ts'
4
+ import { seriesColour, seriesRamp } from './series.ts'
5
+ import { classOfElement } from './variant.ts'
6
+
7
+ import { element, useSurface, useUi } from './wrappers.tsx'
8
+ import type { MessageKey } from './content.tsx'
9
+
10
+ export type Row = Readonly<Record<string, unknown>>
11
+
12
+ export type WhenTight = 'scroll' | 'bucket' | 'wrap' | 'shrink'
13
+
14
+ export interface ChartBase {
15
+ readonly rows: readonly Row[]
16
+ readonly titleKey?: MessageKey
17
+
18
+ readonly whenTight?: WhenTight
19
+
20
+ readonly format?: string
21
+ }
22
+
23
+ export const num = (row: Row, key: string): number => {
24
+ const v = row[key]
25
+ return typeof v === 'number' ? v : Number(v ?? 0)
26
+ }
27
+ export const str = (row: Row, key: string): string => String(row[key] ?? '')
28
+
29
+ export function useRamp(count: number): readonly string[] {
30
+ const { palette } = useUi()
31
+ return seriesRamp(palette.accent, palette.surface, Math.max(1, count))
32
+ }
33
+
34
+ export function placed(element: string, place: string): string {
35
+ return `${classOfElement(element)}-${place}`
36
+ }
37
+
38
+ export function measured(held: Readonly<Record<string, string | number>>): Record<string, string | number> {
39
+ const out: Record<string, string | number> = {}
40
+ for (const [name, value] of Object.entries(held)) out[`--${name}`] = value
41
+ return out
42
+ }
43
+
44
+ export function EmptyFrame({ className }: { className?: string }): React.ReactElement {
45
+ return <div className={className} data-empty="true" />
46
+ }
47
+
48
+ export interface SeriesProps extends ChartBase {
49
+ readonly value: string
50
+ readonly at: string
51
+
52
+ readonly by?: string
53
+ }
54
+
55
+ export function polyline(values: readonly number[], width: number, height: number): string {
56
+ if (values.length === 0) return ''
57
+ const max = Math.max(...values)
58
+ const min = Math.min(...values, 0)
59
+ const span = max - min || 1
60
+ const step = values.length === 1 ? 0 : width / (values.length - 1)
61
+ return values.map((v, i) => `${(i * step).toFixed(2)},${(height - ((v - min) / span) * height).toFixed(2)}`).join(' ')
62
+ }
63
+
64
+ export interface CategoryProps extends ChartBase {
65
+ readonly value: string
66
+ readonly by: string
67
+ }
68
+
69
+ export interface TwoAxisProps extends ChartBase {
70
+ readonly x: string
71
+ readonly y: string
72
+ readonly value?: string
73
+ }
74
+
@@ -1,5 +1,5 @@
1
- import { ELEMENTS } from './elements.ts';
2
- import { VARIANTS } from './variants.ts';
1
+ import type { ELEMENTS } from './elements.ts';
2
+ import type { VARIANTS } from './variants.ts';
3
3
  type Shipped = (typeof VARIANTS)['declares'][number];
4
4
  export interface Wearing {
5
5
  }
@@ -0,0 +1,32 @@
1
+ import type { ELEMENTS } from './elements.ts'
2
+ import type { VARIANTS } from './variants.ts'
3
+
4
+ type Shipped = (typeof VARIANTS)['declares'][number]
5
+
6
+ export interface Wearing {}
7
+
8
+ export interface Dispatching {}
9
+
10
+ export type VariantsFor<E extends string> = Shipped extends infer One
11
+ ? One extends { readonly id: string; readonly wears: readonly string[] }
12
+ ? E extends One['wears'][number]
13
+ ? Camel<One['id']>
14
+ : never
15
+ : never
16
+ : never
17
+
18
+ type Pascal<S extends string> = S extends `${infer Head}-${infer Rest}`
19
+ ? `${Capitalize<Head>}${Pascal<Rest>}`
20
+ : Capitalize<S>
21
+
22
+ type Camel<S extends string> = S extends `${infer Head}-${infer Rest}` ? `${Head}${Pascal<Rest>}` : S
23
+
24
+ export type ArrangementElement = (typeof ELEMENTS)['declares'][number] extends infer One
25
+ ? One extends { readonly arranges: true; readonly id: infer Id extends string }
26
+ ? Pascal<Id>
27
+ : never
28
+ : never
29
+
30
+ export function idOf(name: string): string {
31
+ return name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()
32
+ }
@@ -0,0 +1,140 @@
1
+
2
+
3
+ export interface ClientEvent {
4
+
5
+ readonly property: 'interaction' | 'visit' | 'consent'
6
+
7
+ readonly screen?: string
8
+
9
+ readonly element?: string
10
+
11
+ readonly name?: string
12
+
13
+ readonly action?: string
14
+
15
+ readonly refusedBy?: string
16
+
17
+ readonly attempt?: number
18
+
19
+ readonly at: number
20
+
21
+ readonly seq: number
22
+ }
23
+
24
+ export interface CollectorOptions {
25
+
26
+ readonly endpoint: string
27
+
28
+ readonly allowed: () => boolean
29
+
30
+ readonly sample?: number
31
+
32
+ readonly maxBatch?: number
33
+
34
+ readonly intervalMs?: number
35
+
36
+ readonly now?: () => number
37
+ readonly random?: () => number
38
+ readonly fetch?: typeof globalThis.fetch
39
+
40
+ readonly beacon?: (url: string, body: string) => boolean
41
+ }
42
+
43
+ export type RecordedEvent = Omit<ClientEvent, 'at' | 'seq'>
44
+
45
+ export interface Collector {
46
+ record: (event: RecordedEvent) => void
47
+ flush: () => Promise<void>
48
+
49
+ stop: () => void
50
+
51
+ dropped: () => number
52
+
53
+ pending: () => number
54
+ }
55
+
56
+ export const INERT_COLLECTOR: Collector = {
57
+ record: () => undefined,
58
+ flush: async () => undefined,
59
+ stop: () => undefined,
60
+ dropped: () => 0,
61
+ pending: () => 0,
62
+ }
63
+
64
+ export function createCollector(options: CollectorOptions): Collector {
65
+ const now = options.now ?? (() => Date.now())
66
+ const random = options.random ?? Math.random
67
+ const maxBatch = options.maxBatch ?? 25
68
+ const intervalMs = options.intervalMs ?? 10_000
69
+
70
+ const sampled = (options.sample ?? 1) >= 1 || random() < (options.sample ?? 1)
71
+ if (!sampled) return INERT_COLLECTOR
72
+
73
+ let buffer: ClientEvent[] = []
74
+ let dropped = 0
75
+ let stopped = false
76
+
77
+ let seq = 0
78
+
79
+ const send = async (batch: readonly ClientEvent[]): Promise<void> => {
80
+ if (batch.length === 0) return
81
+ const body = JSON.stringify({ events: batch })
82
+
83
+ if (options.beacon !== undefined && options.beacon(options.endpoint, body)) return
84
+
85
+ const doFetch = options.fetch ?? globalThis.fetch
86
+ if (doFetch === undefined) {
87
+ dropped += batch.length
88
+ return
89
+ }
90
+
91
+ try {
92
+ const response = await doFetch(options.endpoint, {
93
+ method: 'POST',
94
+ headers: { 'content-type': 'application/json' },
95
+
96
+ keepalive: true,
97
+ body,
98
+ })
99
+ if (!response.ok) dropped += batch.length
100
+ } catch {
101
+
102
+ dropped += batch.length
103
+ }
104
+ }
105
+
106
+ const flush = async (): Promise<void> => {
107
+ const batch = buffer
108
+ buffer = []
109
+ await send(batch)
110
+ }
111
+
112
+ const record = (event: RecordedEvent): void => {
113
+
114
+ if (stopped || !options.allowed()) return
115
+
116
+ buffer.push({ ...event, at: now(), seq: ++seq })
117
+ if (buffer.length >= maxBatch) void flush()
118
+ }
119
+
120
+ const timer = setInterval(() => void flush(), intervalMs)
121
+
122
+ ;(timer as unknown as { unref?: () => void }).unref?.()
123
+
124
+ const onHide = (): void => {
125
+ if (globalThis.document?.visibilityState === 'hidden') void flush()
126
+ }
127
+ globalThis.document?.addEventListener('visibilitychange', onHide)
128
+
129
+ return {
130
+ record,
131
+ flush,
132
+ stop: () => {
133
+ stopped = true
134
+ clearInterval(timer)
135
+ globalThis.document?.removeEventListener('visibilitychange', onHide)
136
+ },
137
+ dropped: () => dropped,
138
+ pending: () => buffer.length,
139
+ }
140
+ }
@@ -7,14 +7,23 @@ export declare const COMPOSITIONS: Threaded & {
7
7
  readonly files: string;
8
8
  };
9
9
  export declare function nameOf(at: string): string;
10
- export declare function catalogue(tree: Tree, making: 'composition' | 'screen'): Promise<readonly string[]>;
10
+ export declare const catalogue: () => Promise<readonly string[]>;
11
+ export declare const screening: () => Promise<readonly string[]>;
11
12
  export declare function composed(body: string, rows: readonly {
12
13
  readonly id: string;
13
14
  readonly at?: string;
14
15
  }[], from: 'screens' | 'compositions', except?: string): readonly string[];
16
+ export declare const HOME: string;
15
17
  export declare const DOORS: ReadonlySet<string>;
16
18
  export declare function reaching(at: string, text: string, elements: ReadonlySet<string>, declared: ReadonlySet<string>): readonly string[];
17
- export declare function undeclared(tree: Tree, rows: readonly Threaded[]): Promise<readonly string[]>;
19
+ export declare const COMPILED = "app/_generated/compiled";
20
+ export declare function compiledAt(at: string): string;
21
+ export declare function settled(root: string, rows: readonly Threaded[], checking: boolean, by: string, kept: Set<string>): readonly string[];
22
+ export declare const RUNTIME: readonly string[];
23
+ export declare function emitting(root: string, entries: readonly string[], checking: boolean, kept: Set<string>): readonly string[];
24
+ export declare function stale(root: string, kept: ReadonlySet<string>, checking: boolean): readonly string[];
25
+ export declare function handing(at: string, text: string): readonly string[];
26
+ export declare function undeclared(tree: Tree, rows: readonly Threaded[]): readonly string[];
18
27
  export declare function seeds(rows: readonly Threaded[], held: (at: string) => boolean): readonly {
19
28
  readonly path: string;
20
29
  readonly content: string;