@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,47 @@
1
+ 'use client'
2
+
3
+ import type { MessageKey } from '../content.tsx'
4
+ import { roleClass } from '../fonts.ts'
5
+ import type { TabItem } from '../disclosure.tsx'
6
+
7
+ import { type Element, element, useSurface } from '../wrappers.tsx'
8
+ import { Each } from '../elements/each.tsx'
9
+ import { shown, section, header, region, uses } from './accordion.works.ts'
10
+
11
+
12
+ export interface AccordionProps {
13
+ readonly items: readonly TabItem[]
14
+ readonly initial: readonly string[]
15
+ readonly exclusive?: boolean
16
+ readonly onChange?: (said: readonly string[]) => void
17
+ readonly dispatch?: string
18
+ readonly input?: Readonly<Record<string, unknown>>
19
+ readonly invokeOn?: 'press' | 'shown'
20
+ }
21
+
22
+ export const Accordion: Element<'Accordion', AccordionProps> = element(
23
+ 'Accordion',
24
+ (props: AccordionProps, className) => {
25
+ const kept = uses(props)
26
+ const surface = useSurface({ className: roleClass(undefined, className),
27
+ invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) },
28
+ holds: [
29
+ ...(kept.holds ?? []),
30
+ ],
31
+ ...(kept.animates === undefined ? {} : { animates: kept.animates }), })
32
+ return (
33
+ <div className={surface.className} {...surface.marks} {...surface.invokes} {...surface.a11y} {...(kept.on ?? {})}>
34
+ <Each rows={props.items} by={'id'}>
35
+ {(each0, at) => (
36
+ <div {...section(props, kept, each0, at)}>
37
+ <button {...header(props, kept, each0, at)}>{shown(props, each0, surface, kept).label}</button>
38
+ <div {...region(props, kept, each0, at)}>{shown(props, each0, surface, kept).inside}</div>
39
+ </div>
40
+ )}
41
+ </Each>
42
+ </div>
43
+ )
44
+ },
45
+ 'e-accordion',
46
+ {"card":"thread-card"},
47
+ )
@@ -0,0 +1,66 @@
1
+ import { useId, useState, type ReactNode } from 'react'
2
+
3
+ import type { Row } from '../charts.tsx'
4
+ import type { Surface } from '../door.ts'
5
+ import type { AccordionProps } from './accordion.tsx'
6
+
7
+ type Kept = {
8
+ readonly base: string
9
+ readonly open: readonly string[]
10
+ readonly toggle: (id: string) => void
11
+ }
12
+
13
+ export function uses(props: AccordionProps): {
14
+ readonly holds?: readonly string[]
15
+ readonly animates?: boolean
16
+ readonly on?: Readonly<Record<string, unknown>>
17
+ readonly base: string
18
+ readonly open: readonly string[]
19
+ readonly toggle: (id: string) => void
20
+ } {
21
+ const base = useId()
22
+ const [open, setOpen] = useState<readonly string[]>(props.initial ?? [])
23
+ return {
24
+ base,
25
+ open,
26
+ toggle: (id: string): void => {
27
+ const next = open.includes(id)
28
+ ? open.filter((one) => one !== id)
29
+ : props.exclusive === true
30
+ ? [id]
31
+ : [...open, id]
32
+ setOpen(next)
33
+ props.onChange?.(next)
34
+ },
35
+ }
36
+ }
37
+
38
+ export function section(_props: AccordionProps, kept: Kept, row: Row, _at: number): Readonly<Record<string, unknown>> {
39
+ return { 'data-open': kept.open.includes(String(row['id'])) }
40
+ }
41
+
42
+ export function header(_props: AccordionProps, kept: Kept, row: Row, _at: number): Readonly<Record<string, unknown>> {
43
+ const id = String(row['id'])
44
+ return {
45
+ type: 'button',
46
+ id: `${kept.base}-header-${id}`,
47
+ 'aria-controls': `${kept.base}-region-${id}`,
48
+ 'aria-expanded': kept.open.includes(id),
49
+ disabled: row['disabled'] === true,
50
+ onClick: (): void => kept.toggle(id),
51
+ }
52
+ }
53
+
54
+ export function region(_props: AccordionProps, kept: Kept, row: Row, _at: number): Readonly<Record<string, unknown>> {
55
+ const id = String(row['id'])
56
+ return {
57
+ role: 'region',
58
+ id: `${kept.base}-region-${id}`,
59
+ 'aria-labelledby': `${kept.base}-header-${id}`,
60
+ hidden: !kept.open.includes(id),
61
+ }
62
+ }
63
+
64
+ export function shown(_props: AccordionProps, row: Row, surface: Surface, _kept: unknown): Readonly<Record<string, ReactNode>> {
65
+ return { label: surface.text(String(row['labelKey'])), inside: row['content'] as ReactNode }
66
+ }
@@ -6,4 +6,4 @@ export const AspectRatio = element('AspectRatio', (props, className) => {
6
6
  invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) },
