@syware/jlib 0.0.0-stage → 0.1.3

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 (331) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +133 -2
  3. package/dist/all.d.ts +1 -0
  4. package/dist/all.js +75 -0
  5. package/dist/atoms/jl-avatar.css_raw.js +3 -0
  6. package/dist/atoms/jl-avatar.d.ts +52 -0
  7. package/dist/atoms/jl-avatar.js +167 -0
  8. package/dist/atoms/jl-badge.css_raw.js +3 -0
  9. package/dist/atoms/jl-badge.d.ts +32 -0
  10. package/dist/atoms/jl-badge.js +60 -0
  11. package/dist/atoms/jl-button.css_raw.js +3 -0
  12. package/dist/atoms/jl-button.d.ts +70 -0
  13. package/dist/atoms/jl-button.js +146 -0
  14. package/dist/atoms/jl-checkbox.css_raw.js +3 -0
  15. package/dist/atoms/jl-checkbox.d.ts +61 -0
  16. package/dist/atoms/jl-checkbox.js +149 -0
  17. package/dist/atoms/jl-chip.css_raw.js +3 -0
  18. package/dist/atoms/jl-chip.d.ts +59 -0
  19. package/dist/atoms/jl-chip.js +164 -0
  20. package/dist/atoms/jl-divider.css_raw.js +3 -0
  21. package/dist/atoms/jl-divider.d.ts +26 -0
  22. package/dist/atoms/jl-divider.js +59 -0
  23. package/dist/atoms/jl-icon.css_raw.js +3 -0
  24. package/dist/atoms/jl-icon.d.ts +25 -0
  25. package/dist/atoms/jl-icon.js +41 -0
  26. package/dist/atoms/jl-input.css_raw.js +3 -0
  27. package/dist/atoms/jl-input.d.ts +112 -0
  28. package/dist/atoms/jl-input.js +202 -0
  29. package/dist/atoms/jl-kbd.css_raw.js +3 -0
  30. package/dist/atoms/jl-kbd.d.ts +17 -0
  31. package/dist/atoms/jl-kbd.js +62 -0
  32. package/dist/atoms/jl-link.css_raw.js +3 -0
  33. package/dist/atoms/jl-link.d.ts +37 -0
  34. package/dist/atoms/jl-link.js +86 -0
  35. package/dist/atoms/jl-progress-ring.css_raw.js +3 -0
  36. package/dist/atoms/jl-progress-ring.d.ts +49 -0
  37. package/dist/atoms/jl-progress-ring.js +132 -0
  38. package/dist/atoms/jl-progress.css_raw.js +3 -0
  39. package/dist/atoms/jl-progress.d.ts +43 -0
  40. package/dist/atoms/jl-progress.js +109 -0
  41. package/dist/atoms/jl-rating.css_raw.js +3 -0
  42. package/dist/atoms/jl-rating.d.ts +73 -0
  43. package/dist/atoms/jl-rating.js +184 -0
  44. package/dist/atoms/jl-select.css_raw.js +3 -0
  45. package/dist/atoms/jl-select.d.ts +70 -0
  46. package/dist/atoms/jl-select.js +146 -0
  47. package/dist/atoms/jl-skeleton.css_raw.js +3 -0
  48. package/dist/atoms/jl-skeleton.d.ts +34 -0
  49. package/dist/atoms/jl-skeleton.js +63 -0
  50. package/dist/atoms/jl-slider.css_raw.js +3 -0
  51. package/dist/atoms/jl-slider.d.ts +65 -0
  52. package/dist/atoms/jl-slider.js +143 -0
  53. package/dist/atoms/jl-spinner.css_raw.js +3 -0
  54. package/dist/atoms/jl-spinner.d.ts +16 -0
  55. package/dist/atoms/jl-spinner.js +26 -0
  56. package/dist/atoms/jl-switch.css_raw.js +3 -0
  57. package/dist/atoms/jl-switch.d.ts +57 -0
  58. package/dist/atoms/jl-switch.js +125 -0
  59. package/dist/atoms/jl-textarea.css_raw.js +3 -0
  60. package/dist/atoms/jl-textarea.d.ts +81 -0
  61. package/dist/atoms/jl-textarea.js +148 -0
  62. package/dist/base/jl-element.d.ts +16 -0
  63. package/dist/base/jl-element.js +35 -0
  64. package/dist/base/jl-form-control.d.ts +29 -0
  65. package/dist/base/jl-form-control.js +44 -0
  66. package/dist/index.d.ts +119 -0
  67. package/dist/index.js +72 -0
  68. package/dist/lib/arrow.d.ts +6 -0
  69. package/dist/lib/arrow.js +15 -0
  70. package/dist/lib/attributes.d.ts +9 -0
  71. package/dist/lib/attributes.js +22 -0
  72. package/dist/lib/avatar.d.ts +11 -0
  73. package/dist/lib/avatar.js +37 -0
  74. package/dist/lib/calendar.d.ts +48 -0
  75. package/dist/lib/calendar.js +166 -0
  76. package/dist/lib/css-length.d.ts +2 -0
  77. package/dist/lib/css-length.js +8 -0
  78. package/dist/lib/define.d.ts +9 -0
  79. package/dist/lib/define.js +9 -0
  80. package/dist/lib/dom.d.ts +4 -0
  81. package/dist/lib/dom.js +16 -0
  82. package/dist/lib/files.d.ts +18 -0
  83. package/dist/lib/files.js +89 -0
  84. package/dist/lib/floating.d.ts +13 -0
  85. package/dist/lib/floating.js +127 -0
  86. package/dist/lib/fuzzy.d.ts +26 -0
  87. package/dist/lib/fuzzy.js +149 -0
  88. package/dist/lib/highlight.d.ts +5 -0
  89. package/dist/lib/highlight.js +267 -0
  90. package/dist/lib/hotkey.d.ts +9 -0
  91. package/dist/lib/hotkey.js +101 -0
  92. package/dist/lib/icon-set.d.ts +95 -0
  93. package/dist/lib/icon-set.js +97 -0
  94. package/dist/lib/icons.d.ts +12 -0
  95. package/dist/lib/icons.js +39 -0
  96. package/dist/lib/indicator.d.ts +6 -0
  97. package/dist/lib/indicator.js +18 -0
  98. package/dist/lib/keep-in-view.d.ts +5 -0
  99. package/dist/lib/keep-in-view.js +15 -0
  100. package/dist/lib/key-shortcut.d.ts +20 -0
  101. package/dist/lib/key-shortcut.js +100 -0
  102. package/dist/lib/keycaps.d.ts +8 -0
  103. package/dist/lib/keycaps.js +162 -0
  104. package/dist/lib/locale.d.ts +4 -0
  105. package/dist/lib/locale.js +13 -0
  106. package/dist/lib/nav-tree.d.ts +9 -0
  107. package/dist/lib/nav-tree.js +30 -0
  108. package/dist/lib/numeric.d.ts +20 -0
  109. package/dist/lib/numeric.js +50 -0
  110. package/dist/lib/option-filter.d.ts +29 -0
  111. package/dist/lib/option-filter.js +108 -0
  112. package/dist/lib/option-groups.d.ts +6 -0
  113. package/dist/lib/option-groups.js +26 -0
  114. package/dist/lib/options.d.ts +5 -0
  115. package/dist/lib/options.js +24 -0
  116. package/dist/lib/pagination.d.ts +9 -0
  117. package/dist/lib/pagination.js +52 -0
  118. package/dist/lib/palette.d.ts +8 -0
  119. package/dist/lib/palette.js +46 -0
  120. package/dist/lib/progress.d.ts +20 -0
  121. package/dist/lib/progress.js +33 -0
  122. package/dist/lib/rating.d.ts +7 -0
  123. package/dist/lib/rating.js +26 -0
  124. package/dist/lib/roving-index.d.ts +10 -0
  125. package/dist/lib/roving-index.js +32 -0
  126. package/dist/lib/roving.d.ts +11 -0
  127. package/dist/lib/roving.js +21 -0
  128. package/dist/lib/slots.d.ts +2 -0
  129. package/dist/lib/slots.js +6 -0
  130. package/dist/lib/sparkline.d.ts +11 -0
  131. package/dist/lib/sparkline.js +42 -0
  132. package/dist/lib/split.d.ts +12 -0
  133. package/dist/lib/split.js +37 -0
  134. package/dist/lib/surface.d.ts +7 -0
  135. package/dist/lib/surface.js +28 -0
  136. package/dist/lib/table.d.ts +30 -0
  137. package/dist/lib/table.js +110 -0
  138. package/dist/lib/tags.d.ts +14 -0
  139. package/dist/lib/tags.js +29 -0
  140. package/dist/lib/text.d.ts +5 -0
  141. package/dist/lib/text.js +13 -0
  142. package/dist/lib/tokens.d.ts +5 -0
  143. package/dist/lib/tokens.js +15 -0
  144. package/dist/lib/tree.d.ts +16 -0
  145. package/dist/lib/tree.js +89 -0
  146. package/dist/lib/trend.d.ts +3 -0
  147. package/dist/lib/trend.js +15 -0
  148. package/dist/lib/trigger.d.ts +11 -0
  149. package/dist/lib/trigger.js +34 -0
  150. package/dist/molecules/jl-accordion-item.css_raw.js +3 -0
  151. package/dist/molecules/jl-accordion-item.d.ts +34 -0
  152. package/dist/molecules/jl-accordion-item.js +82 -0
  153. package/dist/molecules/jl-accordion.css_raw.js +3 -0
  154. package/dist/molecules/jl-accordion.d.ts +27 -0
  155. package/dist/molecules/jl-accordion.js +61 -0
  156. package/dist/molecules/jl-alert.css_raw.js +3 -0
  157. package/dist/molecules/jl-alert.d.ts +38 -0
  158. package/dist/molecules/jl-alert.js +131 -0
  159. package/dist/molecules/jl-avatar-group.css_raw.js +3 -0
  160. package/dist/molecules/jl-avatar-group.d.ts +28 -0
  161. package/dist/molecules/jl-avatar-group.js +69 -0
  162. package/dist/molecules/jl-breadcrumb.css_raw.js +3 -0
  163. package/dist/molecules/jl-breadcrumb.d.ts +35 -0
  164. package/dist/molecules/jl-breadcrumb.js +126 -0
  165. package/dist/molecules/jl-calendar.css_raw.js +3 -0
  166. package/dist/molecules/jl-calendar.d.ts +101 -0
  167. package/dist/molecules/jl-calendar.js +314 -0
  168. package/dist/molecules/jl-card.css_raw.js +3 -0
  169. package/dist/molecules/jl-card.d.ts +46 -0
  170. package/dist/molecules/jl-card.js +172 -0
  171. package/dist/molecules/jl-code-block.css_raw.js +3 -0
  172. package/dist/molecules/jl-code-block.d.ts +44 -0
  173. package/dist/molecules/jl-code-block.js +106 -0
  174. package/dist/molecules/jl-combobox.css_raw.js +3 -0
  175. package/dist/molecules/jl-combobox.d.ts +120 -0
  176. package/dist/molecules/jl-combobox.js +450 -0
  177. package/dist/molecules/jl-copy-button.css_raw.js +3 -0
  178. package/dist/molecules/jl-copy-button.d.ts +31 -0
  179. package/dist/molecules/jl-copy-button.js +69 -0
  180. package/dist/molecules/jl-date-picker.css_raw.js +3 -0
  181. package/dist/molecules/jl-date-picker.d.ts +109 -0
  182. package/dist/molecules/jl-date-picker.js +322 -0
  183. package/dist/molecules/jl-empty.css_raw.js +3 -0
  184. package/dist/molecules/jl-empty.d.ts +32 -0
  185. package/dist/molecules/jl-empty.js +94 -0
  186. package/dist/molecules/jl-field.css_raw.js +3 -0
  187. package/dist/molecules/jl-field.d.ts +49 -0
  188. package/dist/molecules/jl-field.js +147 -0
  189. package/dist/molecules/jl-file-drop.css_raw.js +3 -0
  190. package/dist/molecules/jl-file-drop.d.ts +93 -0
  191. package/dist/molecules/jl-file-drop.js +366 -0
  192. package/dist/molecules/jl-list-item.css_raw.js +3 -0
  193. package/dist/molecules/jl-list-item.d.ts +56 -0
  194. package/dist/molecules/jl-list-item.js +176 -0
  195. package/dist/molecules/jl-menu.css_raw.js +3 -0
  196. package/dist/molecules/jl-menu.d.ts +62 -0
  197. package/dist/molecules/jl-menu.js +288 -0
  198. package/dist/molecules/jl-number-input.css_raw.js +3 -0
  199. package/dist/molecules/jl-number-input.d.ts +81 -0
  200. package/dist/molecules/jl-number-input.js +220 -0
  201. package/dist/molecules/jl-pagination.css_raw.js +3 -0
  202. package/dist/molecules/jl-pagination.d.ts +59 -0
  203. package/dist/molecules/jl-pagination.js +172 -0
  204. package/dist/molecules/jl-popover.css_raw.js +3 -0
  205. package/dist/molecules/jl-popover.d.ts +49 -0
  206. package/dist/molecules/jl-popover.js +152 -0
  207. package/dist/molecules/jl-radio-group.css_raw.js +3 -0
  208. package/dist/molecules/jl-radio-group.d.ts +71 -0
  209. package/dist/molecules/jl-radio-group.js +202 -0
  210. package/dist/molecules/jl-search.css_raw.js +3 -0
  211. package/dist/molecules/jl-search.d.ts +71 -0
  212. package/dist/molecules/jl-search.js +210 -0
  213. package/dist/molecules/jl-segmented.css_raw.js +3 -0
  214. package/dist/molecules/jl-segmented.d.ts +65 -0
  215. package/dist/molecules/jl-segmented.js +187 -0
  216. package/dist/molecules/jl-stat.css_raw.js +3 -0
  217. package/dist/molecules/jl-stat.d.ts +55 -0
  218. package/dist/molecules/jl-stat.js +169 -0
  219. package/dist/molecules/jl-steps.css_raw.js +3 -0
  220. package/dist/molecules/jl-steps.d.ts +44 -0
  221. package/dist/molecules/jl-steps.js +118 -0
  222. package/dist/molecules/jl-tab-panel.css_raw.js +3 -0
  223. package/dist/molecules/jl-tab-panel.d.ts +35 -0
  224. package/dist/molecules/jl-tab-panel.js +35 -0
  225. package/dist/molecules/jl-tabs.css_raw.js +3 -0
  226. package/dist/molecules/jl-tabs.d.ts +51 -0
  227. package/dist/molecules/jl-tabs.js +198 -0
  228. package/dist/molecules/jl-tag-input.css_raw.js +3 -0
  229. package/dist/molecules/jl-tag-input.d.ts +103 -0
  230. package/dist/molecules/jl-tag-input.js +429 -0
  231. package/dist/molecules/jl-timeline.css_raw.js +3 -0
  232. package/dist/molecules/jl-timeline.d.ts +28 -0
  233. package/dist/molecules/jl-timeline.js +81 -0
  234. package/dist/molecules/jl-toast.css_raw.js +3 -0
  235. package/dist/molecules/jl-toast.d.ts +75 -0
  236. package/dist/molecules/jl-toast.js +274 -0
  237. package/dist/molecules/jl-tooltip.css_raw.js +3 -0
  238. package/dist/molecules/jl-tooltip.d.ts +44 -0
  239. package/dist/molecules/jl-tooltip.js +160 -0
  240. package/dist/organisms/jl-command-palette.css_raw.js +3 -0
  241. package/dist/organisms/jl-command-palette.d.ts +60 -0
  242. package/dist/organisms/jl-command-palette.js +285 -0
  243. package/dist/organisms/jl-confirm.css_raw.js +3 -0
  244. package/dist/organisms/jl-confirm.d.ts +56 -0
  245. package/dist/organisms/jl-confirm.js +132 -0
  246. package/dist/organisms/jl-dialog.css_raw.js +3 -0
  247. package/dist/organisms/jl-dialog.d.ts +43 -0
  248. package/dist/organisms/jl-dialog.js +120 -0
  249. package/dist/organisms/jl-drawer.css_raw.js +3 -0
  250. package/dist/organisms/jl-drawer.d.ts +50 -0
  251. package/dist/organisms/jl-drawer.js +141 -0
  252. package/dist/organisms/jl-navbar.css_raw.js +3 -0
  253. package/dist/organisms/jl-navbar.d.ts +32 -0
  254. package/dist/organisms/jl-navbar.js +121 -0
  255. package/dist/organisms/jl-page-header.css_raw.js +3 -0
  256. package/dist/organisms/jl-page-header.d.ts +26 -0
  257. package/dist/organisms/jl-page-header.js +85 -0
  258. package/dist/organisms/jl-side-nav.css_raw.js +3 -0
  259. package/dist/organisms/jl-side-nav.d.ts +60 -0
  260. package/dist/organisms/jl-side-nav.js +269 -0
  261. package/dist/organisms/jl-table.css_raw.js +3 -0
  262. package/dist/organisms/jl-table.d.ts +109 -0
  263. package/dist/organisms/jl-table.js +318 -0
  264. package/dist/organisms/jl-toaster.css_raw.js +3 -0
  265. package/dist/organisms/jl-toaster.d.ts +48 -0
  266. package/dist/organisms/jl-toaster.js +142 -0
  267. package/dist/organisms/jl-tree.css_raw.js +3 -0
  268. package/dist/organisms/jl-tree.d.ts +59 -0
  269. package/dist/organisms/jl-tree.js +198 -0
  270. package/dist/styles/base.css_raw.js +3 -0
  271. package/dist/styles/control.css_raw.js +3 -0
  272. package/dist/styles/floating.css_raw.js +3 -0
  273. package/dist/styles/shared.d.ts +8 -0
  274. package/dist/styles/shared.js +14 -0
  275. package/dist/styles/tokens.css_raw.js +3 -0
  276. package/dist/templates/jl-app-shell.css_raw.js +3 -0
  277. package/dist/templates/jl-app-shell.d.ts +37 -0
  278. package/dist/templates/jl-app-shell.js +150 -0
  279. package/dist/templates/jl-split-view.css_raw.js +3 -0
  280. package/dist/templates/jl-split-view.d.ts +49 -0
  281. package/dist/templates/jl-split-view.js +149 -0
  282. package/dist/tokens.css +188 -0
  283. package/dist/types/calendar.types.d.ts +11 -0
  284. package/dist/types/files.types.d.ts +23 -0
  285. package/dist/types/floating.types.d.ts +13 -0
  286. package/dist/types/fuzzy.types.d.ts +10 -0
  287. package/dist/types/highlight.types.d.ts +6 -0
  288. package/dist/types/hotkey.types.d.ts +19 -0
  289. package/dist/types/jl-accordion.types.d.ts +2 -0
  290. package/dist/types/jl-avatar.types.d.ts +10 -0
  291. package/dist/types/jl-breadcrumb.types.d.ts +6 -0
  292. package/dist/types/jl-button.types.d.ts +3 -0
  293. package/dist/types/jl-card.types.d.ts +2 -0
  294. package/dist/types/jl-chip.types.d.ts +1 -0
  295. package/dist/types/jl-combobox.types.d.ts +8 -0
  296. package/dist/types/jl-command-palette.types.d.ts +22 -0
  297. package/dist/types/jl-confirm.types.d.ts +10 -0
  298. package/dist/types/jl-dialog.types.d.ts +1 -0
  299. package/dist/types/jl-divider.types.d.ts +2 -0
  300. package/dist/types/jl-drawer.types.d.ts +4 -0
  301. package/dist/types/jl-empty.types.d.ts +2 -0
  302. package/dist/types/jl-field.types.d.ts +2 -0
  303. package/dist/types/jl-input.types.d.ts +1 -0
  304. package/dist/types/jl-link.types.d.ts +2 -0
  305. package/dist/types/jl-menu.types.d.ts +22 -0
  306. package/dist/types/jl-navbar.types.d.ts +6 -0
  307. package/dist/types/jl-progress.types.d.ts +3 -0
  308. package/dist/types/jl-radio-group.types.d.ts +10 -0
  309. package/dist/types/jl-segmented.types.d.ts +7 -0
  310. package/dist/types/jl-select.types.d.ts +12 -0
  311. package/dist/types/jl-side-nav.types.d.ts +17 -0
  312. package/dist/types/jl-skeleton.types.d.ts +2 -0
  313. package/dist/types/jl-slider.types.d.ts +5 -0
  314. package/dist/types/jl-split-view.types.d.ts +2 -0
  315. package/dist/types/jl-stat.types.d.ts +2 -0
  316. package/dist/types/jl-steps.types.d.ts +8 -0
  317. package/dist/types/jl-switch.types.d.ts +1 -0
  318. package/dist/types/jl-table.types.d.ts +30 -0
  319. package/dist/types/jl-tabs.types.d.ts +2 -0
  320. package/dist/types/jl-timeline.types.d.ts +10 -0
  321. package/dist/types/jl-toast.types.d.ts +2 -0
  322. package/dist/types/jl-toaster.types.d.ts +23 -0
  323. package/dist/types/jl-tree.types.d.ts +26 -0
  324. package/dist/types/key-shortcut.types.d.ts +9 -0
  325. package/dist/types/keycaps.types.d.ts +7 -0
  326. package/dist/types/option-filter.types.d.ts +10 -0
  327. package/dist/types/options.types.d.ts +4 -0
  328. package/dist/types/pagination.types.d.ts +8 -0
  329. package/dist/types/roving-index.types.d.ts +2 -0
  330. package/dist/types/sparkline.types.d.ts +11 -0
  331. package/package.json +102 -4