7
7
  measures: { "ratio": String(props.ratio ?? '') }, });
8
8
  return (_jsx("div", { className: surface.className, ...surface.marks, ...surface.invokes, ...surface.a11y, style: surface.measures, children: props.children }));
9
- }, 'e-aspect-ratio');
9
+ }, 'e-aspect-ratio', { "framed": "thread-framed" });
@@ -0,0 +1,30 @@
1
+ 'use client'
2
+
3
+ import type { ReactNode } from 'react'
4
+
5
+ import { type Element, element, useSurface } from '../wrappers.tsx'
6
+
7
+
8
+ export interface AspectRatioProps {
9
+ readonly children: ReactNode
10
+ readonly ratio: number
11
+ readonly dispatch?: string
12
+ readonly input?: Readonly<Record<string, unknown>>
13
+ readonly invokeOn?: 'press' | 'shown'
14
+ }
15
+
16
+ export const AspectRatio: Element<'AspectRatio', AspectRatioProps> = element(
17
+ 'AspectRatio',
18
+ (props: AspectRatioProps, className) => {
19
+ const surface = useSurface({ className,
20
+ invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) },
21
+ measures: { "ratio": String(props.ratio ?? '') }, })
22
+ return (
23
+ <div className={surface.className} {...surface.marks} {...surface.invokes} {...surface.a11y} style={surface.measures}>
24
+ {props.children}
25
+ </div>
26
+ )
27
+ },
28
+ 'e-aspect-ratio',
29
+ {"framed":"thread-framed"},
30
+ )
@@ -0,0 +1,5 @@
1
+ import type { AspectRatioProps } from './aspect-ratio.tsx'
2
+
3
+ export function measured(props: AspectRatioProps): Readonly<Record<string, string | number>> {
4
+ return { ratio: props.ratio }
5
+ }
@@ -7,4 +7,4 @@ export const Avatar = element('Avatar', (props, className) => {
7
7
  const surface = useSurface({ className: roleClass(undefined, className),
8
8
  invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) }, });
9
9
  return (_jsxs("span", { className: surface.className, ...surface.marks, ...surface.invokes, ...surface.a11y, role: "img", "aria-label": surface.text(props.labelKey), children: [props.src === undefined ? null : _jsx("img", { src: props.src, alt: "" }), _jsx("span", { children: shown(props, surface).lettering })] }));
10
- }, 'e-avatar');
10
+ }, 'e-avatar', { "avatarRound": "thread-avatar-round" });
@@ -0,0 +1,33 @@
1
+ 'use client'
2
+
3
+ import type { MessageKey } from '../content.tsx'
4
+ import { roleClass } from '../fonts.ts'
5
+
6
+ import { type Element, element, useSurface } from '../wrappers.tsx'
7
+ import { shown } from './avatar.works.ts'
8
+
9
+
10
+ export interface AvatarProps {
11
+ readonly labelKey: MessageKey
12
+ readonly src?: string
13
+ readonly initials?: string
14
+ readonly dispatch?: string
15
+ readonly input?: Readonly<Record<string, unknown>>
16
+ readonly invokeOn?: 'press' | 'shown'
17
+ }
18
+
19
+ export const Avatar: Element<'Avatar', AvatarProps> = element(
20
+ 'Avatar',
21
+ (props: AvatarProps, className) => {
22
+ const surface = useSurface({ className: roleClass(undefined, className),
23
+ invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) }, })
24
+ return (
25
+ <span className={surface.className} {...surface.marks} {...surface.invokes} {...surface.a11y} role="img" aria-label={surface.text(props.labelKey)}>
26
+ {props.src === undefined ? null : <img src={props.src} alt="" />}
27
+ <span>{shown(props, surface).lettering}</span>
28
+ </span>
29
+ )
30
+ },
31
+ 'e-avatar',
32
+ {"avatarRound":"thread-avatar-round"},
33
+ )
@@ -0,0 +1,16 @@
1
+ import type { AvatarProps } from './avatar.tsx'
2
+
3
+ export function shown(props: AvatarProps, surface: { readonly text: (key: AvatarProps['labelKey']) => string }): Readonly<Record<string, string | null>> {
4
+ if (props.src !== undefined) return { lettering: null }
5
+ const said = props.initials
6
+ if (said !== undefined) return { lettering: said }
7
+ return {
8
+ lettering: surface
9
+ .text(props.labelKey)
10
+ .split(/\s+/)
11
+ .filter(Boolean)
12
+ .slice(0, 2)
13
+ .map((part) => part.charAt(0).toUpperCase())
14
+ .join(''),
15
+ }
16
+ }
@@ -7,4 +7,4 @@ export const Badge = element('Badge', (props, className) => {
7
7
  const surface = useSurface({ className: roleClass(undefined, className),
8
8
  invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) }, });
9
9
  return (_jsx("span", { className: surface.className, ...surface.marks, ...surface.invokes, ...surface.a11y, children: shows(props, surface) }));
10
- }, 'e-badge');
10
+ }, 'e-badge', { "chip": "thread-chip" });
@@ -0,0 +1,32 @@
1
+ 'use client'
2
+
3
+ import type { MessageKey } from '../content.tsx'
4
+ import { roleClass } from '../fonts.ts'
5
+
6
+ import { type Element, element, useSurface } from '../wrappers.tsx'
7
+ import { shows } from './badge.works.ts'
8
+
9
+
10
+ export interface BadgeProps {
11
+ readonly labelKey: MessageKey
12
+ readonly count?: number
13
+ readonly max?: number
14
+ readonly dispatch?: string
15
+ readonly input?: Readonly<Record<string, unknown>>
16
+ readonly invokeOn?: 'press' | 'shown'
17
+ }
18
+
19
+ export const Badge: Element<'Badge', BadgeProps> = element(
20
+ 'Badge',
21
+ (props: BadgeProps, className) => {
22
+ const surface = useSurface({ className: roleClass(undefined, className),
23
+ invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) }, })
24
+ return (
25
+ <span className={surface.className} {...surface.marks} {...surface.invokes} {...surface.a11y}>
26
+ {shows(props, surface)}
27
+ </span>
28
+ )
29
+ },
30
+ 'e-badge',
31
+ {"chip":"thread-chip"},
32
+ )
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import type { BadgeProps } from './badge.tsx'
4
+
5
+ export function shows(props: BadgeProps, surface: { readonly text: (key: BadgeProps['labelKey']) => string }): ReactNode {
6
+ const max = props.max ?? 99
7
+ if (props.count === undefined) return surface.text(props.labelKey)
8
+ return props.count > max ? `${max}+` : String(props.count)
9
+ }
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { roleClass } from "../fonts.js";
4
4
  import { measured as marking } from "../charts.js";
5
5
  import { element, useSurface } from "../wrappers.js";
6
- import { Each } from "./each.js";
6
+ import { Each } from "../elements/each.js";
7
7
  import { shown, sized, uses } from "./bars.works.js";