@@ -0,0 +1,71 @@
1
+ import { JlFormControl } from '../base/jl-form-control';
2
+ import type { RadioGroupOrientation, RadioGroupVariant, RadioOption } from '../types/jl-radio-group.types';
3
+ export declare const RADIO_GROUP_ORIENTATIONS: readonly RadioGroupOrientation[];
4
+ export declare const RADIO_GROUP_VARIANTS: readonly RadioGroupVariant[];
5
+ /**
6
+ * One choice among a few, all in view. It behaves as native radios: Tab reaches the chosen option, the arrow keys
7
+ * move the choice, Space chooses the focused option. `variant="cards"` draws each option as a card.
8
+ */
9
+ export declare class JlRadioGroup extends JlFormControl {
10
+ static readonly selector = "jl-radio-group";
11
+ readonly events: Readonly<import("@jadis/core").UseEventsHandler<{
12
+ change: string;
13
+ }>>;
14
+ readonly options: Readonly<Readonly<{
15
+ get(): RadioOption[];
16
+ set(setter: RadioOption[] | ((prevState: RadioOption[]) => RadioOption[])): void;
17
+ }>>;
18
+ readonly value: Readonly<Readonly<{
19
+ get(): string;
20
+ set(setter: string | ((prevState: string) => string)): void;
21
+ }>>;
22
+ readonly orientation: Readonly<Readonly<{
23
+ get(): RadioGroupOrientation;
24
+ set(setter: ((prevState: RadioGroupOrientation) => RadioGroupOrientation) | RadioGroupOrientation): void;
25
+ }>>;
26
+ readonly variant: Readonly<Readonly<{
27
+ get(): RadioGroupVariant;
28
+ set(setter: ((prevState: RadioGroupVariant) => RadioGroupVariant) | RadioGroupVariant): void;
29
+ }>>;
30
+ /** The group's name for screen readers; shown over the options as a legend with `legend`. */
31
+ readonly label: Readonly<Readonly<{
32
+ get(): string;
33
+ set(setter: string | ((prevState: string) => string)): void;
34
+ }>>;
35
+ /** Shows the label over the options. */
36
+ readonly legend: Readonly<Readonly<{
37
+ get(): boolean;
38
+ set(setter: boolean | ((prevState: boolean) => boolean)): void;
39
+ }>>;
40
+ readonly required: Readonly<Readonly<{
41
+ get(): boolean;
42
+ set(setter: boolean | ((prevState: boolean) => boolean)): void;
43
+ }>>;
44
+ readonly disabled: Readonly<Readonly<{
45
+ get(): boolean;
46
+ set(setter: boolean | ((prevState: boolean) => boolean)): void;
47
+ }>>;
48
+ private readonly _state;
49
+ private readonly _refs;
50
+ /** Focuses the chosen option, or the first one that can be chosen. */
51
+ focus(options?: FocusOptions): void;
52
+ templateHtml(): Node;
53
+ templateCss(): string;
54
+ onConnect(): void;
55
+ protected resetValue(): void;
56
+ /** The browser calls it for a disabled fieldset and for the element's own disabled attribute, even before render. */
57
+ protected setDisabledByForm(disabled: boolean): void;
58
+ private onKey;
59
+ /** Moves the focus and the choice together, as native radios do. */
60
+ private moveFrom;
61
+ private choose;
62
+ private radios;
63
+ private isGroupDisabled;
64
+ private isEnabled;
65
+ private renderOptions;
66
+ private optionElement;
67
+ /** Checks the option with the value, and gives the Tab stop to it, or else to the first option enabled. */
68
+ private renderValue;
69
+ private tabStop;
70
+ private renderValidity;
71
+ }
@@ -0,0 +1,202 @@
1
+ import { BASE_STYLES } from "../styles/shared.js";
2
+ import { JlFormControl } from "../base/jl-form-control.js";
3
+ import { jsonOf, oneOf } from "../lib/attributes.js";
4
+ import { rovingIndex } from "../lib/roving-index.js";
5
+ import jl_radio_group_default from "./jl-radio-group.css_raw.js";
6
+ import { css } from "@jadis/core";
7
+ import { jsx, jsxs } from "@jadis/core/jsx-runtime";
8
+ // src/molecules/jl-radio-group.tsx
9
+ var RADIO_GROUP_ORIENTATIONS = ["vertical", "horizontal"];
10
+ var RADIO_GROUP_VARIANTS = ["plain", "cards"];
11
+ var NO_VALUE = "";
12
+ var OPTION_SELECTOR = "[role=\"radio\"]";
13
+ var VALUE_MISSING = "Please select one of these options.";
14
+ /** The keys that move the choice, as with native radios: both arrow pairs whatever the orientation. */
15
+ var MOVES = /* @__PURE__ */ new Map([
16
+ ["ArrowDown", "next"],
17
+ ["ArrowLeft", "previous"],
18
+ ["ArrowRight", "next"],
19
+ ["ArrowUp", "previous"],
20
+ ["End", "last"],
21
+ ["Home", "first"]
22
+ ]);
23
+ var SPACE = " ";
24
+ /**
25
+ * One choice among a few, all in view. It behaves as native radios: Tab reaches the chosen option, the arrow keys
26
+ * move the choice, Space chooses the focused option. `variant="cards"` draws each option as a card.
27
+ */
28
+ var JlRadioGroup = class extends JlFormControl {
29
+ static selector = "jl-radio-group";
30
+ events = this.useEvents();
31
+ options = this.useChange([], () => this.renderOptions(), {
32
+ attribute: "options",
33
+ parse: jsonOf([])
34
+ });
35
+ value = this.useChange(NO_VALUE, () => this.renderValue(), { attribute: "value" });
36
+ orientation = this.useChange("vertical", (value) => {
37
+ this.reflect("orientation", value);
38
+ this._refs.group.setAttribute("aria-orientation", value);
39
+ }, {
40
+ attribute: "orientation",
41
+ parse: oneOf(RADIO_GROUP_ORIENTATIONS, "vertical")
42
+ });
43
+ variant = this.useChange("plain", (value) => this.reflect("variant", value), {
44
+ attribute: "variant",
45
+ parse: oneOf(RADIO_GROUP_VARIANTS, "plain")
46
+ });
47
+ /** The group's name for screen readers; shown over the options as a legend with `legend`. */
48
+ label = this.useChange("", (value) => {
49
+ this._refs.legend.textContent = value;
50
+ }, { attribute: "label" });
51
+ /** Shows the label over the options. */
52
+ legend = this.useChange(false, (value) => {
53
+ this._refs.legend.classList.toggle("sr-only", !value);
54
+ }, { attribute: "legend" });
55
+ required = this.useChange(false, (value) => {
56
+ this.reflect("required", value);
57
+ this._refs.group.toggleAttribute("aria-required", value);
58
+ this.renderValidity();
59
+ }, { attribute: "required" });
60
+ disabled = this.useChange(false, (value) => {
61
+ this.reflect("disabled", value);
62
+ this.renderValue();
63
+ }, { attribute: "disabled" });
64
+ _state = { disabledByForm: false };
65
+ _refs = this.useRefs((ref) => ({
66
+ group: ref(".group"),
67
+ legend: ref(".legend"),
68
+ list: ref(".options")
69
+ }));
70
+ /** Focuses the chosen option, or the first one that can be chosen. */
71
+ focus(options) {
72
+ this.radios().find((radio) => radio.tabIndex === 0)?.focus(options);
73
+ }
74
+ templateHtml() {
75
+ return /* @__PURE__ */ jsxs("div", {
76
+ class: "group",
77
+ role: "radiogroup",
78
+ "aria-labelledby": "legend",
79
+ attrs: { part: "base" },
80
+ children: [/* @__PURE__ */ jsx("span", {
81
+ id: "legend",
82
+ class: "legend sr-only"
83
+ }), /* @__PURE__ */ jsx("div", { class: "options" })]
84
+ });
85
+ }
86
+ templateCss() {
87
+ return css`${BASE_STYLES}${jl_radio_group_default}`;
88
+ }
89
+ onConnect() {
90
+ const list = this._refs.list;
91
+ this.on(list, "click", (event) => {
92
+ const radio = event.target.closest(OPTION_SELECTOR);
93
+ if (radio !== null && this.isEnabled(radio)) this.choose(radio);
94
+ });
95
+ this.on(list, "keydown", (event) => this.onKey(event));
96
+ }
97
+ resetValue() {
98
+ this.value.set(this.getAttribute("value") ?? NO_VALUE);
99
+ }
100
+ /** The browser calls it for a disabled fieldset and for the element's own disabled attribute, even before render. */
101
+ setDisabledByForm(disabled) {
102
+ this._state.disabledByForm = disabled;
103
+ this.whenRendered(() => this.renderValue());
104
+ }
105
+ onKey(event) {
106
+ const radio = event.target.closest(OPTION_SELECTOR);
107
+ if (radio === null) return;
108
+ if (event.key === SPACE) {
109
+ event.preventDefault();
110
+ this.choose(radio);
111
+ return;
112
+ }
113
+ const move = MOVES.get(event.key);
114
+ if (move === void 0) return;
115
+ event.preventDefault();
116
+ this.moveFrom(radio, move);
117
+ }
118
+ /** Moves the focus and the choice together, as native radios do. */
119
+ moveFrom(radio, move) {
120
+ const radios = this.radios();
121
+ const disabled = radios.map((candidate) => !this.isEnabled(candidate));
122
+ const target = radios[rovingIndex(disabled, radios.indexOf(radio), move)];
123
+ if (target !== void 0) this.choose(target);
124
+ }
125
+ choose(radio) {
126
+ radio.focus();
127
+ const value = radio.dataset.value ?? NO_VALUE;
128
+ if (value === this.value.get()) return;
129
+ this.value.set(value);
130
+ this.events.emit("change", value);
131
+ }
132
+ radios() {
133
+ return [...this._refs.list.querySelectorAll(OPTION_SELECTOR)];
134
+ }
135
+ isGroupDisabled() {
136
+ return this.disabled.get() || this._state.disabledByForm;
137
+ }
138
+ isEnabled(radio) {
139
+ return radio.getAttribute("aria-disabled") !== "true";
140
+ }
141
+ renderOptions() {
142
+ this._refs.list.replaceChildren(...this.options.get().map((option, index) => this.optionElement(option, index)));
143
+ this.renderValue();
144
+ }
145
+ optionElement(option, index) {
146
+ const labelId = `option-${index}-label`;
147
+ const descriptionId = `option-${index}-description`;
148
+ const hasDescription = option.description !== void 0 && option.description !== "";
149
+ return /* @__PURE__ */ jsxs("div", {
150
+ class: "option",
151
+ role: "radio",
152
+ "aria-checked": "false",
153
+ "aria-labelledby": labelId,
154
+ "aria-describedby": hasDescription ? descriptionId : void 0,
155
+ "data-value": option.value,
156
+ "data-disabled": option.disabled === true ? "true" : void 0,
157
+ tabIndex: -1,
158
+ children: [/* @__PURE__ */ jsx("span", { class: "dot" }), /* @__PURE__ */ jsxs("span", {
159
+ class: "text",
160
+ children: [/* @__PURE__ */ jsx("span", {
161
+ id: labelId,
162
+ class: "label",
163
+ children: option.label
164
+ }), hasDescription ? /* @__PURE__ */ jsx("span", {
165
+ id: descriptionId,
166
+ class: "description",
167
+ children: option.description
168
+ }) : null]
169
+ })]
170
+ });
171
+ }
172
+ /** Checks the option with the value, and gives the Tab stop to it, or else to the first option enabled. */
173
+ renderValue() {
174
+ const value = this.value.get();
175
+ const radios = this.radios();
176
+ const groupDisabled = this.isGroupDisabled();
177
+ for (const radio of radios) {
178
+ const disabled = groupDisabled || radio.dataset.disabled === "true";
179
+ radio.setAttribute("aria-checked", String(radio.dataset.value === value));
180
+ radio.setAttribute("aria-disabled", String(disabled));
181
+ radio.tabIndex = -1;
182
+ }
183
+ this._refs.group.toggleAttribute("aria-disabled", groupDisabled);
184
+ const stop = this.tabStop(radios, value);
185
+ if (stop !== void 0) stop.tabIndex = 0;
186
+ this.internals.setFormValue(value === NO_VALUE ? null : value);
187
+ this.renderValidity();
188
+ }
189
+ tabStop(radios, value) {
190
+ const enabled = radios.filter((radio) => this.isEnabled(radio));
191
+ return enabled.find((radio) => radio.dataset.value === value) ?? enabled[0];
192
+ }
193
+ renderValidity() {
194
+ if (!(this.required.get() && this.value.get() === NO_VALUE)) {
195
+ this.internals.setValidity({});
196
+ return;
197
+ }
198
+ this.internals.setValidity({ valueMissing: true }, VALUE_MISSING, this.radios()[0] ?? this._refs.group);
199
+ }
200
+ };
201
+ JlRadioGroup.register();
202
+ export { JlRadioGroup, RADIO_GROUP_ORIENTATIONS, RADIO_GROUP_VARIANTS };
@@ -0,0 +1,3 @@
1
+ // src/molecules/jl-search.css?raw
2
+ var jl_search_default = ":host {\n display: block;\n}\n\n.lead {\n width: 16px;\n justify-content: center;\n}\n\n:host([loading]) .lead {\n color: var(--jl-muted);\n}\n\n/* The browser's own clear button: the field draws its own. */\n.native::-webkit-search-cancel-button,\n.native::-webkit-search-decoration {\n appearance: none;\n}\n\n.keys {\n display: inline-flex;\n flex: none;\n gap: 3px;\n margin-right: -4px;\n}\n\n.control:focus-within .keys {\n display: none;\n}\n\n.key {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 5px;\n border: 1px solid var(--jl-line);\n border-bottom-width: 2px;\n border-radius: var(--jl-radius-xs);\n background: var(--jl-surface-2);\n color: var(--jl-muted);\n font-size: var(--jl-font-xs);\n font-weight: 500;\n line-height: 1;\n}\n\n:host([size=\"sm\"]) .key {\n min-width: 18px;\n height: 18px;\n padding: 0 4px;\n}\n";
3
+ export { jl_search_default as default };
@@ -0,0 +1,71 @@
1
+ import { JlFormControl } from '../base/jl-form-control';
2
+ import type { ControlSize } from '../types/options.types';
3
+ /**
4
+ * A search field: `search` fires once typing pauses for `debounce` milliseconds (and at once on Enter), `input` at
5
+ * each key. A `shortcut` ("/", "mod+k") focuses it from anywhere on the page and shows its keys in the field.
6
+ */
7
+ export declare class JlSearch extends JlFormControl {
8
+ static readonly selector = "jl-search";
9
+ readonly events: Readonly<import("@jadis/core").UseEventsHandler<{
10
+ input: string;
11
+ search: string;
12
+ }>>;
13
+ readonly value: Readonly<Readonly<{
14
+ get(): string;
15
+ set(setter: string | ((prevState: string) => string)): void;
16
+ }>>;
17
+ readonly placeholder: Readonly<Readonly<{
18
+ get(): string;
19
+ set(setter: string | ((prevState: string) => string)): void;
20
+ }>>;
21
+ /** The field's name for screen readers; "Search" when nothing else names it. */
22
+ readonly label: Readonly<Readonly<{
23
+ get(): string;
24
+ set(setter: string | ((prevState: string) => string)): void;
25
+ }>>;
26
+ /** How long typing must pause, in milliseconds, before `search` fires. */
27
+ readonly debounce: Readonly<Readonly<{
28
+ get(): number;
29
+ set(setter: number | ((prevState: number) => number)): void;
30
+ }>>;
31
+ /** Keys that focus the field from anywhere: "/" or "mod+k" (⌘ on a Mac, Ctrl elsewhere). */
32
+ readonly shortcut: Readonly<Readonly<{
33
+ get(): string;
34
+ set(setter: string | ((prevState: string) => string)): void;
35
+ }>>;
36
+ readonly size: Readonly<Readonly<{
37
+ get(): ControlSize;
38
+ set(setter: ((prevState: ControlSize) => ControlSize) | ControlSize): void;
39
+ }>>;
40
+ /** Shows a spinner in place of the search icon, while results are on their way. */
41
+ readonly loading: Readonly<Readonly<{
42
+ get(): boolean;
43
+ set(setter: boolean | ((prevState: boolean) => boolean)): void;
44
+ }>>;
45
+ readonly disabled: Readonly<Readonly<{
46
+ get(): boolean;
47
+ set(setter: boolean | ((prevState: boolean) => boolean)): void;
48
+ }>>;
49
+ private readonly _form;
50
+ private readonly _state;
51
+ private readonly _refs;
52
+ focus(options?: FocusOptions): void;
53
+ /** Selects the whole text, ready to be replaced. */
54
+ select(): void;
55
+ templateHtml(): Node;
56
+ templateCss(): string;
57
+ onConnect(): void;
58
+ onDisconnect(): void;
59
+ protected resetValue(): void;
60
+ /** The browser calls it for a disabled fieldset and for the element's own disabled attribute, even before render. */
61
+ protected setDisabledByForm(disabled: boolean): void;
62
+ private renderDisabled;
63
+ private onFieldKey;
64
+ private onPageKey;
65
+ private scheduleSearch;
66
+ private search;
67
+ private clear;
68
+ private renderValue;
69
+ private renderActions;
70
+ private renderShortcut;
71
+ }
@@ -0,0 +1,210 @@
1
+ import { BASE_STYLES, CONTROL_STYLES } from "../styles/shared.js";
2
+ import { JlFormControl } from "../base/jl-form-control.js";
3
+ import { oneOf } from "../lib/attributes.js";
4
+ import { registerIcons } from "../lib/icons.js";
5
+ import { CONTROL_SIZES } from "../lib/options.js";
6
+ import { setOrRemove } from "../lib/dom.js";
7
+ import { JlIcon } from "../atoms/jl-icon.js";
8
+ import { JlSpinner } from "../atoms/jl-spinner.js";
9
+ import { hasCommandModifier, matchesShortcut, parseShortcut, shortcutAria, shortcutLabels } from "../lib/key-shortcut.js";
10
+ import jl_search_default from "./jl-search.css_raw.js";
11
+ import { css } from "@jadis/core";
12
+ import { Search, X } from "lucide";
13
+ import { jsx, jsxs } from "@jadis/core/jsx-runtime";
14
+ // src/molecules/jl-search.tsx
15
+ registerIcons({
16
+ search: Search,
17
+ x: X
18
+ });
19
+ var DEFAULT_DEBOUNCE_MS = 250;
20
+ var ICON_SIZE = 16;
21
+ var ACTION_ICON_SIZE = 14;
22
+ var DEFAULT_LABEL = "Search";
23
+ var MAC_PATTERN = /Mac|iPhone|iPad|iPod/;
24
+ var TYPING_TARGETS = "input, textarea, select, [contenteditable]";
25
+ var isMac = () => MAC_PATTERN.test(navigator.userAgent);
26
+ /** Whether the key was pressed while typing in a field, looking through shadow roots. */
27
+ function isTyping(event) {
28
+ const [target] = event.composedPath();
29
+ return target instanceof HTMLElement && (target.isContentEditable || target.matches(TYPING_TARGETS));
30
+ }
31
+ /**
32
+ * A search field: `search` fires once typing pauses for `debounce` milliseconds (and at once on Enter), `input` at
33
+ * each key. A `shortcut` ("/", "mod+k") focuses it from anywhere on the page and shows its keys in the field.
34
+ */
35
+ var JlSearch = class extends JlFormControl {
36
+ static selector = "jl-search";
37
+ events = this.useEvents();
38
+ value = this.useChange("", (value) => this.renderValue(value), { attribute: "value" });
39
+ placeholder = this.useChange("", (value) => setOrRemove(this._refs.native, "placeholder", value), { attribute: "placeholder" });
40
+ /** The field's name for screen readers; "Search" when nothing else names it. */
41
+ label = this.useChange("", (value) => this._refs.native.setAttribute("aria-label", value || DEFAULT_LABEL), { attribute: "label" });
42
+ /** How long typing must pause, in milliseconds, before `search` fires. */
43
+ debounce = this.useChange(DEFAULT_DEBOUNCE_MS, () => void 0, { attribute: "debounce" });
44
+ /** Keys that focus the field from anywhere: "/" or "mod+k" (⌘ on a Mac, Ctrl elsewhere). */
45
+ shortcut = this.useChange("", () => this.renderShortcut(), { attribute: "shortcut" });
46
+ size = this.useChange("md", (value) => this.reflect("size", value), {
47
+ attribute: "size",
48
+ parse: oneOf(CONTROL_SIZES, "md")
49
+ });
50
+ /** Shows a spinner in place of the search icon, while results are on their way. */
51
+ loading = this.useChange(false, (value) => {
52
+ this._refs.icon.hidden = value;
53
+ this._refs.spinner.hidden = !value;
54
+ this._refs.native.toggleAttribute("aria-busy", value);
55
+ this.reflect("loading", value);
56
+ }, { attribute: "loading" });
57
+ disabled = this.useChange(false, (value) => {
58
+ this.reflect("disabled", value);
59
+ this.renderDisabled();
60
+ }, { attribute: "disabled" });
61
+ _form = { disabled: false };
62
+ _state = {
63
+ lastSearch: "",
64
+ timer: 0
65
+ };
66
+ _refs = this.useRefs((ref) => ({
67
+ clear: ref(".clear"),
68
+ icon: ref(".icon"),
69
+ keys: ref(".keys"),
70
+ native: ref("input"),
71
+ spinner: ref("jl-spinner")
72
+ }));
73
+ focus(options) {
74
+ this._refs.native.focus(options);
75
+ }
76
+ /** Selects the whole text, ready to be replaced. */
77
+ select() {
78
+ this._refs.native.select();
79
+ }
80
+ templateHtml() {
81
+ return /* @__PURE__ */ jsxs("div", {
82
+ class: "control",
83
+ attrs: { part: "base" },
84
+ children: [
85
+ /* @__PURE__ */ jsxs("span", {
86
+ class: "adornment lead",
87
+ children: [/* @__PURE__ */ jsx(JlIcon, {
88
+ class: "icon",
89
+ name: "search",
90
+ size: ICON_SIZE
91
+ }), /* @__PURE__ */ jsx(JlSpinner, {
92
+ size: ICON_SIZE,
93
+ hidden: true
94
+ })]
95
+ }),
96
+ /* @__PURE__ */ jsx("input", {
97
+ class: "native",
98
+ type: "search",
99
+ autocomplete: "off"
100
+ }),
101
+ /* @__PURE__ */ jsx("button", {
102
+ class: "action clear",
103
+ type: "button",
104
+ "aria-label": "Clear the search",
105
+ tabIndex: -1,
106
+ hidden: true,
107
+ children: /* @__PURE__ */ jsx(JlIcon, {
108
+ name: "x",
109
+ size: ACTION_ICON_SIZE
110
+ })
111
+ }),
112
+ /* @__PURE__ */ jsx("span", {
113
+ class: "keys",
114
+ "aria-hidden": "true",
115
+ hidden: true
116
+ })
117
+ ]
118
+ });
119
+ }
120
+ templateCss() {
121
+ return css`${BASE_STYLES}${CONTROL_STYLES}${jl_search_default}`;
122
+ }
123
+ onConnect() {
124
+ const native = this._refs.native;
125
+ this.on(native, "input", (event) => {
126
+ event.stopPropagation();
127
+ this.value.set(native.value);
128
+ this.events.emit("input", native.value);
129
+ this.scheduleSearch();
130
+ });
131
+ this.on(native, "keydown", (event) => this.onFieldKey(event));
132
+ this.on(this._refs.clear, "click", () => this.clear());
133
+ document.addEventListener("keydown", (event) => this.onPageKey(event), { signal: this.killSignal });
134
+ }
135
+ onDisconnect() {
136
+ window.clearTimeout(this._state.timer);
137
+ }
138
+ resetValue() {
139
+ this.value.set(this.getAttribute("value") ?? "");
140
+ }
141
+ /** The browser calls it for a disabled fieldset and for the element's own disabled attribute, even before render. */
142
+ setDisabledByForm(disabled) {
143
+ this._form.disabled = disabled;
144
+ this.whenRendered(() => this.renderDisabled());
145
+ }
146
+ renderDisabled() {
147
+ this._refs.native.disabled = this.disabled.get() || this._form.disabled;
148
+ this.renderActions();
149
+ }
150
+ onFieldKey(event) {
151
+ if (event.key === "Enter") {
152
+ event.preventDefault();
153
+ this.search(this.value.get());
154
+ return;
155
+ }
156
+ if (event.key === "Escape" && this.value.get() !== "") {
157
+ event.preventDefault();
158
+ event.stopPropagation();
159
+ this.clear();
160
+ }
161
+ }
162
+ onPageKey(event) {
163
+ const shortcut = parseShortcut(this.shortcut.get());
164
+ if (shortcut === null || event.defaultPrevented || this._refs.native.disabled) return;
165
+ if (!matchesShortcut(event, shortcut, isMac()) || !hasCommandModifier(shortcut) && isTyping(event)) return;
166
+ event.preventDefault();
167
+ this.focus();
168
+ this.select();
169
+ }
170
+ scheduleSearch() {
171
+ window.clearTimeout(this._state.timer);
172
+ this._state.timer = window.setTimeout(() => {
173
+ if (this.value.get() !== this._state.lastSearch) this.search(this.value.get());
174
+ }, this.debounce.get());
175
+ }
176
+ search(query) {
177
+ window.clearTimeout(this._state.timer);
178
+ this._state.lastSearch = query;
179
+ this.events.emit("search", query);
180
+ }
181
+ clear() {
182
+ this.value.set("");
183
+ this.events.emit("input", "");
184
+ this.search("");
185
+ this.focus();
186
+ }
187
+ renderValue(value) {
188
+ const native = this._refs.native;
189
+ if (native.value !== value) native.value = value;
190
+ this.internals.setFormValue(value);
191
+ this.renderActions();
192
+ }
193
+ renderActions() {
194
+ const hasText = this.value.get() !== "";
195
+ this._refs.clear.hidden = !hasText || this._refs.native.disabled;
196
+ this._refs.keys.hidden = hasText || this._refs.keys.childElementCount === 0;
197
+ }
198
+ renderShortcut() {
199
+ const shortcut = parseShortcut(this.shortcut.get());
200
+ const labels = shortcut === null ? [] : shortcutLabels(shortcut, isMac());
201
+ this._refs.keys.replaceChildren(...labels.map((label) => /* @__PURE__ */ jsx("kbd", {
202
+ class: "key",
203
+ children: label
204
+ })));
205
+ setOrRemove(this._refs.native, "aria-keyshortcuts", shortcut === null ? "" : shortcutAria(shortcut, isMac()));
206
+ this.renderActions();
207
+ }
208
+ };
209
+ JlSearch.register();
210
+ export { JlSearch };
@@ -0,0 +1,3 @@
1
+ // src/molecules/jl-segmented.css?raw
2
+ var jl_segmented_default = ":host {\n display: inline-flex;\n vertical-align: middle;\n /* Its own width, even as a grid or flex item that would stretch it: block asks for the whole width. */\n justify-self: start;\n max-width: 100%;\n --height: var(--jl-control-md);\n --pad: 12px;\n --font-size: var(--jl-font-sm);\n}\n\n:host([size=\"sm\"]) {\n --height: var(--jl-control-sm);\n --pad: 10px;\n --font-size: var(--jl-font-xs);\n}\n\n:host([size=\"lg\"]) {\n --height: var(--jl-control-lg);\n --pad: 16px;\n --font-size: var(--jl-font-md);\n}\n\n:host([block]) {\n display: flex;\n justify-self: stretch;\n}\n\n.group {\n position: relative;\n display: flex;\n flex: 1;\n overflow-x: auto;\n scrollbar-width: none;\n min-width: 0;\n height: var(--height);\n padding: 2px;\n border: 1px solid var(--jl-line);\n border-radius: var(--jl-radius-sm);\n background: var(--jl-surface-2);\n}\n\n.segment {\n position: relative;\n z-index: 1;\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n gap: 6px;\n min-width: calc(var(--height) - 6px);\n padding: 0 var(--pad);\n border: none;\n border-radius: calc(var(--jl-radius-sm) - 3px);\n background: none;\n color: var(--jl-muted);\n font-size: var(--font-size);\n font-weight: 600;\n white-space: nowrap;\n cursor: pointer;\n transition: color var(--jl-fast) var(--jl-ease);\n}\n\n.segment:hover:not(:disabled) {\n color: var(--jl-text);\n}\n\n.segment[aria-checked=\"true\"] {\n color: var(--jl-text);\n}\n\n.segment:disabled {\n cursor: not-allowed;\n opacity: 0.45;\n}\n\n:host([block]) .segment {\n flex: 1 1 0;\n}\n\n/* The chosen option's raised surface, slid under it. */\n.thumb {\n position: absolute;\n top: 0;\n left: 0;\n width: var(--w);\n height: var(--h);\n border: 1px solid var(--jl-line-strong);\n border-radius: calc(var(--jl-radius-sm) - 3px);\n /* Raised over the track: white on light grey, a lighter grey on a dark ground. */\n background: light-dark(var(--jl-surface), var(--jl-surface-3));\n box-shadow: var(--jl-shadow-sm);\n transform: translate(var(--x), var(--y));\n pointer-events: none;\n}\n\n.thumb[data-placed] {\n transition:\n transform var(--jl-slow) var(--jl-ease),\n width var(--jl-slow) var(--jl-ease);\n}\n\n.group[aria-disabled] {\n opacity: 0.55;\n}\n\n.group[aria-disabled] .segment {\n opacity: 1;\n}\n\n/* The track scrolls when the options do not fit: a ring drawn outside the segment would be cut. */\n.segment:focus-visible {\n box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--jl-brand) 60%, transparent);\n}\n";
3
+ export { jl_segmented_default as default };
@@ -0,0 +1,65 @@
1
+ import { JlFormControl } from '../base/jl-form-control';
2
+ import type { SegmentedOption } from '../types/jl-segmented.types';
3
+ import type { ControlSize } from '../types/options.types';
4
+ /**
5
+ * A row of a few exclusive choices with a thumb that slides to the chosen one: a view switch, a period, a
6
+ * density. It takes part in forms like a radio group; `change` fires with the value people pick.
7
+ */
8
+ export declare class JlSegmented extends JlFormControl {
9
+ static readonly selector = "jl-segmented";
10
+ readonly events: Readonly<import("@jadis/core").UseEventsHandler<{
11
+ change: string;
12
+ }>>;
13
+ readonly options: Readonly<Readonly<{
14
+ get(): SegmentedOption[];
15
+ set(setter: SegmentedOption[] | ((prevState: SegmentedOption[]) => SegmentedOption[])): void;
16
+ }>>;
17
+ /** The chosen option's value; the first option that can be chosen when it names none. */
18
+ readonly value: Readonly<Readonly<{
19
+ get(): string;
20
+ set(setter: string | ((prevState: string) => string)): void;
21
+ }>>;
22
+ readonly size: Readonly<Readonly<{
23
+ get(): ControlSize;
24
+ set(setter: ((prevState: ControlSize) => ControlSize) | ControlSize): void;
25
+ }>>;
26
+ /** Takes the whole width, the options sharing it. */
27
+ readonly block: Readonly<Readonly<{
28
+ get(): boolean;
29
+ set(setter: boolean | ((prevState: boolean) => boolean)): void;
30
+ }>>;
31
+ readonly disabled: Readonly<Readonly<{
32
+ get(): boolean;
33
+ set(setter: boolean | ((prevState: boolean) => boolean)): void;
34
+ }>>;
35
+ /** The group's name for screen readers, when no visible label names it. */
36
+ readonly label: Readonly<Readonly<{
37
+ get(): string;
38
+ set(setter: string | ((prevState: string) => string)): void;
39
+ }>>;
40
+ private readonly _state;
41
+ private readonly _resize;
42
+ private readonly _refs;
43
+ focus(options?: FocusOptions): void;
44
+ templateHtml(): Node;
45
+ templateCss(): string;
46
+ onConnect(): void;
47
+ onDisconnect(): void;
48
+ protected resetValue(): void;
49
+ /** The browser calls it for a disabled fieldset and for the element's own `disabled`, even before it renders. */
50
+ protected setDisabledByForm(disabled: boolean): void;
51
+ private segments;
52
+ private selectedSegment;
53
+ private isDisabled;
54
+ private renderOptions;
55
+ /** A segment; with only an icon, its value names it. */
56
+ private segment;
57
+ /** The chosen option's index: the one `value` names, or else the first that can be chosen. */
58
+ private selectedIndex;
59
+ private renderValue;
60
+ private renderDisabled;
61
+ private placeThumb;
62
+ private onKeydown;
63
+ /** Chooses an option people picked, and says so. */
64
+ private choose;
65
+ }