8
8
  export const Bars = element('Bars', (props, className) => {
9
9
  const kept = uses(props);
@@ -14,4 +14,4 @@ export const Bars = element('Bars', (props, className) => {
14
14
  ],
15
15
  ...(kept.animates === undefined ? {} : { animates: kept.animates }), });
16
16
  return (_jsx("div", { className: surface.className, ...surface.marks, ...surface.invokes, ...surface.a11y, ...(kept.on ?? {}), role: "img", ...(props.titleKey === undefined ? {} : { 'aria-label': surface.text(props.titleKey) }), children: _jsx(Each, { rows: props.rows, by: props.by, children: (each0, at) => (_jsxs("span", { style: marking(sized(props, kept, each0, at)), children: [_jsx("span", { children: shown(props, each0, surface, kept).label }), _jsx("span", { children: shown(props, each0, surface, kept).amount })] })) }) }));
17
- }, 'e-bars');
17
+ }, 'e-bars', { "card": "thread-card" });
@@ -0,0 +1,49 @@
1
+ 'use client'
2
+
3
+ import type { MessageKey } from '../content.tsx'
4
+ import type { Row } from '../charts.tsx'
5
+ import { roleClass } from '../fonts.ts'
6
+ import { measured as marking } from '../charts.tsx'
7
+
8
+ import { type Element, element, useSurface } from '../wrappers.tsx'
9
+ import { Each } from '../elements/each.tsx'
10
+ import { shown, sized, uses } from './bars.works.ts'
11
+
12
+
13
+ export interface BarsProps {
14
+ readonly rows: readonly Row[]
15
+ readonly by: string
16
+ readonly value: string
17
+ readonly format?: string
18
+ readonly titleKey?: MessageKey
19
+ readonly dispatch?: string
20
+ readonly input?: Readonly<Record<string, unknown>>
21
+ readonly invokeOn?: 'press' | 'shown'
22
+ }
23
+
24
+ export const Bars: Element<'Bars', BarsProps> = element(
25
+ 'Bars',
26
+ (props: BarsProps, className) => {
27
+ const kept = uses(props)
28
+ const surface = useSurface({ className: roleClass(undefined, className),
29
+ invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) },
30
+ holds: [
31
+ ...(kept.holds ?? []),
32
+ ],
33
+ ...(kept.animates === undefined ? {} : { animates: kept.animates }), })
34
+ return (
35
+ <div className={surface.className} {...surface.marks} {...surface.invokes} {...surface.a11y} {...(kept.on ?? {})} role="img" {...(props.titleKey === undefined ? {} : { 'aria-label': surface.text(props.titleKey) })}>
36
+ <Each rows={props.rows} by={props.by}>
37
+ {(each0, at) => (
38
+ <span style={marking(sized(props, kept, each0, at))}>
39
+ <span>{shown(props, each0, surface, kept).label}</span>
40
+ <span>{shown(props, each0, surface, kept).amount}</span>
41
+ </span>
42
+ )}
43
+ </Each>
44
+ </div>
45
+ )
46
+ },
47
+ 'e-bars',
48
+ {"card":"thread-card"},
49
+ )
@@ -0,0 +1,29 @@
1
+ import { formatValue } from '../validators.ts'
2
+ import { seriesColour } from '../series.ts'
3
+ import { num, str, useRamp, type Row } from '../charts.tsx'
4
+ import type { BarsProps } from './bars.tsx'
5
+
6
+ export function uses(props: BarsProps): {
7
+ readonly holds?: readonly string[]
8
+ readonly animates?: boolean
9
+ readonly on?: Readonly<Record<string, unknown>>
10
+ readonly ramp: readonly string[]
11
+ } {
12
+ const ramp = useRamp(props.rows.length)
13
+ return { ...(props.rows.length === 0 ? { holds: ['empty'] as const } : {}), ramp }
14
+ }
15
+
16
+ export function sized(props: BarsProps, kept: { readonly ramp: readonly string[] }, row: Row, at: number): Readonly<Record<string, string | number>> {
17
+ const most = Math.max(...props.rows.map((one: Row) => num(one, props.value)), 0) || 1
18
+ return {
19
+ series: seriesColour(kept.ramp, at),
20
+ fraction: `${((num(row, props.value) / most) * 100).toFixed(1)}%`,
21
+ }
22
+ }
23
+
24
+ export function shown(props: BarsProps, row: Row, _surface: unknown, _kept?: unknown): Readonly<Record<string, string>> {
25
+ return {
26
+ label: str(row, props.by),
27
+ amount: String(formatValue(props.format ?? 'number', num(row, props.value))),
28
+ }
29
+ }
@@ -6,6 +6,7 @@ export const Box = element('Box', (props, className) => {
6
6
  invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) },
7
7
  holds: [
8
8
  ...(props.scrolling === true ? ['scrolling'] : []),
9
- ], });
9
+ ],
10
+ raises: ['scrolling'], });
10
11
  return (_jsx("div", { className: surface.className, ...surface.marks, ...surface.invokes, ...surface.a11y, ...(props.labelKey === undefined ? {} : { role: 'group' }), ...(props.labelKey === undefined ? {} : { 'aria-label': surface.text(props.labelKey) }), children: props.children }));
11
- }, 'e-box');
12
+ }, 'e-box', { "card": "thread-card", "listRow": "thread-list-row", "bubbleThem": "thread-bubble-them", "bubbleMe": "thread-bubble-me" });
@@ -0,0 +1,35 @@
1
+ 'use client'
2
+
3
+ import type { ReactNode } from 'react'
4
+ import type { MessageKey } from '../content.tsx'
5
+
6
+ import { type Element, element, useSurface } from '../wrappers.tsx'
7
+
8
+
9
+ export interface BoxProps {
10
+ readonly children: ReactNode
11
+ readonly labelKey?: MessageKey
12
+ readonly scrolling?: boolean
13
+ readonly dispatch?: string
14
+ readonly input?: Readonly<Record<string, unknown>>
15
+ readonly invokeOn?: 'press' | 'shown'
16
+ }
17
+
18
+ export const Box: Element<'Box', BoxProps> = element(
19
+ 'Box',
20
+ (props: BoxProps, className) => {
21
+ const surface = useSurface({ className,
22
+ invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) },
23
+ holds: [
24
+ ...(props.scrolling === true ? ['scrolling' as const] : []),
25
+ ],
26
+ raises: ['scrolling' as const], })
27
+ return (
28
+ <div className={surface.className} {...surface.marks} {...surface.invokes} {...surface.a11y} {...(props.labelKey === undefined ? {} : { role: 'group' as const })} {...(props.labelKey === undefined ? {} : { 'aria-label': surface.text(props.labelKey) })}>
29
+ {props.children}
30
+ </div>
31
+ )
32
+ },
33
+ 'e-box',
34
+ {"card":"thread-card","listRow":"thread-list-row","bubbleThem":"thread-bubble-them","bubbleMe":"thread-bubble-me"},
35
+ )
@@ -3,10 +3,10 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { roleClass } from "../fonts.js";
4
4
  import { Link } from "./link.js";
5
5
  import { element, useSurface } from "../wrappers.js";
6
- import { Each } from "./each.js";
6
+ import { Each } from "../elements/each.js";
7
7
  import { crumb, steps } from "./breadcrumb.works.js";
8
8
  export const Breadcrumb = element('Breadcrumb', (props, className) => {
9
9
  const surface = useSurface({ className: roleClass(undefined, className),
10
10
  invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) }, });
11
11
  return (_jsx("nav", { className: surface.className, ...surface.marks, ...surface.invokes, ...surface.a11y, "aria-label": surface.text('nav.breadcrumb'), children: _jsx(Each, { rows: steps(props), by: 'id', children: (each0, at) => (_jsx(Link.linkInline, { ...crumb(props, each0, at) })) }) }));
12
- }, 'e-breadcrumb');
12
+ }, 'e-breadcrumb', { "tabBar": "thread-tab-bar" });
@@ -0,0 +1,37 @@
1
+ 'use client'
2
+
3
+ import { roleClass } from '../fonts.ts'
4
+ import type { MapIsland } from '../islands/map.ts'
5
+ import { Link } from './link.tsx'
6
+
7
+ import { type Element, element, useSurface } from '../wrappers.tsx'
8
+ import { Each } from '../elements/each.tsx'
9
+ import { crumb, steps } from './breadcrumb.works.ts'
10
+
11
+
12
+ export interface BreadcrumbProps {
13
+ readonly map: MapIsland
14
+ readonly current: string
15
+ readonly dispatch?: string
16
+ readonly input?: Readonly<Record<string, unknown>>
17
+ readonly invokeOn?: 'press' | 'shown'
18
+ }
19
+
20
+ export const Breadcrumb: Element<'Breadcrumb', BreadcrumbProps> = element(
21
+ 'Breadcrumb',
22
+ (props: BreadcrumbProps, className) => {
23
+ const surface = useSurface({ className: roleClass(undefined, className),
24
+ invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) }, })
25
+ return (
26
+ <nav className={surface.className} {...surface.marks} {...surface.invokes} {...surface.a11y} aria-label={surface.text('nav.breadcrumb')}>
27
+ <Each rows={steps(props)} by={'id'}>
28
+ {(each0, at) => (
29
+ <Link.linkInline {...crumb(props, each0, at)}></Link.linkInline>
30
+ )}
31
+ </Each>
32
+ </nav>
33
+ )
34
+ },
35
+ 'e-breadcrumb',
36
+ {"tabBar":"thread-tab-bar"},
37
+ )
@@ -0,0 +1,24 @@
1
+ import { trailTo } from '../navigation.tsx'
2
+ import type { Row } from '../charts.tsx'
3
+ import type { BreadcrumbProps } from './breadcrumb.tsx'
4
+ import type { LinkProps } from './link.tsx'
5
+
6
+ export function steps(props: BreadcrumbProps): readonly Row[] {
7
+ const known = new Map(props.map.screens.map((one) => [one.id, one]))
8
+ if (!known.has(props.current)) return []
9
+ const trail = trailTo(props.map, props.current)
10
+ return trail.flatMap((id, at) => {
11
+ const screen = known.get(id)
12
+ if (screen === undefined) return []
13
+ return [{ id, nameKey: screen.nameKey, here: at === trail.length - 1 }]
14
+ })
15
+ }
16
+
17
+ export function crumb(_props: BreadcrumbProps, row: Row, _at: number): LinkProps & { readonly 'aria-current'?: 'page' } {
18
+ return {
19
+ navigateTo: String(row['id']),
20
+ labelKey: String(row['nameKey']),
21
+ is: 'label',
22
+ ...(row['here'] === true ? ({ 'aria-current': 'page' } as const) : {}),
23
+ }
24
+ }
@@ -13,4 +13,4 @@ export const Button = element('Button', (props, className) => {
13
13
  ...(kept.animates === undefined ? {} : { animates: kept.animates }), });
14
14
  const wired = wires(props, kept, surface);
15
15
  return (_jsxs("button", { className: surface.className, ...surface.marks, ...surface.invokes, ...surface.a11y, ...(kept.on ?? {}), ...(wired.on ?? {}), children: [!iconed(props, kept) ? null : _jsx("span", { className: "e-button-symbol", children: shown(props, surface, kept, wired).symbol }), !worded(props, kept) ? null : _jsx("span", { children: shown(props, surface, kept, wired).wording })] }));
16
- }, 'e-button');
16
+ }, 'e-button', { "buttonFill": "thread-button-fill", "buttonNormal": "thread-button-normal", "buttonGhost": "thread-button-ghost", "buttonBorder": "thread-button-border", "buttonDestructive": "thread-button-destructive", "buttonDestructiveGhost": "thread-button-destructive-ghost", "buttonCta": "thread-button-cta", "buttonQuiet": "thread-button-quiet", "buttonGlass": "thread-button-glass" });
@@ -0,0 +1,45 @@
1
+ 'use client'
2
+
3
+ import type { MessageKey } from '../content.tsx'
4
+ import { roleClass } from '../fonts.ts'
5
+
6
+ import { type Element, element, useSurface } from '../wrappers.tsx'
7
+ import { shown, iconed, worded, uses, wires } from './button.works.tsx'
8
+
9
+
10
+ export interface ButtonProps {
11
+ readonly label: MessageKey
12
+ readonly with?: Readonly<Record<string, unknown>>
13
+ readonly icon?: string
14
+ readonly shows?: string
15
+ readonly type?: string
16
+ readonly disabled?: boolean
17
+ readonly loading?: boolean
18
+ readonly dispatch?: string
19
+ readonly input?: Readonly<Record<string, unknown>>
20
+ readonly navigateTo?: string
21
+ readonly onPress?: () => void
22
+ readonly invokeOn?: 'press' | 'shown'
23
+ }
24
+
25
+ export const Button: Element<'Button', ButtonProps> = element(
26
+ 'Button',
27
+ (props: ButtonProps, className) => {
28
+ const kept = uses(props)
29
+ const surface = useSurface({ className: roleClass(undefined, className),
30
+ invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) },
31
+ holds: [
32
+ ...(kept.holds ?? []),
33
+ ],
34
+ ...(kept.animates === undefined ? {} : { animates: kept.animates }), })
35
+ const wired = wires(props, kept, surface)
36
+ return (
37
+ <button className={surface.className} {...surface.marks} {...surface.invokes} {...surface.a11y} {...(kept.on ?? {})} {...(wired.on ?? {})}>
38
+ {!iconed(props, kept) ? null : <span className="e-button-symbol">{shown(props, surface, kept, wired).symbol}</span>}
39
+ {!worded(props, kept) ? null : <span>{shown(props, surface, kept, wired).wording}</span>}
40
+ </button>
41
+ )
42
+ },
43
+ 'e-button',
44
+ {"buttonFill":"thread-button-fill","buttonNormal":"thread-button-normal","buttonGhost":"thread-button-ghost","buttonBorder":"thread-button-border","buttonDestructive":"thread-button-destructive","buttonDestructiveGhost":"thread-button-destructive-ghost","buttonCta":"thread-button-cta","buttonQuiet":"thread-button-quiet","buttonGlass":"thread-button-glass"},
45
+ )
@@ -0,0 +1,52 @@
1
+ import type { ReactNode } from 'react'
2
+
3
+ import { pressOf, usePress } from '../wrappers.tsx'
4
+ import type { Surface } from '../door.ts'
5
+ import { drawn } from './glyph.works.tsx'
6
+ import type { ButtonProps } from './button.tsx'
7
+
8
+ export function uses(props: ButtonProps): {
9
+ readonly holds?: readonly string[]
10
+ readonly animates?: boolean
11
+ readonly on?: Readonly<Record<string, unknown>>
12
+ readonly press: (() => void) | undefined
13
+ } {
14
+ return {
15
+ holds: [
16
+ ...(props.disabled === true ? (['disabled'] as const) : []),
17
+ ...(props.loading === true ? (['loading'] as const) : []),
18
+ ],
19
+ press: usePress(pressOf(props), { element: 'Button', name: props.label }),
20
+ }
21
+ }
22
+
23
+ export function wires(
24
+ props: ButtonProps,
25
+ kept: { readonly press: (() => void) | undefined },
26
+ surface: Surface,
27
+ ): { readonly on: Readonly<Record<string, unknown>> } {
28
+ const inert = surface.marked('disabled') || surface.marked('loading')
29
+ return {
30
+ on: {
31
+ type: props.type ?? 'button',
32
+ disabled: inert,
33
+ ...(props.shows === 'icon' ? { 'aria-label': surface.text(props.label, props.with) } : {}),
34
+ onClick: inert ? undefined : kept.press,
35
+ },
36
+ }
37
+ }
38
+
39
+ export function iconed(props: ButtonProps, _kept?: unknown): boolean {
40
+ return props.icon !== undefined
41
+ }
42
+
43
+ export function worded(props: ButtonProps, _kept?: unknown): boolean {
44
+ return props.shows !== 'icon'
45
+ }
46
+
47
+ export function shown(props: ButtonProps, surface: Surface, _kept: unknown, _wired?: unknown): Readonly<Record<string, ReactNode>> {
48
+ return {
49
+ symbol: props.icon === undefined ? null : drawn(props.icon, { 'aria-hidden': true }),
50
+ wording: props.shows === 'icon' ? null : surface.text(props.label, props.with),
51
+ }
52
+ }
@@ -5,4 +5,4 @@ export const Column = element('Column', (props, className) => {
5
5
  const surface = useSurface({ className,
6
6
  invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) }, });
7
7
  return (_jsx("div", { className: surface.className, ...surface.marks, ...surface.invokes, ...surface.a11y, children: props.children }));
8
- }, 'e-column');
8
+ }, 'e-column', {});
@@ -0,0 +1,28 @@
1
+ 'use client'
2
+
3
+ import type { ReactNode } from 'react'
4
+
5
+ import { type Element, element, useSurface } from '../wrappers.tsx'
6
+
7
+
8
+ export interface ColumnProps {
9
+ readonly children: ReactNode
10
+ readonly dispatch?: string
11
+ readonly input?: Readonly<Record<string, unknown>>
12
+ readonly invokeOn?: 'press' | 'shown'
13
+ }
14
+
15
+ export const Column: Element<'Column', ColumnProps> = element(
16
+ 'Column',
17
+ (props: ColumnProps, className) => {
18
+ const surface = useSurface({ className,
19
+ invokes: { ...(props.dispatch === undefined ? {} : { dispatch: props.dispatch }), ...(props.input === undefined ? {} : { input: props.input }), ...(props.invokeOn === undefined ? {} : { on: props.invokeOn }) }, })
20
+ return (
21
+ <div className={surface.className} {...surface.marks} {...surface.invokes} {...surface.a11y}>
22
+ {props.children}
23
+ </div>
24
+ )
25
+ },
26
+ 'e-column',
27
+ {},
28
+ )
@@ -7,7 +7,7 @@ import { Text } from "./text.js";
7
7
  import { Toggle } from "./toggle.js";
8
8
  import { Button } from "./button.js";
9
9
  import { element, useSurface } from "../wrappers.js";
10
- import { Each } from "./each.js";
10
+ import { Each } from "../elements/each.js";
11
11
  import { title, policy, hasPolicy, categories, label, describe, chooser, optional, fixed, required, withdraw, withdrawable, decline, accept, acceptAll, uses } from "./consent.works.js";
12
12
  export const Consent = element('Consent', (props, className) => {
13
13
  const kept = uses(props);
@@ -18,4 +18,4 @@ export const Consent = element('Consent', (props, className) => {
18
18
  ],
19
19
  ...(kept.animates === undefined ? {} : { animates: kept.animates }), });
20
20
  return (_jsx(_Fragment, { children: _jsx(Box.card, { children: _jsxs(Column, { children: [_jsx(Text, { ...title(props, kept) }), !hasPolicy(props, kept) ? null : _jsx(Text, { ...policy(props, kept) }), _jsx(Column, { children: _jsx(Each, { rows: categories(props, kept), by: 'id', children: (each0, at) => (_jsxs(Box, { children: [_jsxs(Column, { children: [_jsx(Text, { ...label(props, kept, each0, at) }), _jsx(Text, { ...describe(props, kept, each0, at) })] }), !optional(props, kept, each0) ? null : _jsx(Toggle.input, { ...chooser(props, kept, each0, at) }), !required(props, kept, each0) ? null : _jsx(Text, { ...fixed(props, kept, each0, at) })] })) }) }), _jsxs(Box, { children: [!withdrawable(props, kept) ? null : _jsx(Button.buttonQuiet, { ...withdraw(props, kept) }), _jsx(Button.buttonBorder, { ...decline(props, kept) }), _jsx(Button.buttonBorder, { ...accept(props, kept) }), _jsx(Button.buttonFill, { ...acceptAll(props, kept) })] })] }) }) }));
21
- }, 'e-consent');
21
+ }, 'e-consent', {});