plass-ui 1.3.0 → 1.5.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 (454) hide show
  1. package/CHANGELOG.md +962 -0
  2. package/README.md +19 -17
  3. package/dist/components/accordion/PlAccordion.d.ts +1 -1
  4. package/dist/components/alert/PlAlert.js +1 -1
  5. package/dist/components/anchor/PlAnchor.d.ts +85 -0
  6. package/dist/components/anchor/PlAnchor.js +1 -0
  7. package/dist/components/anchor/index.d.ts +2 -0
  8. package/dist/components/anchor/index.js +1 -0
  9. package/dist/components/animate-appear/PlAnimateAppear.d.ts +10 -0
  10. package/dist/components/animate-appear/PlAnimateAppear.js +1 -1
  11. package/dist/components/animate-blink/PlAnimateBlink.d.ts +2 -2
  12. package/dist/components/animate-blink/PlAnimateBlink.js +1 -1
  13. package/dist/components/animate-counter/PlAnimateCounter.d.ts +83 -0
  14. package/dist/components/animate-counter/PlAnimateCounter.js +1 -0
  15. package/dist/components/animate-counter/index.d.ts +2 -0
  16. package/dist/components/animate-counter/index.js +1 -0
  17. package/dist/components/animate-fade/PlAnimateFade.d.ts +2 -2
  18. package/dist/components/animate-fade/PlAnimateFade.js +1 -1
  19. package/dist/components/animate-float/PlAnimateFloat.d.ts +51 -0
  20. package/dist/components/animate-float/PlAnimateFloat.js +1 -0
  21. package/dist/components/animate-float/index.d.ts +2 -0
  22. package/dist/components/animate-float/index.js +1 -0
  23. package/dist/components/animate-grow/PlAnimateGrow.d.ts +2 -2
  24. package/dist/components/animate-grow/PlAnimateGrow.js +1 -1
  25. package/dist/components/animate-headline/PlAnimateHeadline.js +1 -1
  26. package/dist/components/animate-lighting/PlAnimateLighting.js +1 -1
  27. package/dist/components/animate-marquee/PlAnimateMarquee.d.ts +13 -4
  28. package/dist/components/animate-marquee/PlAnimateMarquee.js +1 -1
  29. package/dist/components/animate-reveal/PlAnimateReveal.d.ts +51 -0
  30. package/dist/components/animate-reveal/PlAnimateReveal.js +1 -0
  31. package/dist/components/animate-reveal/index.d.ts +2 -0
  32. package/dist/components/animate-reveal/index.js +1 -0
  33. package/dist/components/animate-rotate/PlAnimateRotate.d.ts +2 -2
  34. package/dist/components/animate-rotate/PlAnimateRotate.js +1 -1
  35. package/dist/components/animate-scramble/PlAnimateScramble.d.ts +75 -0
  36. package/dist/components/animate-scramble/PlAnimateScramble.js +1 -0
  37. package/dist/components/animate-scramble/index.d.ts +2 -0
  38. package/dist/components/animate-scramble/index.js +1 -0
  39. package/dist/components/animate-shake/PlAnimateShake.d.ts +57 -0
  40. package/dist/components/animate-shake/PlAnimateShake.js +1 -0
  41. package/dist/components/animate-shake/index.d.ts +2 -0
  42. package/dist/components/animate-shake/index.js +1 -0
  43. package/dist/components/animate-slide/PlAnimateSlide.d.ts +2 -2
  44. package/dist/components/animate-slide/PlAnimateSlide.js +1 -1
  45. package/dist/components/animate-split/PlAnimateSplit.d.ts +57 -0
  46. package/dist/components/animate-split/PlAnimateSplit.js +1 -0
  47. package/dist/components/animate-split/index.d.ts +2 -0
  48. package/dist/components/animate-split/index.js +1 -0
  49. package/dist/components/animate-typing/PlAnimateTyping.d.ts +3 -2
  50. package/dist/components/animate-typing/PlAnimateTyping.js +1 -1
  51. package/dist/components/animate-zoom/PlAnimateZoom.d.ts +2 -2
  52. package/dist/components/animate-zoom/PlAnimateZoom.js +1 -1
  53. package/dist/components/app-logo/PlAppLogo.d.ts +78 -0
  54. package/dist/components/app-logo/PlAppLogo.js +1 -0
  55. package/dist/components/app-logo/index.d.ts +2 -0
  56. package/dist/components/app-logo/index.js +1 -0
  57. package/dist/components/area-chart/PlAreaChart.d.ts +54 -0
  58. package/dist/components/area-chart/PlAreaChart.js +1 -0
  59. package/dist/components/area-chart/index.d.ts +2 -0
  60. package/dist/components/area-chart/index.js +1 -0
  61. package/dist/components/aspect-ratio/PlAspectRatio.d.ts +2 -1
  62. package/dist/components/aspect-ratio/PlAspectRatio.js +1 -1
  63. package/dist/components/avatar/PlAvatar.js +1 -1
  64. package/dist/components/back-top/PlBackTop.d.ts +2 -1
  65. package/dist/components/back-top/PlBackTop.js +1 -1
  66. package/dist/components/badge/PlBadge.js +1 -1
  67. package/dist/components/bar-chart/PlBarChart.d.ts +63 -0
  68. package/dist/components/bar-chart/PlBarChart.js +1 -0
  69. package/dist/components/bar-chart/index.d.ts +2 -0
  70. package/dist/components/bar-chart/index.js +1 -0
  71. package/dist/components/bottom-navigation/PlBottomNavigation.d.ts +3 -0
  72. package/dist/components/breadcrumb/PlBreadcrumb.js +1 -1
  73. package/dist/components/button/PlButton.d.ts +8 -0
  74. package/dist/components/button/PlButton.js +1 -1
  75. package/dist/components/button-group/PlButtonGroup.js +1 -1
  76. package/dist/components/calendar/PlCalendar.js +1 -1
  77. package/dist/components/card/PlCard.js +1 -1
  78. package/dist/components/carousel/PlCarousel.d.ts +1 -1
  79. package/dist/components/carousel/PlCarousel.js +1 -1
  80. package/dist/components/chat-bubble/PlChatBubble.d.ts +4 -1
  81. package/dist/components/chat-bubble/PlChatBubble.js +1 -1
  82. package/dist/components/checkbox/PlCheckbox.js +1 -1
  83. package/dist/components/chip/PlChip.d.ts +6 -2
  84. package/dist/components/chip/PlChip.js +1 -1
  85. package/dist/components/code-block/PlCodeBlock.d.ts +192 -0
  86. package/dist/components/code-block/PlCodeBlock.js +1 -0
  87. package/dist/components/code-block/index.d.ts +2 -0
  88. package/dist/components/code-block/index.js +1 -0
  89. package/dist/components/color-picker/PlColorPicker.js +1 -1
  90. package/dist/components/combobox/PlCombobox.d.ts +6 -5
  91. package/dist/components/combobox/PlCombobox.js +1 -1
  92. package/dist/components/command-palette/PlCommandPalette.d.ts +6 -2
  93. package/dist/components/command-palette/PlCommandPalette.js +1 -1
  94. package/dist/components/confirm/PlConfirmProvider.js +1 -1
  95. package/dist/components/container/PlContainer.d.ts +22 -6
  96. package/dist/components/container/PlContainer.js +1 -1
  97. package/dist/components/data-list/PlDataList.d.ts +74 -0
  98. package/dist/components/data-list/PlDataList.js +1 -0
  99. package/dist/components/data-list/index.d.ts +2 -0
  100. package/dist/components/data-list/index.js +1 -0
  101. package/dist/components/data-table/PlDataTable.d.ts +216 -0
  102. package/dist/components/data-table/PlDataTable.js +1 -0
  103. package/dist/components/data-table/index.d.ts +2 -0
  104. package/dist/components/data-table/index.js +1 -0
  105. package/dist/components/date-picker/PlDatePicker.js +1 -1
  106. package/dist/components/date-range-picker/PlDateRangePicker.js +1 -1
  107. package/dist/components/date-time-picker/PlDateTimePicker.js +1 -1
  108. package/dist/components/drawer/PlDrawer.d.ts +1 -1
  109. package/dist/components/drawer/PlDrawer.js +1 -1
  110. package/dist/components/file-picker/PlFilePicker.d.ts +4 -1
  111. package/dist/components/file-picker/PlFilePicker.js +1 -1
  112. package/dist/components/flex/PlFlex.d.ts +83 -0
  113. package/dist/components/flex/PlFlex.js +1 -0
  114. package/dist/components/flex/index.d.ts +2 -0
  115. package/dist/components/flex/index.js +1 -0
  116. package/dist/components/floating-action-button/PlFloatingActionButton.d.ts +81 -0
  117. package/dist/components/floating-action-button/PlFloatingActionButton.js +1 -0
  118. package/dist/components/floating-action-button/index.d.ts +2 -0
  119. package/dist/components/floating-action-button/index.js +1 -0
  120. package/dist/components/floating-bottom-navigation/PlFloatingBottomNavigation.d.ts +3 -0
  121. package/dist/components/floating-bottom-navigation/PlFloatingBottomNavigation.js +1 -1
  122. package/dist/components/footer/PlFooter.d.ts +4 -3
  123. package/dist/components/footer/PlFooter.js +1 -1
  124. package/dist/components/form/PlForm.js +1 -1
  125. package/dist/components/gallery/PlGallery.d.ts +192 -0
  126. package/dist/components/gallery/PlGallery.js +1 -0
  127. package/dist/components/gallery/PlGalleryViewer.d.ts +31 -0
  128. package/dist/components/gallery/PlGalleryViewer.js +1 -0
  129. package/dist/components/gallery/index.d.ts +2 -0
  130. package/dist/components/gallery/index.js +1 -0
  131. package/dist/components/gauge-chart/PlGaugeChart.d.ts +64 -0
  132. package/dist/components/gauge-chart/PlGaugeChart.js +1 -0
  133. package/dist/components/gauge-chart/index.d.ts +2 -0
  134. package/dist/components/gauge-chart/index.js +1 -0
  135. package/dist/components/grid/PlGrid.js +1 -1
  136. package/dist/components/grid/PlGridItem.js +1 -1
  137. package/dist/components/header/PlHeader.d.ts +4 -3
  138. package/dist/components/header/PlHeader.js +1 -1
  139. package/dist/components/heatmap-chart/PlHeatmapChart.d.ts +69 -0
  140. package/dist/components/heatmap-chart/PlHeatmapChart.js +1 -0
  141. package/dist/components/heatmap-chart/index.d.ts +2 -0
  142. package/dist/components/heatmap-chart/index.js +1 -0
  143. package/dist/components/highlight/PlHighlight.js +1 -1
  144. package/dist/components/hot-keys/PlHotKeys.js +1 -1
  145. package/dist/components/hover-card/PlHoverCard.d.ts +96 -0
  146. package/dist/components/hover-card/PlHoverCard.js +1 -0
  147. package/dist/components/hover-card/index.d.ts +2 -0
  148. package/dist/components/hover-card/index.js +1 -0
  149. package/dist/components/how-to-steps/PlHowToSteps.d.ts +87 -0
  150. package/dist/components/how-to-steps/PlHowToSteps.js +1 -0
  151. package/dist/components/how-to-steps/index.d.ts +2 -0
  152. package/dist/components/how-to-steps/index.js +1 -0
  153. package/dist/components/image/PlImage.d.ts +195 -8
  154. package/dist/components/image/PlImage.js +1 -1
  155. package/dist/components/image/PlImagePreview.d.ts +58 -0
  156. package/dist/components/image/PlImagePreview.js +1 -0
  157. package/dist/components/image/index.d.ts +1 -1
  158. package/dist/components/line-chart/PlLineChart.d.ts +74 -0
  159. package/dist/components/line-chart/PlLineChart.js +1 -0
  160. package/dist/components/line-chart/index.d.ts +2 -0
  161. package/dist/components/line-chart/index.js +1 -0
  162. package/dist/components/menu/PlMenu.d.ts +14 -5
  163. package/dist/components/menu/PlMenu.js +1 -1
  164. package/dist/components/meter/PlMeter.d.ts +83 -0
  165. package/dist/components/meter/PlMeter.js +1 -0
  166. package/dist/components/meter/index.d.ts +2 -0
  167. package/dist/components/meter/index.js +1 -0
  168. package/dist/components/mockup/PlMockup.d.ts +146 -0
  169. package/dist/components/mockup/PlMockup.js +1 -0
  170. package/dist/components/mockup/index.d.ts +2 -0
  171. package/dist/components/mockup/index.js +1 -0
  172. package/dist/components/modal/PlModal.d.ts +1 -1
  173. package/dist/components/modal/PlModal.js +1 -1
  174. package/dist/components/navigation-menu/PlNavigationMenu.d.ts +7 -1
  175. package/dist/components/navigation-menu/PlNavigationMenu.js +1 -1
  176. package/dist/components/number-field/PlNumberField.d.ts +1 -1
  177. package/dist/components/number-field/PlNumberField.js +1 -1
  178. package/dist/components/otp-field/PlOtpField.d.ts +6 -0
  179. package/dist/components/otp-field/PlOtpField.js +1 -1
  180. package/dist/components/overlay/PlOverlay.d.ts +1 -1
  181. package/dist/components/overlay/PlOverlay.js +1 -1
  182. package/dist/components/page-layout/PlPageLayout.js +1 -1
  183. package/dist/components/pagination/PlPagination.d.ts +12 -9
  184. package/dist/components/pagination/PlPagination.js +1 -1
  185. package/dist/components/panes/PlPanes.d.ts +7 -2
  186. package/dist/components/panes/PlPanes.js +1 -1
  187. package/dist/components/pie-chart/PlPieChart.d.ts +58 -0
  188. package/dist/components/pie-chart/PlPieChart.js +1 -0
  189. package/dist/components/pie-chart/index.d.ts +2 -0
  190. package/dist/components/pie-chart/index.js +1 -0
  191. package/dist/components/pill/PlPill.js +1 -1
  192. package/dist/components/popconfirm/PlPopconfirm.d.ts +1 -1
  193. package/dist/components/popconfirm/PlPopconfirm.js +1 -1
  194. package/dist/components/popover/PlPopover.d.ts +6 -6
  195. package/dist/components/popover/PlPopover.js +1 -1
  196. package/dist/components/portal/PlPortal.d.ts +78 -0
  197. package/dist/components/portal/PlPortal.js +1 -0
  198. package/dist/components/portal/index.d.ts +2 -0
  199. package/dist/components/portal/index.js +1 -0
  200. package/dist/components/progress-box/PlProgressBox.js +1 -1
  201. package/dist/components/progress-circular/PlProgressCircular.js +1 -1
  202. package/dist/components/progress-linear/PlProgressLinear.js +1 -1
  203. package/dist/components/radio-group/PlRadioGroup.js +1 -1
  204. package/dist/components/rating/PlRating.d.ts +1 -1
  205. package/dist/components/rating/PlRating.js +1 -1
  206. package/dist/components/scatter-chart/PlScatterChart.d.ts +46 -0
  207. package/dist/components/scatter-chart/PlScatterChart.js +1 -0
  208. package/dist/components/scatter-chart/index.d.ts +2 -0
  209. package/dist/components/scatter-chart/index.js +1 -0
  210. package/dist/components/scroll-area/PlScrollArea.d.ts +98 -0
  211. package/dist/components/scroll-area/PlScrollArea.js +1 -0
  212. package/dist/components/scroll-area/index.d.ts +2 -0
  213. package/dist/components/scroll-area/index.js +1 -0
  214. package/dist/components/scroll-zone/PlScrollZone.d.ts +27 -10
  215. package/dist/components/scroll-zone/PlScrollZone.js +1 -1
  216. package/dist/components/segmented-button/PlSegmentedButton.js +1 -1
  217. package/dist/components/select/PlSelect.js +1 -1
  218. package/dist/components/show/PlShow.d.ts +76 -0
  219. package/dist/components/show/PlShow.js +1 -0
  220. package/dist/components/show/index.d.ts +2 -0
  221. package/dist/components/show/index.js +1 -0
  222. package/dist/components/sidebar/PlSidebar.js +1 -1
  223. package/dist/components/sidebar/PlSidebarTrigger.js +1 -1
  224. package/dist/components/skeleton/PlSkeleton.js +1 -1
  225. package/dist/components/slider/PlSlider.d.ts +13 -1
  226. package/dist/components/slider/PlSlider.js +1 -1
  227. package/dist/components/sparkline/PlSparkline.d.ts +68 -0
  228. package/dist/components/sparkline/PlSparkline.js +1 -0
  229. package/dist/components/sparkline/index.d.ts +2 -0
  230. package/dist/components/sparkline/index.js +1 -0
  231. package/dist/components/spoiler/PlSpoiler.d.ts +16 -1
  232. package/dist/components/spoiler/PlSpoiler.js +1 -1
  233. package/dist/components/stack/PlStack.d.ts +114 -0
  234. package/dist/components/stack/PlStack.js +1 -0
  235. package/dist/components/stack/index.d.ts +2 -0
  236. package/dist/components/stack/index.js +1 -0
  237. package/dist/components/stat/PlStat.d.ts +4 -0
  238. package/dist/components/stat/PlStat.js +1 -1
  239. package/dist/components/stepper/PlStepper.d.ts +3 -3
  240. package/dist/components/stepper/PlStepper.js +1 -1
  241. package/dist/components/switch/PlSwitch.js +1 -1
  242. package/dist/components/table/PlTable.d.ts +5 -5
  243. package/dist/components/table/PlTable.js +1 -1
  244. package/dist/components/tabs/PlTabs.d.ts +27 -2
  245. package/dist/components/tabs/PlTabs.js +1 -1
  246. package/dist/components/text-link/PlTextLink.js +1 -1
  247. package/dist/components/time-picker/PlTimePicker.js +1 -1
  248. package/dist/components/timeline/PlTimeline.d.ts +2 -2
  249. package/dist/components/timeline/PlTimeline.js +1 -1
  250. package/dist/components/timeline-chart/PlTimelineChart.d.ts +44 -0
  251. package/dist/components/timeline-chart/PlTimelineChart.js +1 -0
  252. package/dist/components/timeline-chart/index.d.ts +2 -0
  253. package/dist/components/timeline-chart/index.js +1 -0
  254. package/dist/components/toast/PlToast.d.ts +1 -1
  255. package/dist/components/toast/PlToast.js +1 -1
  256. package/dist/components/toggle/PlToggle.js +1 -1
  257. package/dist/components/toggle/PlToggleGroup.js +1 -1
  258. package/dist/components/tooltip/PlTooltip.js +1 -1
  259. package/dist/components/tour/PlTour.d.ts +134 -0
  260. package/dist/components/tour/PlTour.js +1 -0
  261. package/dist/components/tour/index.d.ts +2 -0
  262. package/dist/components/tour/index.js +1 -0
  263. package/dist/components/transfer/PlTransfer.d.ts +10 -1
  264. package/dist/components/transfer/PlTransfer.js +1 -1
  265. package/dist/components/tree/PlTree.js +1 -1
  266. package/dist/components/tree-select/PlTreeSelect.d.ts +99 -0
  267. package/dist/components/tree-select/PlTreeSelect.js +1 -0
  268. package/dist/components/tree-select/index.d.ts +2 -0
  269. package/dist/components/tree-select/index.js +1 -0
  270. package/dist/components/typography/PlTypography.js +1 -1
  271. package/dist/components/window-pane/PlWindowPane.d.ts +179 -0
  272. package/dist/components/window-pane/PlWindowPane.js +1 -0
  273. package/dist/components/window-pane/index.d.ts +2 -0
  274. package/dist/components/window-pane/index.js +1 -0
  275. package/dist/css/anchor.css +2 -0
  276. package/dist/css/animate-counter.css +2 -0
  277. package/dist/css/animate-float.css +2 -0
  278. package/dist/css/animate-reveal.css +2 -0
  279. package/dist/css/animate-scramble.css +2 -0
  280. package/dist/css/animate-shake.css +2 -0
  281. package/dist/css/animate-split.css +2 -0
  282. package/dist/css/app-logo.css +2 -0
  283. package/dist/css/area-chart.css +3 -0
  284. package/dist/css/back-top.css +2 -0
  285. package/dist/css/bar-chart.css +3 -0
  286. package/dist/css/calendar.css +1 -0
  287. package/dist/css/carousel.css +2 -0
  288. package/dist/css/code-block.css +2 -0
  289. package/dist/css/color-picker.css +1 -0
  290. package/dist/css/combobox.css +1 -0
  291. package/dist/css/command-palette.css +1 -0
  292. package/dist/css/confirm.css +2 -0
  293. package/dist/css/data-list.css +2 -0
  294. package/dist/css/data-table.css +7 -0
  295. package/dist/css/date-picker.css +1 -0
  296. package/dist/css/date-range-picker.css +1 -0
  297. package/dist/css/date-time-picker.css +1 -0
  298. package/dist/css/flex.css +2 -0
  299. package/dist/css/floating-action-button.css +4 -0
  300. package/dist/css/gallery.css +7 -0
  301. package/dist/css/gauge-chart.css +3 -0
  302. package/dist/css/heatmap-chart.css +3 -0
  303. package/dist/css/hover-card.css +2 -0
  304. package/dist/css/how-to-steps.css +2 -0
  305. package/dist/css/icon-button.css +1 -0
  306. package/dist/css/image.css +2 -0
  307. package/dist/css/line-chart.css +3 -0
  308. package/dist/css/menubar.css +1 -0
  309. package/dist/css/meter.css +2 -0
  310. package/dist/css/mockup.css +2 -0
  311. package/dist/css/pagination.css +1 -0
  312. package/dist/css/pie-chart.css +3 -0
  313. package/dist/css/popconfirm.css +2 -0
  314. package/dist/css/portal.css +2 -0
  315. package/dist/css/scatter-chart.css +3 -0
  316. package/dist/css/scroll-area.css +2 -0
  317. package/dist/css/scroll-zone.css +2 -0
  318. package/dist/css/show.css +2 -0
  319. package/dist/css/sidebar.css +3 -0
  320. package/dist/css/sparkline.css +3 -0
  321. package/dist/css/spoiler.css +1 -0
  322. package/dist/css/stack.css +2 -0
  323. package/dist/css/stat.css +1 -0
  324. package/dist/css/time-picker.css +1 -0
  325. package/dist/css/timeline-chart.css +3 -0
  326. package/dist/css/tour.css +3 -0
  327. package/dist/css/transfer.css +4 -0
  328. package/dist/css/tree-select.css +4 -0
  329. package/dist/css/window-pane.css +2 -0
  330. package/dist/hooks/index.d.ts +6 -0
  331. package/dist/hooks/index.js +1 -1
  332. package/dist/hooks/usePlBreakpoint.d.ts +3 -0
  333. package/dist/hooks/usePlBreakpoint.js +1 -1
  334. package/dist/hooks/usePlDisclosure.d.ts +44 -0
  335. package/dist/hooks/usePlDisclosure.js +1 -0
  336. package/dist/hooks/usePlElementSize.d.ts +34 -0
  337. package/dist/hooks/usePlElementSize.js +1 -0
  338. package/dist/hooks/usePlHotKeys.d.ts +5 -1
  339. package/dist/hooks/usePlHotKeys.js +1 -1
  340. package/dist/hooks/usePlOnScreen.d.ts +54 -0
  341. package/dist/hooks/usePlOnScreen.js +1 -0
  342. package/dist/index.d.ts +34 -1
  343. package/dist/index.js +1 -1
  344. package/dist/internal/animate.d.ts +121 -7
  345. package/dist/internal/animate.js +1 -1
  346. package/dist/internal/breakpoints.d.ts +31 -0
  347. package/dist/internal/breakpoints.js +1 -0
  348. package/dist/internal/button-group.d.ts +29 -2
  349. package/dist/internal/button-group.js +2 -2
  350. package/dist/internal/calendar.d.ts +11 -36
  351. package/dist/internal/calendar.js +1 -1
  352. package/dist/internal/chart-frame.d.ts +462 -0
  353. package/dist/internal/chart-frame.js +1 -0
  354. package/dist/internal/chart-line.d.ts +44 -0
  355. package/dist/internal/chart-line.js +1 -0
  356. package/dist/internal/chart.d.ts +551 -0
  357. package/dist/internal/chart.js +1 -0
  358. package/dist/internal/color-scheme.js +1 -1
  359. package/dist/internal/data-table.d.ts +70 -0
  360. package/dist/internal/data-table.js +1 -0
  361. package/dist/internal/date.d.ts +10 -0
  362. package/dist/internal/date.js +1 -1
  363. package/dist/internal/defaults.d.ts +8 -3
  364. package/dist/internal/drag.d.ts +65 -0
  365. package/dist/internal/drag.js +1 -0
  366. package/dist/internal/focusable.d.ts +8 -0
  367. package/dist/internal/focusable.js +1 -0
  368. package/dist/internal/form.d.ts +61 -0
  369. package/dist/internal/form.js +1 -0
  370. package/dist/internal/format.d.ts +2 -0
  371. package/dist/internal/format.js +1 -1
  372. package/dist/internal/gallery.d.ts +80 -0
  373. package/dist/internal/gallery.js +1 -0
  374. package/dist/internal/glow.d.ts +17 -0
  375. package/dist/internal/glow.js +1 -0
  376. package/dist/internal/grid.d.ts +6 -27
  377. package/dist/internal/grid.js +1 -1
  378. package/dist/internal/highlight.d.ts +98 -0
  379. package/dist/internal/highlight.js +1 -0
  380. package/dist/internal/icons.d.ts +10 -0
  381. package/dist/internal/icons.js +1 -1
  382. package/dist/internal/image.d.ts +94 -0
  383. package/dist/internal/image.js +1 -0
  384. package/dist/internal/inert.d.ts +19 -0
  385. package/dist/internal/inert.js +1 -0
  386. package/dist/internal/keys.d.ts +19 -0
  387. package/dist/internal/keys.js +1 -1
  388. package/dist/internal/labels.d.ts +182 -0
  389. package/dist/internal/labels.js +1 -0
  390. package/dist/internal/link.d.ts +17 -0
  391. package/dist/internal/link.js +1 -1
  392. package/dist/internal/mockup.d.ts +193 -0
  393. package/dist/internal/mockup.js +1 -0
  394. package/dist/internal/page-layout.d.ts +14 -7
  395. package/dist/internal/page-layout.js +1 -1
  396. package/dist/internal/picker.d.ts +43 -6
  397. package/dist/internal/picker.js +1 -1
  398. package/dist/internal/progress.d.ts +22 -8
  399. package/dist/internal/progress.js +1 -1
  400. package/dist/internal/responsive.d.ts +108 -0
  401. package/dist/internal/responsive.js +1 -0
  402. package/dist/internal/scramble.d.ts +35 -0
  403. package/dist/internal/scramble.js +1 -0
  404. package/dist/internal/scroll-target.d.ts +5 -0
  405. package/dist/internal/scroll-target.js +1 -0
  406. package/dist/internal/steps.js +1 -1
  407. package/dist/internal/styles.d.ts +81 -0
  408. package/dist/internal/styles.js +1 -1
  409. package/dist/internal/table.d.ts +86 -0
  410. package/dist/internal/table.js +1 -0
  411. package/dist/internal/text.d.ts +39 -0
  412. package/dist/internal/text.js +1 -0
  413. package/dist/internal/threshold.d.ts +19 -0
  414. package/dist/internal/threshold.js +1 -0
  415. package/dist/internal/tour.d.ts +42 -0
  416. package/dist/internal/tour.js +1 -0
  417. package/dist/internal/watermark.d.ts +44 -0
  418. package/dist/internal/watermark.js +1 -0
  419. package/dist/internal/wheel.d.ts +52 -0
  420. package/dist/internal/wheel.js +1 -0
  421. package/dist/internal/window.d.ts +201 -0
  422. package/dist/internal/window.js +1 -0
  423. package/dist/locales/de.d.ts +3 -0
  424. package/dist/locales/de.js +1 -0
  425. package/dist/locales/en.d.ts +2 -0
  426. package/dist/locales/en.js +1 -0
  427. package/dist/locales/es.d.ts +3 -0
  428. package/dist/locales/es.js +1 -0
  429. package/dist/locales/fr.d.ts +3 -0
  430. package/dist/locales/fr.js +1 -0
  431. package/dist/locales/index.d.ts +33 -0
  432. package/dist/locales/index.js +1 -0
  433. package/dist/locales/ja.d.ts +3 -0
  434. package/dist/locales/ja.js +1 -0
  435. package/dist/locales/ko.d.ts +3 -0
  436. package/dist/locales/ko.js +1 -0
  437. package/dist/locales/zh-Hans.d.ts +3 -0
  438. package/dist/locales/zh-Hans.js +1 -0
  439. package/dist/provider/PlColorSchemeScript.js +1 -1
  440. package/dist/provider/PlassProvider.js +1 -1
  441. package/dist/provider/index.d.ts +1 -0
  442. package/dist/provider/index.js +1 -1
  443. package/dist/styles.css +1 -1
  444. package/dist/tailwind.css +1357 -25
  445. package/dist/tokens.css +1357 -25
  446. package/dist/types.d.ts +368 -2
  447. package/package.json +26 -16
  448. package/dist/components/avatar-group/PlAvatarGroup.d.ts +0 -47
  449. package/dist/components/avatar-group/PlAvatarGroup.js +0 -1
  450. package/dist/components/avatar-group/index.d.ts +0 -2
  451. package/dist/components/avatar-group/index.js +0 -1
  452. package/dist/css/avatar-group.css +0 -2
  453. package/dist/internal/avatar-group.d.ts +0 -25
  454. package/dist/internal/avatar-group.js +0 -2
package/dist/tokens.css CHANGED
@@ -135,6 +135,43 @@
135
135
  --plass-info-on-solid: #ffffff;
136
136
  }
137
137
 
138
+ /* ---------------------------------------------------------------------------
139
+ * The breakpoint ladder
140
+ *
141
+ * Four widths, and **one place they are written down**. Everything in this
142
+ * library that changes with the width of the window reads them: the grid's
143
+ * `@variant` blocks below, the classes that keep a sidebar off a narrow screen,
144
+ * and the `matchMedia` queries `usePlBreakpoint` asks.
145
+ *
146
+ * They are Tailwind's own, which is the whole point — a layout decided by a
147
+ * `md:` utility and a layout decided by this library have to change at the same
148
+ * moment, or a page has two answers about how wide it is. So the source is
149
+ * Tailwind's `--breakpoint-*` theme, and a project that moves one moves both:
150
+ *
151
+ * @theme { --breakpoint-md: 50rem; }
152
+ *
153
+ * A media query's *condition* cannot read a custom property — `@media (width >=
154
+ * var(--x))` is not valid CSS and never will be — so the CSS half cannot follow
155
+ * a value set at runtime. It follows the theme at build time instead, through
156
+ * the `@variant` blocks, and these four tokens are how the **JavaScript** half
157
+ * reads the same answer: it is a value rather than a condition there, so it can
158
+ * be read off the document.
159
+ *
160
+ * The fallback is what makes them safe to read before Tailwind has resolved
161
+ * anything at all — a consumer on the precompiled `plass-ui/styles.css` has our
162
+ * values baked in, and these say what they are.
163
+ *
164
+ * Setting a `--plass-breakpoint-*` directly moves the JavaScript half **and not
165
+ * the CSS half**, which is almost never what anybody wants. Set Tailwind's.
166
+ * ------------------------------------------------------------------------- */
167
+
168
+ :root {
169
+ --plass-breakpoint-sm: var(--breakpoint-sm, 40rem);
170
+ --plass-breakpoint-md: var(--breakpoint-md, 48rem);
171
+ --plass-breakpoint-lg: var(--breakpoint-lg, 64rem);
172
+ --plass-breakpoint-xl: var(--breakpoint-xl, 80rem);
173
+ }
174
+
138
175
  /* ---------------------------------------------------------------------------
139
176
  * Light theme (default)
140
177
  *
@@ -268,6 +305,92 @@
268
305
  --plass-warning-accent: #96600c;
269
306
  --plass-danger-accent: #bb3339;
270
307
  --plass-info-accent: #1668ae;
308
+
309
+ /* Eight hues in a fixed order, and the one place in the library where a
310
+ colour is not a semantic role.
311
+
312
+ A series is an *entity* — a region, a plan, a competitor — and nothing
313
+ about it says success or danger. What the colour has to do is stay the same
314
+ colour when the chart is filtered, and be tellable apart from its
315
+ neighbours by every reader. So these are not the six families reused: those
316
+ were picked to mean something on a control, they are only six, and two of
317
+ them (`secondary`, `info`) sit close enough in hue that adjacent series
318
+ would collapse.
319
+
320
+ What the eight satisfy, measured against this file's own grounds rather
321
+ than asserted:
322
+
323
+ - every slot at 4:1 or better on white and 4.9:1 or better on the dark
324
+ sheet, so a 2px line is a line;
325
+ - adjacent pairs at least 10.4 apart in OKLab (×100) under simulated
326
+ protanopia and deuteranopia, which is the pair that touches in a stack
327
+ or a legend;
328
+ - chroma at or above 0.10, below which a hue reads as grey and stops
329
+ carrying identity at all.
330
+
331
+ The order is the mechanism, not a preference: slots are handed out in
332
+ sequence and never cycled, which is what keeps the *adjacent* pairs the
333
+ ones that were checked. A ninth series is not a ninth colour; it is an
334
+ "Other" row, or a second chart.
335
+
336
+ Slot one is the page's own `primary`, not a solved hue like the rest — a
337
+ one-series chart should look like it belongs to the page it is on. It is
338
+ the one slot louder than its neighbours (4.9:1 against their 4:1), and
339
+ that is the price. */
340
+ --plass-chart-1: #3f63f2;
341
+ --plass-chart-2: #cf5c00;
342
+ --plass-chart-3: #e23895;
343
+ --plass-chart-4: #997b00;
344
+ --plass-chart-5: #0288b8;
345
+ --plass-chart-6: #039227;
346
+ --plass-chart-7: #a657ed;
347
+ --plass-chart-8: #058f80;
348
+
349
+ /* The sequential ramp — one hue, light to dark, for a mark whose colour is a
350
+ *magnitude* rather than an identity.
351
+
352
+ A different job from the eight above and so a different set, not a subset
353
+ of them. The eight are solved to be as far apart as possible, which is
354
+ exactly what a magnitude must not be: a heatmap coloured from a categorical
355
+ ramp says its cells are five unrelated things. Here the order is the whole
356
+ meaning, so what is solved for is the opposite — one hue throughout,
357
+ lightness strictly falling, and the palest step still at 2.07:1 on the
358
+ sheet, because below that the low end of the scale reads as empty rather
359
+ than as small.
360
+
361
+ Five steps and not a continuous gradient, because a reader cannot rank a
362
+ continuum by eye and can rank five steps against a legend. */
363
+ --plass-chart-seq-1: #95b5ee;
364
+ --plass-chart-seq-2: #6e9aec;
365
+ --plass-chart-seq-3: #477ee8;
366
+ --plass-chart-seq-4: #2763d7;
367
+ --plass-chart-seq-5: #1346ab;
368
+
369
+ /* And the diverging ramp, for a value with a **middle** — a change against
370
+ last quarter, a temperature against the average. Two hues away from a pale
371
+ neutral, so which side of zero a cell is on is the first thing read and how
372
+ far from it the second. The neutral is not white: a cell at zero is a
373
+ reading, and a white cell is a hole in the grid. */
374
+ --plass-chart-div-1: #055d7e;
375
+ --plass-chart-div-2: #2095c5;
376
+ --plass-chart-div-3: #b1b4b9;
377
+ --plass-chart-div-4: #d4614c;
378
+ --plass-chart-div-5: #9a210c;
379
+
380
+ /* What is legible written *on* a ramp step, which flips partway down both.
381
+ A heatmap that writes its numbers in the cells needs this and nothing else
382
+ does. */
383
+ --plass-chart-seq-on-1: var(--plass-fg);
384
+ --plass-chart-seq-on-2: var(--plass-fg);
385
+ --plass-chart-seq-on-3: var(--plass-fg);
386
+ --plass-chart-seq-on-4: var(--plass-surface);
387
+ --plass-chart-seq-on-5: var(--plass-surface);
388
+
389
+ --plass-chart-div-on-1: var(--plass-surface);
390
+ --plass-chart-div-on-2: var(--plass-fg);
391
+ --plass-chart-div-on-3: var(--plass-fg);
392
+ --plass-chart-div-on-4: var(--plass-fg);
393
+ --plass-chart-div-on-5: var(--plass-surface);
271
394
  }
272
395
 
273
396
  /* ---------------------------------------------------------------------------
@@ -322,6 +445,39 @@
322
445
  --plass-warning-accent: #f2b74e;
323
446
  --plass-danger-accent: #ff8a8f;
324
447
  --plass-info-accent: #5fb4ee;
448
+
449
+ --plass-chart-1: #93a8ff;
450
+ --plass-chart-2: #e66700;
451
+ --plass-chart-3: #ef45a0;
452
+ --plass-chart-4: #b08e05;
453
+ --plass-chart-5: #049fd6;
454
+ --plass-chart-6: #07b031;
455
+ --plass-chart-7: #b264fb;
456
+ --plass-chart-8: #02a998;
457
+
458
+ --plass-chart-seq-1: #294c91;
459
+ --plass-chart-seq-2: #3263c3;
460
+ --plass-chart-seq-3: #3f7cf3;
461
+ --plass-chart-seq-4: #6a9cfb;
462
+ --plass-chart-seq-5: #9ebef8;
463
+
464
+ --plass-chart-div-1: #066082;
465
+ --plass-chart-div-2: #0892c4;
466
+ --plass-chart-div-3: #aeb1b6;
467
+ --plass-chart-div-4: #d15e49;
468
+ --plass-chart-div-5: #9a2b19;
469
+
470
+ --plass-chart-seq-on-1: var(--plass-fg);
471
+ --plass-chart-seq-on-2: var(--plass-fg);
472
+ --plass-chart-seq-on-3: var(--plass-surface);
473
+ --plass-chart-seq-on-4: var(--plass-surface);
474
+ --plass-chart-seq-on-5: var(--plass-surface);
475
+
476
+ --plass-chart-div-on-1: var(--plass-fg);
477
+ --plass-chart-div-on-2: var(--plass-surface);
478
+ --plass-chart-div-on-3: var(--plass-surface);
479
+ --plass-chart-div-on-4: var(--plass-surface);
480
+ --plass-chart-div-on-5: var(--plass-fg);
325
481
  }
326
482
  }
327
483
 
@@ -366,6 +522,39 @@
366
522
  --plass-warning-accent: #f2b74e;
367
523
  --plass-danger-accent: #ff8a8f;
368
524
  --plass-info-accent: #5fb4ee;
525
+
526
+ --plass-chart-1: #93a8ff;
527
+ --plass-chart-2: #e66700;
528
+ --plass-chart-3: #ef45a0;
529
+ --plass-chart-4: #b08e05;
530
+ --plass-chart-5: #049fd6;
531
+ --plass-chart-6: #07b031;
532
+ --plass-chart-7: #b264fb;
533
+ --plass-chart-8: #02a998;
534
+
535
+ --plass-chart-seq-1: #294c91;
536
+ --plass-chart-seq-2: #3263c3;
537
+ --plass-chart-seq-3: #3f7cf3;
538
+ --plass-chart-seq-4: #6a9cfb;
539
+ --plass-chart-seq-5: #9ebef8;
540
+
541
+ --plass-chart-div-1: #066082;
542
+ --plass-chart-div-2: #0892c4;
543
+ --plass-chart-div-3: #aeb1b6;
544
+ --plass-chart-div-4: #d15e49;
545
+ --plass-chart-div-5: #9a2b19;
546
+
547
+ --plass-chart-seq-on-1: var(--plass-fg);
548
+ --plass-chart-seq-on-2: var(--plass-fg);
549
+ --plass-chart-seq-on-3: var(--plass-surface);
550
+ --plass-chart-seq-on-4: var(--plass-surface);
551
+ --plass-chart-seq-on-5: var(--plass-surface);
552
+
553
+ --plass-chart-div-on-1: var(--plass-fg);
554
+ --plass-chart-div-on-2: var(--plass-surface);
555
+ --plass-chart-div-on-3: var(--plass-surface);
556
+ --plass-chart-div-on-4: var(--plass-surface);
557
+ --plass-chart-div-on-5: var(--plass-fg);
369
558
  }
370
559
 
371
560
  /* ---------------------------------------------------------------------------
@@ -422,7 +611,11 @@
422
611
  --plass-primary-soft-press: color-mix(in srgb, var(--plass-primary-accent) 26%, transparent);
423
612
  --plass-primary-line: color-mix(in srgb, var(--plass-primary-accent) 30%, transparent);
424
613
  --plass-primary-line-hover: color-mix(in srgb, var(--plass-primary-accent) 48%, transparent);
425
- --plass-primary-ring: color-mix(in srgb, var(--plass-primary-solid) 55%, transparent);
614
+ /* The focus ring is the accent at full strength, because it is read against
615
+ the page rather than looked at: the ring has to clear 3:1 against the
616
+ sheet round a control in both themes, and only the per-theme accent does.
617
+ `solid` is one colour for both, and amber on white cannot reach it. */
618
+ --plass-primary-ring: var(--plass-primary-accent);
426
619
 
427
620
  --plass-secondary-fill: linear-gradient(
428
621
  135deg,
@@ -439,7 +632,7 @@
439
632
  --plass-secondary-soft-press: color-mix(in srgb, var(--plass-secondary-accent) 26%, transparent);
440
633
  --plass-secondary-line: color-mix(in srgb, var(--plass-secondary-accent) 30%, transparent);
441
634
  --plass-secondary-line-hover: color-mix(in srgb, var(--plass-secondary-accent) 48%, transparent);
442
- --plass-secondary-ring: color-mix(in srgb, var(--plass-secondary-solid) 55%, transparent);
635
+ --plass-secondary-ring: var(--plass-secondary-accent);
443
636
 
444
637
  --plass-success-fill: linear-gradient(
445
638
  135deg,
@@ -456,7 +649,7 @@
456
649
  --plass-success-soft-press: color-mix(in srgb, var(--plass-success-accent) 26%, transparent);
457
650
  --plass-success-line: color-mix(in srgb, var(--plass-success-accent) 30%, transparent);
458
651
  --plass-success-line-hover: color-mix(in srgb, var(--plass-success-accent) 48%, transparent);
459
- --plass-success-ring: color-mix(in srgb, var(--plass-success-solid) 55%, transparent);
652
+ --plass-success-ring: var(--plass-success-accent);
460
653
 
461
654
  --plass-warning-fill: linear-gradient(
462
655
  135deg,
@@ -473,7 +666,7 @@
473
666
  --plass-warning-soft-press: color-mix(in srgb, var(--plass-warning-accent) 28%, transparent);
474
667
  --plass-warning-line: color-mix(in srgb, var(--plass-warning-accent) 34%, transparent);
475
668
  --plass-warning-line-hover: color-mix(in srgb, var(--plass-warning-accent) 52%, transparent);
476
- --plass-warning-ring: color-mix(in srgb, var(--plass-warning-solid) 55%, transparent);
669
+ --plass-warning-ring: var(--plass-warning-accent);
477
670
 
478
671
  --plass-danger-fill: linear-gradient(
479
672
  135deg,
@@ -490,7 +683,7 @@
490
683
  --plass-danger-soft-press: color-mix(in srgb, var(--plass-danger-accent) 26%, transparent);
491
684
  --plass-danger-line: color-mix(in srgb, var(--plass-danger-accent) 30%, transparent);
492
685
  --plass-danger-line-hover: color-mix(in srgb, var(--plass-danger-accent) 48%, transparent);
493
- --plass-danger-ring: color-mix(in srgb, var(--plass-danger-solid) 55%, transparent);
686
+ --plass-danger-ring: var(--plass-danger-accent);
494
687
 
495
688
  --plass-info-fill: linear-gradient(
496
689
  135deg,
@@ -507,7 +700,25 @@
507
700
  --plass-info-soft-press: color-mix(in srgb, var(--plass-info-accent) 26%, transparent);
508
701
  --plass-info-line: color-mix(in srgb, var(--plass-info-accent) 30%, transparent);
509
702
  --plass-info-line-hover: color-mix(in srgb, var(--plass-info-accent) 48%, transparent);
510
- --plass-info-ring: color-mix(in srgb, var(--plass-info-solid) 55%, transparent);
703
+ --plass-info-ring: var(--plass-info-accent);
704
+ /* The three greys a chart draws its frame with, derived so a project that
705
+ re-tones its border moves the grid with it.
706
+
707
+ The grid is the faintest thing on the plot on purpose: a gridline that
708
+ competes with a data line is a reader deciding which is which. The axis is
709
+ the border at full strength, because it is the edge of the picture rather
710
+ than a reading. And the baseline is allowed to be darker than either — it
711
+ is where a bar starts from and where zero is, which is a fact about the
712
+ data rather than furniture. */
713
+ --plass-chart-grid: color-mix(in srgb, var(--plass-border) 70%, transparent);
714
+ --plass-chart-axis: var(--plass-border);
715
+ --plass-chart-baseline: color-mix(in srgb, var(--plass-muted-fg) 35%, transparent);
716
+ /* And the sheet itself, for the 2px between two marks that touch — a
717
+ marker's ring, the seam between two stacked bands, the halo round a
718
+ scatter's dot. It is the surface and not a stroke, because a coloured line
719
+ drawn between two marks is ink that is not data; what separates them is the
720
+ page showing through. */
721
+ --plass-chart-gap: var(--plass-surface);
511
722
  }
512
723
 
513
724
  /* ---------------------------------------------------------------------------
@@ -803,7 +1014,152 @@
803
1014
  }
804
1015
 
805
1016
  /* ---------------------------------------------------------------------------
806
- * The grid
1017
+ * A strip that runs off the end of its own box
1018
+ *
1019
+ * A row that scrolls has to say so, and on a Mac it cannot: the scrollbar is an
1020
+ * overlay that appears while the strip is moving and is invisible the rest of
1021
+ * the time, which is every moment a reader is deciding whether there is
1022
+ * anything more to look at. On Windows the same bar is fifteen pixels of
1023
+ * permanent furniture under a row of tab labels. Neither is a signal, so both
1024
+ * are taken away and the ends are faded instead — and *only* the end that still
1025
+ * has something behind it, which is the part that makes it a signal rather than
1026
+ * a decoration.
1027
+ *
1028
+ * The fade is a `mask-image` rather than two gradient overlays because a bar
1029
+ * can sit on anything. An overlay has to be painted in the colour of whatever
1030
+ * is behind the strip, and a component does not know that: a `PlTabs` inside a
1031
+ * `PlCard` inside a tinted section has three candidate backgrounds and no way
1032
+ * to choose. A mask takes the pixels away instead, so whatever is behind shows
1033
+ * through and the answer is right on every surface.
1034
+ *
1035
+ * The two lengths are per-instance slots because *which* end fades is measured
1036
+ * rather than declared — it depends on how far along the strip is, which no
1037
+ * prop can know. `0px` on both ends is a gradient with no transition in it at
1038
+ * all, so a strip that fits is not paying for a mask it does not need.
1039
+ *
1040
+ * They are physical (`left`, `right`) while the state the component publishes
1041
+ * is logical, and the split is the same one `PlTabs` already makes for its
1042
+ * indicator: a CSS gradient runs in a physical direction and a reader runs in
1043
+ * a writing direction, so the measurement is turned round once, here, rather
1044
+ * than in four places that could disagree.
1045
+ *
1046
+ * The mask is dropped entirely while something inside holds a visible focus
1047
+ * ring. Focusing a tab scrolls it flush against the edge it came from, which is
1048
+ * exactly where the fade is strongest — so the one control whose outline has to
1049
+ * be legible would be the one drawn half transparent. `:focus-visible` and not
1050
+ * `:focus-within`: a tab that was clicked has the focus and no ring, and a bar
1051
+ * that stopped fading for the rest of the session because somebody pressed a
1052
+ * tab would have lost the signal at the first interaction.
1053
+ * ------------------------------------------------------------------------- */
1054
+
1055
+ .plass-fade-x {
1056
+ --p-fade: 1.5rem;
1057
+
1058
+ scrollbar-width: none;
1059
+ mask-image: linear-gradient(
1060
+ to right,
1061
+ transparent,
1062
+ #000 var(--p-fade-left, 0px),
1063
+ #000 calc(100% - var(--p-fade-right, 0px)),
1064
+ transparent
1065
+ );
1066
+ }
1067
+
1068
+ .plass-fade-x::-webkit-scrollbar {
1069
+ display: none;
1070
+ }
1071
+
1072
+ .plass-fade-x:has(:focus-visible) {
1073
+ mask-image: none;
1074
+ }
1075
+
1076
+ /* ---------------------------------------------------------------------------
1077
+ * Showing something at some widths and not others
1078
+ *
1079
+ * `PlShow`, and the reason it is CSS rather than a `useMediaQuery` and a
1080
+ * ternary. A media query answered in JavaScript is `false` on a server and on
1081
+ * the first frame a browser renders, so a JavaScript gate draws the wrong half
1082
+ * and then throws it away — a flash on every page load rather than an edge
1083
+ * case. The stylesheet knows the width before React has been asked anything.
1084
+ *
1085
+ * `display: contents` while it is showing, so the element is **not a box**: its
1086
+ * children take part in the parent's layout exactly as they would have without
1087
+ * it, and a gate inside a flex row does not become a flex item. `display: none`
1088
+ * is what hides, which also takes the subtree off the accessibility tree — a
1089
+ * gate that only moved it off screen would leave a screen reader reading both
1090
+ * halves of a responsive layout.
1091
+ *
1092
+ * Attribute selectors rather than Tailwind's `max-md:hidden`, and that is not a
1093
+ * preference: the real classes in this file are emitted *after* the utilities so
1094
+ * they can outrank them, which would make a `display: contents` here beat the
1095
+ * very variant meant to hide it. Nine rules that only fight each other are
1096
+ * simpler than one that has to win a sort it does not control.
1097
+ *
1098
+ * Both bounds at once is `[data-from]` and `[data-until]` on one element, and
1099
+ * it resolves by source order: the `from` rules come first, so a rung at or
1100
+ * above `until` is hidden by the later rule whatever `from` said.
1101
+ * ------------------------------------------------------------------------- */
1102
+
1103
+ .plass-show {
1104
+ display: contents;
1105
+ }
1106
+
1107
+ /* Below its floor, a gate with a `from` is closed. Each rung then opens it. */
1108
+ .plass-show[data-from] {
1109
+ display: none;
1110
+ }
1111
+
1112
+ @variant sm {
1113
+ .plass-show[data-from='sm'] {
1114
+ display: contents;
1115
+ }
1116
+ }
1117
+
1118
+ @variant md {
1119
+ .plass-show[data-from='md'] {
1120
+ display: contents;
1121
+ }
1122
+ }
1123
+
1124
+ @variant lg {
1125
+ .plass-show[data-from='lg'] {
1126
+ display: contents;
1127
+ }
1128
+ }
1129
+
1130
+ @variant xl {
1131
+ .plass-show[data-from='xl'] {
1132
+ display: contents;
1133
+ }
1134
+ }
1135
+
1136
+ /* And `until` closes it again from its own rung up. */
1137
+ @variant sm {
1138
+ .plass-show[data-until='sm'] {
1139
+ display: none;
1140
+ }
1141
+ }
1142
+
1143
+ @variant md {
1144
+ .plass-show[data-until='md'] {
1145
+ display: none;
1146
+ }
1147
+ }
1148
+
1149
+ @variant lg {
1150
+ .plass-show[data-until='lg'] {
1151
+ display: none;
1152
+ }
1153
+ }
1154
+
1155
+ @variant xl {
1156
+ .plass-show[data-until='xl'] {
1157
+ display: none;
1158
+ }
1159
+ }
1160
+
1161
+ /* ---------------------------------------------------------------------------
1162
+ * The grid, and the responsive slots
807
1163
  *
808
1164
  * `PlGrid` is a flex row and `PlGridItem` is a width in it, which is the shape
809
1165
  * a twelve-column grid has had since long before CSS had one of its own — and
@@ -825,16 +1181,233 @@
825
1181
  * chains get long at `xl`; that is the cost of keeping the DOM lean, and it is
826
1182
  * paid once here rather than on every grid item in a consumer's app.
827
1183
  *
828
- * The widths are Tailwind's own breakpoints, so a Plass grid and an `md:`
829
- * utility change at the same moment.
1184
+ * The widths are Tailwind's own breakpoints — `@variant` rather than a written
1185
+ * out `@media`, so a project that moves one in its theme moves this with it.
1186
+ * See "The breakpoint ladder" above.
1187
+ *
1188
+ * `.plass-container`'s measure and `.plass-flex`'s axis ride the same four
1189
+ * blocks, and any responsive prop added later should too. That is the whole
1190
+ * cost of one: a slot in `internal/responsive.ts` and four lines here. CSS has
1191
+ * no loop, so four lines is the floor — which is the reason to keep the number
1192
+ * of responsive props deliberate rather than to make every prop responsive
1193
+ * because it could be.
1194
+ *
1195
+ * The two gutters are declared for `.plass-grid` and `.plass-flex` together.
1196
+ * They are one question asked by two components — the space *between* the
1197
+ * things in a box — and a second copy of the chain is a second place for it to
1198
+ * drift.
830
1199
  * ------------------------------------------------------------------------- */
831
1200
 
832
- .plass-grid {
833
- --p-cols: var(--p-cols-xs, 12);
1201
+ /*
1202
+ * The per-breakpoint slots do not inherit. Each one is written inline on the
1203
+ * element that reads it, and a custom property is inherited by default, so a
1204
+ * `PlFlex` nested in another took every rung its parent named and it did not:
1205
+ * a vertical flex inside `{ xs: 'vertical', md: 'horizontal' }` turned
1206
+ * horizontal at `md`, and a `PlGridItem` with no `span` inside a cell of eight
1207
+ * was eight columns wide. The slots they resolve into (`--p-cols`, `--p-gap-x`)
1208
+ * still inherit, which is how a grid item reads its grid.
1209
+ */
1210
+ @property --p-gap-x-xs {
1211
+ syntax: '*';
1212
+ inherits: false;
1213
+ }
1214
+
1215
+ @property --p-gap-x-sm {
1216
+ syntax: '*';
1217
+ inherits: false;
1218
+ }
1219
+
1220
+ @property --p-gap-x-md {
1221
+ syntax: '*';
1222
+ inherits: false;
1223
+ }
1224
+
1225
+ @property --p-gap-x-lg {
1226
+ syntax: '*';
1227
+ inherits: false;
1228
+ }
1229
+
1230
+ @property --p-gap-x-xl {
1231
+ syntax: '*';
1232
+ inherits: false;
1233
+ }
1234
+
1235
+ @property --p-gap-y-xs {
1236
+ syntax: '*';
1237
+ inherits: false;
1238
+ }
1239
+
1240
+ @property --p-gap-y-sm {
1241
+ syntax: '*';
1242
+ inherits: false;
1243
+ }
1244
+
1245
+ @property --p-gap-y-md {
1246
+ syntax: '*';
1247
+ inherits: false;
1248
+ }
1249
+
1250
+ @property --p-gap-y-lg {
1251
+ syntax: '*';
1252
+ inherits: false;
1253
+ }
1254
+
1255
+ @property --p-gap-y-xl {
1256
+ syntax: '*';
1257
+ inherits: false;
1258
+ }
1259
+
1260
+ @property --p-cols-xs {
1261
+ syntax: '*';
1262
+ inherits: false;
1263
+ }
1264
+
1265
+ @property --p-cols-sm {
1266
+ syntax: '*';
1267
+ inherits: false;
1268
+ }
1269
+
1270
+ @property --p-cols-md {
1271
+ syntax: '*';
1272
+ inherits: false;
1273
+ }
1274
+
1275
+ @property --p-cols-lg {
1276
+ syntax: '*';
1277
+ inherits: false;
1278
+ }
1279
+
1280
+ @property --p-cols-xl {
1281
+ syntax: '*';
1282
+ inherits: false;
1283
+ }
1284
+
1285
+ @property --p-dir-xs {
1286
+ syntax: '*';
1287
+ inherits: false;
1288
+ }
1289
+
1290
+ @property --p-dir-sm {
1291
+ syntax: '*';
1292
+ inherits: false;
1293
+ }
1294
+
1295
+ @property --p-dir-md {
1296
+ syntax: '*';
1297
+ inherits: false;
1298
+ }
1299
+
1300
+ @property --p-dir-lg {
1301
+ syntax: '*';
1302
+ inherits: false;
1303
+ }
1304
+
1305
+ @property --p-dir-xl {
1306
+ syntax: '*';
1307
+ inherits: false;
1308
+ }
1309
+
1310
+ @property --p-span-xs {
1311
+ syntax: '*';
1312
+ inherits: false;
1313
+ }
1314
+
1315
+ @property --p-span-sm {
1316
+ syntax: '*';
1317
+ inherits: false;
1318
+ }
1319
+
1320
+ @property --p-span-md {
1321
+ syntax: '*';
1322
+ inherits: false;
1323
+ }
1324
+
1325
+ @property --p-span-lg {
1326
+ syntax: '*';
1327
+ inherits: false;
1328
+ }
1329
+
1330
+ @property --p-span-xl {
1331
+ syntax: '*';
1332
+ inherits: false;
1333
+ }
1334
+
1335
+ @property --p-offset-xs {
1336
+ syntax: '*';
1337
+ inherits: false;
1338
+ }
1339
+
1340
+ @property --p-offset-sm {
1341
+ syntax: '*';
1342
+ inherits: false;
1343
+ }
1344
+
1345
+ @property --p-offset-md {
1346
+ syntax: '*';
1347
+ inherits: false;
1348
+ }
1349
+
1350
+ @property --p-offset-lg {
1351
+ syntax: '*';
1352
+ inherits: false;
1353
+ }
1354
+
1355
+ @property --p-offset-xl {
1356
+ syntax: '*';
1357
+ inherits: false;
1358
+ }
1359
+
1360
+ @property --p-maxw-xs {
1361
+ syntax: '*';
1362
+ inherits: false;
1363
+ }
1364
+
1365
+ @property --p-maxw-sm {
1366
+ syntax: '*';
1367
+ inherits: false;
1368
+ }
1369
+
1370
+ @property --p-maxw-md {
1371
+ syntax: '*';
1372
+ inherits: false;
1373
+ }
1374
+
1375
+ @property --p-maxw-lg {
1376
+ syntax: '*';
1377
+ inherits: false;
1378
+ }
1379
+
1380
+ @property --p-maxw-xl {
1381
+ syntax: '*';
1382
+ inherits: false;
1383
+ }
1384
+
1385
+ .plass-grid,
1386
+ .plass-flex {
834
1387
  --p-gap-x: var(--p-gap-x-xs, 0px);
835
1388
  --p-gap-y: var(--p-gap-y-xs, 0px);
836
1389
  }
837
1390
 
1391
+ .plass-grid {
1392
+ --p-cols: var(--p-cols-xs, 12);
1393
+ }
1394
+
1395
+ .plass-gallery {
1396
+ --p-cols: var(--p-cols-xs, 2);
1397
+ }
1398
+
1399
+ /*
1400
+ * `PlFlex`'s axis. One slot rather than two, because `reverse` is not
1401
+ * responsive and the direction is: the component folds the two into the four
1402
+ * values `flex-direction` takes, so a breakpoint changes the axis without
1403
+ * having to restate which end it starts from.
1404
+ */
1405
+ .plass-flex {
1406
+ --p-dir: var(--p-dir-xs, row);
1407
+
1408
+ flex-direction: var(--p-dir);
1409
+ }
1410
+
838
1411
  .plass-grid-item {
839
1412
  --p-span: var(--p-span-xs, var(--p-cols, 12));
840
1413
  --p-offset: var(--p-offset-xs, 0);
@@ -853,39 +1426,102 @@
853
1426
  margin-inline-start: calc(var(--p-track) * min(var(--p-offset), var(--p-cols, 12)));
854
1427
  }
855
1428
 
856
- @media (width >= 40rem) {
857
- .plass-grid {
858
- --p-cols: var(--p-cols-sm, var(--p-cols-xs, 12));
1429
+ /*
1430
+ * The measure, and the one thing a container draws.
1431
+ *
1432
+ * A slot rather than five `max-w-*` classes, because a responsive measure would
1433
+ * otherwise be five classes times five rungs. It also takes any length a caller
1434
+ * writes, which the class ladder could not: `maxWidth="72ch"` is a measure in
1435
+ * characters, and a measure in characters is the one a paragraph actually
1436
+ * wants.
1437
+ */
1438
+ .plass-container {
1439
+ --p-maxw: var(--p-maxw-xs, none);
1440
+
1441
+ max-width: var(--p-maxw);
1442
+ }
1443
+
1444
+ @variant sm {
1445
+ .plass-container {
1446
+ --p-maxw: var(--p-maxw-sm, var(--p-maxw-xs, none));
1447
+ }
1448
+
1449
+ .plass-grid,
1450
+ .plass-flex {
859
1451
  --p-gap-x: var(--p-gap-x-sm, var(--p-gap-x-xs, 0px));
860
1452
  --p-gap-y: var(--p-gap-y-sm, var(--p-gap-y-xs, 0px));
861
1453
  }
862
1454
 
1455
+ .plass-grid {
1456
+ --p-cols: var(--p-cols-sm, var(--p-cols-xs, 12));
1457
+ }
1458
+
1459
+ .plass-gallery {
1460
+ --p-cols: var(--p-cols-sm, var(--p-cols-xs, 2));
1461
+ }
1462
+
1463
+ .plass-flex {
1464
+ --p-dir: var(--p-dir-sm, var(--p-dir-xs, row));
1465
+ }
1466
+
863
1467
  .plass-grid-item {
864
1468
  --p-span: var(--p-span-sm, var(--p-span-xs, var(--p-cols, 12)));
865
1469
  --p-offset: var(--p-offset-sm, var(--p-offset-xs, 0));
866
1470
  }
867
1471
  }
868
1472
 
869
- @media (width >= 48rem) {
870
- .plass-grid {
871
- --p-cols: var(--p-cols-md, var(--p-cols-sm, var(--p-cols-xs, 12)));
1473
+ @variant md {
1474
+ .plass-container {
1475
+ --p-maxw: var(--p-maxw-md, var(--p-maxw-sm, var(--p-maxw-xs, none)));
1476
+ }
1477
+
1478
+ .plass-grid,
1479
+ .plass-flex {
872
1480
  --p-gap-x: var(--p-gap-x-md, var(--p-gap-x-sm, var(--p-gap-x-xs, 0px)));
873
1481
  --p-gap-y: var(--p-gap-y-md, var(--p-gap-y-sm, var(--p-gap-y-xs, 0px)));
874
1482
  }
875
1483
 
1484
+ .plass-grid {
1485
+ --p-cols: var(--p-cols-md, var(--p-cols-sm, var(--p-cols-xs, 12)));
1486
+ }
1487
+
1488
+ .plass-gallery {
1489
+ --p-cols: var(--p-cols-md, var(--p-cols-sm, var(--p-cols-xs, 2)));
1490
+ }
1491
+
1492
+ .plass-flex {
1493
+ --p-dir: var(--p-dir-md, var(--p-dir-sm, var(--p-dir-xs, row)));
1494
+ }
1495
+
876
1496
  .plass-grid-item {
877
1497
  --p-span: var(--p-span-md, var(--p-span-sm, var(--p-span-xs, var(--p-cols, 12))));
878
1498
  --p-offset: var(--p-offset-md, var(--p-offset-sm, var(--p-offset-xs, 0)));
879
1499
  }
880
1500
  }
881
1501
 
882
- @media (width >= 64rem) {
883
- .plass-grid {
884
- --p-cols: var(--p-cols-lg, var(--p-cols-md, var(--p-cols-sm, var(--p-cols-xs, 12))));
1502
+ @variant lg {
1503
+ .plass-container {
1504
+ --p-maxw: var(--p-maxw-lg, var(--p-maxw-md, var(--p-maxw-sm, var(--p-maxw-xs, none))));
1505
+ }
1506
+
1507
+ .plass-grid,
1508
+ .plass-flex {
885
1509
  --p-gap-x: var(--p-gap-x-lg, var(--p-gap-x-md, var(--p-gap-x-sm, var(--p-gap-x-xs, 0px))));
886
1510
  --p-gap-y: var(--p-gap-y-lg, var(--p-gap-y-md, var(--p-gap-y-sm, var(--p-gap-y-xs, 0px))));
887
1511
  }
888
1512
 
1513
+ .plass-grid {
1514
+ --p-cols: var(--p-cols-lg, var(--p-cols-md, var(--p-cols-sm, var(--p-cols-xs, 12))));
1515
+ }
1516
+
1517
+ .plass-gallery {
1518
+ --p-cols: var(--p-cols-lg, var(--p-cols-md, var(--p-cols-sm, var(--p-cols-xs, 2))));
1519
+ }
1520
+
1521
+ .plass-flex {
1522
+ --p-dir: var(--p-dir-lg, var(--p-dir-md, var(--p-dir-sm, var(--p-dir-xs, row))));
1523
+ }
1524
+
889
1525
  .plass-grid-item {
890
1526
  --p-span: var(
891
1527
  --p-span-lg,
@@ -895,12 +1531,16 @@
895
1531
  }
896
1532
  }
897
1533
 
898
- @media (width >= 80rem) {
899
- .plass-grid {
900
- --p-cols: var(
901
- --p-cols-xl,
902
- var(--p-cols-lg, var(--p-cols-md, var(--p-cols-sm, var(--p-cols-xs, 12))))
1534
+ @variant xl {
1535
+ .plass-container {
1536
+ --p-maxw: var(
1537
+ --p-maxw-xl,
1538
+ var(--p-maxw-lg, var(--p-maxw-md, var(--p-maxw-sm, var(--p-maxw-xs, none))))
903
1539
  );
1540
+ }
1541
+
1542
+ .plass-grid,
1543
+ .plass-flex {
904
1544
  --p-gap-x: var(
905
1545
  --p-gap-x-xl,
906
1546
  var(--p-gap-x-lg, var(--p-gap-x-md, var(--p-gap-x-sm, var(--p-gap-x-xs, 0px))))
@@ -911,6 +1551,27 @@
911
1551
  );
912
1552
  }
913
1553
 
1554
+ .plass-grid {
1555
+ --p-cols: var(
1556
+ --p-cols-xl,
1557
+ var(--p-cols-lg, var(--p-cols-md, var(--p-cols-sm, var(--p-cols-xs, 12))))
1558
+ );
1559
+ }
1560
+
1561
+ .plass-gallery {
1562
+ --p-cols: var(
1563
+ --p-cols-xl,
1564
+ var(--p-cols-lg, var(--p-cols-md, var(--p-cols-sm, var(--p-cols-xs, 2))))
1565
+ );
1566
+ }
1567
+
1568
+ .plass-flex {
1569
+ --p-dir: var(
1570
+ --p-dir-xl,
1571
+ var(--p-dir-lg, var(--p-dir-md, var(--p-dir-sm, var(--p-dir-xs, row))))
1572
+ );
1573
+ }
1574
+
914
1575
  .plass-grid-item {
915
1576
  --p-span: var(
916
1577
  --p-span-xl,
@@ -960,6 +1621,34 @@
960
1621
  animation-play-state: var(--p-anim-state, running);
961
1622
  }
962
1623
 
1624
+ /*
1625
+ * `timeline="view"`, and the whole of it.
1626
+ *
1627
+ * Two declarations give **every** keyframe in this file a scroll-linked mode:
1628
+ * the effect stops being a thing that happens at a moment and becomes a thing
1629
+ * that tracks where the element is in the scrollport. There is no component for
1630
+ * it and there should not be, because there is nothing a component would add —
1631
+ * an effect already knows what it draws, and this only changes what advances
1632
+ * it.
1633
+ *
1634
+ * `@supports` is not optional. `animation-timeline` is progressively enhanced
1635
+ * and an engine that does not know the property would drop these two lines but
1636
+ * keep the `animation-duration` above, which is the *right* fallback: a clock
1637
+ * plays the effect once and the content arrives. Handing an unsupported browser
1638
+ * a timeline it cannot resolve is what would leave a blank page. Degraded is
1639
+ * allowed; blank is not.
1640
+ *
1641
+ * The slots are only filled when a caller asks for `view`, so the default costs
1642
+ * nothing at all: `auto` is what the property already resolves to, and writing
1643
+ * it into a hundred inline styles would be a hundred copies of the same answer.
1644
+ */
1645
+ @supports (animation-timeline: view()) {
1646
+ .plass-anim {
1647
+ animation-timeline: var(--p-anim-timeline, auto);
1648
+ animation-range: var(--p-anim-range, normal);
1649
+ }
1650
+ }
1651
+
963
1652
  @keyframes plass-anim-fade {
964
1653
  from {
965
1654
  opacity: var(--p-anim-opacity, 0);
@@ -990,6 +1679,36 @@
990
1679
  animation-name: plass-anim-scale;
991
1680
  }
992
1681
 
1682
+ /*
1683
+ * The one entrance that moves nothing and changes no colour.
1684
+ *
1685
+ * `clip-path` rather than a mask or an `overflow` box, and the choice is worth
1686
+ * writing down because the alternatives look equivalent. A mask needs a
1687
+ * gradient that has to be kept in step with the direction; an `overflow`
1688
+ * wrapper puts a second element into the layout, which is exactly what an
1689
+ * effect for something whose *position* is the information must not do. And
1690
+ * `inset(0)` already means "nothing is cut off", so the to-state is the
1691
+ * element's own natural one rather than a number that has to be chosen.
1692
+ *
1693
+ * The opacity slot defaults to `1` here and to `0` everywhere else in this
1694
+ * file. A reveal is not a fade — the whole reason to reach for it is that the
1695
+ * ink does not change — so fading is opt-in rather than something to turn off.
1696
+ */
1697
+ @keyframes plass-anim-reveal {
1698
+ from {
1699
+ opacity: var(--p-anim-opacity, 1);
1700
+ clip-path: var(--p-anim-clip, inset(0 100% 0 0));
1701
+ }
1702
+ to {
1703
+ opacity: 1;
1704
+ clip-path: inset(0);
1705
+ }
1706
+ }
1707
+
1708
+ .plass-anim-reveal {
1709
+ animation-name: plass-anim-reveal;
1710
+ }
1711
+
993
1712
  @keyframes plass-anim-slide {
994
1713
  from {
995
1714
  opacity: var(--p-anim-opacity, 0);
@@ -1038,6 +1757,67 @@
1038
1757
  animation-name: plass-anim-blink;
1039
1758
  }
1040
1759
 
1760
+ /*
1761
+ * A refusal.
1762
+ *
1763
+ * Three shudders either side of home and back to nothing, so an element that
1764
+ * has been shaken is exactly where it was — this is the one effect in the file
1765
+ * that a caller will run over content that is still being typed into, and a
1766
+ * field left a few pixels off its label would be worse than the error it was
1767
+ * reporting.
1768
+ *
1769
+ * Not one of the entrances, and not in `PlassAnimation`, for `plass-anim-float`'s
1770
+ * reason: that union is the set of ways content can *arrive*, and a response to
1771
+ * something a reader did is not an arrival.
1772
+ */
1773
+ @keyframes plass-anim-shake {
1774
+ 0%,
1775
+ 100% {
1776
+ translate: 0 0;
1777
+ }
1778
+ 15%,
1779
+ 45%,
1780
+ 75% {
1781
+ translate: calc(var(--p-anim-x, 6px) * -1) 0;
1782
+ }
1783
+ 30%,
1784
+ 60%,
1785
+ 90% {
1786
+ translate: var(--p-anim-x, 6px) 0;
1787
+ }
1788
+ }
1789
+
1790
+ .plass-anim-shake {
1791
+ animation-name: plass-anim-shake;
1792
+ }
1793
+
1794
+ /*
1795
+ * An endless drift.
1796
+ *
1797
+ * Symmetric like the blink above and for the same reason: however many times it
1798
+ * runs it ends where it started, so a float that was stopped mid-cycle does not
1799
+ * leave the element permanently a few pixels out of place.
1800
+ *
1801
+ * It is **not** one of the entrances, and it is not in `PlassAnimation` either.
1802
+ * That union is the set of ways content can *arrive*, and every component
1803
+ * importing the map that backs it pays for each row whether it uses it or not;
1804
+ * a drift that never finishes is not an arrival and would be a row nothing else
1805
+ * could ever want.
1806
+ */
1807
+ @keyframes plass-anim-float {
1808
+ 0%,
1809
+ 100% {
1810
+ translate: 0 0;
1811
+ }
1812
+ 50% {
1813
+ translate: var(--p-anim-x, 0) var(--p-anim-y, 0);
1814
+ }
1815
+ }
1816
+
1817
+ .plass-anim-float {
1818
+ animation-name: plass-anim-float;
1819
+ }
1820
+
1041
1821
  /*
1042
1822
  * The light travelling around the outside of something.
1043
1823
  *
@@ -1133,6 +1913,12 @@
1133
1913
  flex-direction: column;
1134
1914
  }
1135
1915
 
1916
+ /* Inset, so a box inside something that clips does not lose its ring. */
1917
+ .plass-marquee:focus-visible {
1918
+ outline: 2px solid var(--plass-primary-ring);
1919
+ outline-offset: -2px;
1920
+ }
1921
+
1136
1922
  .plass-marquee-track {
1137
1923
  display: flex;
1138
1924
  flex: 0 0 auto;
@@ -1249,6 +2035,531 @@
1249
2035
  animation: plass-anim-caret 1s step-end infinite;
1250
2036
  }
1251
2037
 
2038
+ /* ---------------------------------------------------------------------------
2039
+ * Code blocks
2040
+ *
2041
+ * A `PlCodeBlock` is the one surface in the library that does **not** take the
2042
+ * page's palette. Code is read against a background that was chosen for code,
2043
+ * and a block that turned white because the page did would throw away the only
2044
+ * thing a reader is using to tell a keyword from a string. So the sheet carries
2045
+ * its own slots, `theme` picks which set fills them, and `auto` is the opt-in
2046
+ * for a block that would rather follow the page.
2047
+ *
2048
+ * They are custom properties on the block rather than a stylesheet per theme
2049
+ * for `internal/animate.ts`'s reason: nothing here is generated, the component only
2050
+ * fills slots, and a thirteenth theme is a block of declarations rather than a
2051
+ * second copy of the token map below. That is also why `theme` accepts any
2052
+ * string: a consumer who writes `[data-code-theme='ours']` in their own CSS has
2053
+ * a theme, with nothing to register and nothing to import.
2054
+ *
2055
+ * **Five of the slots are derived and are never written per theme.** `dim`,
2056
+ * `rule` and `hover` are a fixed mix of the ground and the ink, and `mark` and
2057
+ * `mark-edge` are the same for the highlighted-line background. A custom
2058
+ * property resolves its `var()`s on the element that declares it, and every
2059
+ * theme below declares its `fg` and `bg` on that same element — so the derived
2060
+ * five follow whichever theme won without being restated fourteen times.
2061
+ *
2062
+ * The two dark palettes at the top are written twice on purpose — once for
2063
+ * `dark`, once for `auto` inside a dark page — because a media query cannot be
2064
+ * folded into a selector list. It is the same repetition the theme roots at the
2065
+ * top of this file make, for the same reason.
2066
+ *
2067
+ * Every hue in the house themes is solved against its own background rather
2068
+ * than flipped: the light set runs dark and saturated on near-white, the dark
2069
+ * set light and desaturated on near-black. The pairs that have to stay apart
2070
+ * are the ones that sit next to each other in real code — a string beside a
2071
+ * number, a type beside a function name. The eight named themes below them are
2072
+ * ports and keep their own published values, because a Dracula that had been
2073
+ * re-solved would not be Dracula.
2074
+ * ------------------------------------------------------------------------- */
2075
+
2076
+ .plass-code {
2077
+ /* The light set, which is also what `auto` and `light` start from. */
2078
+ --p-code-bg: oklch(98.4% 0.003 262);
2079
+ --p-code-fg: oklch(30% 0.016 262);
2080
+
2081
+ --p-code-comment: oklch(58% 0.022 262);
2082
+ --p-code-keyword: oklch(48% 0.19 322);
2083
+ --p-code-string: oklch(46% 0.12 148);
2084
+ --p-code-number: oklch(50% 0.14 48);
2085
+ --p-code-function: oklch(48% 0.17 264);
2086
+ --p-code-type: oklch(45% 0.1 214);
2087
+ --p-code-variable: oklch(45% 0.12 28);
2088
+ --p-code-tag: oklch(48% 0.18 22);
2089
+ --p-code-attr: oklch(47% 0.13 82);
2090
+ --p-code-meta: oklch(52% 0.05 262);
2091
+ --p-code-add: oklch(45% 0.14 152);
2092
+ --p-code-del: oklch(48% 0.18 25);
2093
+
2094
+ /* The derived five. Declared once here and never in a theme: they are a mix
2095
+ of that theme's own ground and ink, which resolves on this element. */
2096
+ --p-code-dim: color-mix(in oklab, var(--p-code-fg) 58%, var(--p-code-bg));
2097
+ --p-code-rule: color-mix(in oklab, var(--p-code-fg) 14%, transparent);
2098
+ --p-code-hover: color-mix(in oklab, var(--p-code-fg) 9%, transparent);
2099
+
2100
+ /* A marked line is neutral rather than dyed with the page's accent family:
2101
+ the block has deliberately refused the page's palette, and a primary-blue
2102
+ wash over Dracula would be the one colour on it nobody chose. Mixed from
2103
+ the theme's own ink, it is legible on all twelve. */
2104
+ --p-code-mark: color-mix(in oklab, var(--p-code-fg) 10%, transparent);
2105
+ --p-code-mark-edge: color-mix(in oklab, var(--p-code-fg) 45%, transparent);
2106
+ }
2107
+
2108
+ .plass-code[data-code-theme='dark'],
2109
+ :where(.dark, [data-theme='dark']) .plass-code[data-code-theme='auto'] {
2110
+ --p-code-bg: oklch(19.5% 0.014 262);
2111
+ --p-code-fg: oklch(90% 0.012 262);
2112
+
2113
+ --p-code-comment: oklch(60% 0.024 262);
2114
+ --p-code-keyword: oklch(76% 0.13 324);
2115
+ --p-code-string: oklch(80% 0.13 148);
2116
+ --p-code-number: oklch(81% 0.12 62);
2117
+ --p-code-function: oklch(78% 0.12 258);
2118
+ --p-code-type: oklch(82% 0.1 210);
2119
+ --p-code-variable: oklch(82% 0.09 32);
2120
+ --p-code-tag: oklch(77% 0.13 22);
2121
+ --p-code-attr: oklch(85% 0.11 92);
2122
+ --p-code-meta: oklch(70% 0.05 262);
2123
+ --p-code-add: oklch(80% 0.14 152);
2124
+ --p-code-del: oklch(75% 0.15 25);
2125
+ }
2126
+
2127
+ /* Both ways of forcing light are named, the same pair the token block above
2128
+ answers to. `auto` means "whatever the page is", so a page that has said it
2129
+ is light with `.light` and one that has said it with `[data-theme='light']`
2130
+ have to leave the block light alike — otherwise the page is white and the
2131
+ code on it is the one dark rectangle nobody asked for. */
2132
+ @media (prefers-color-scheme: dark) {
2133
+ :root:not(.light):not([data-theme='light']) .plass-code[data-code-theme='auto'] {
2134
+ --p-code-bg: oklch(19.5% 0.014 262);
2135
+ --p-code-fg: oklch(90% 0.012 262);
2136
+
2137
+ --p-code-comment: oklch(60% 0.024 262);
2138
+ --p-code-keyword: oklch(76% 0.13 324);
2139
+ --p-code-string: oklch(80% 0.13 148);
2140
+ --p-code-number: oklch(81% 0.12 62);
2141
+ --p-code-function: oklch(78% 0.12 258);
2142
+ --p-code-type: oklch(82% 0.1 210);
2143
+ --p-code-variable: oklch(82% 0.09 32);
2144
+ --p-code-tag: oklch(77% 0.13 22);
2145
+ --p-code-attr: oklch(85% 0.11 92);
2146
+ --p-code-meta: oklch(70% 0.05 262);
2147
+ --p-code-add: oklch(80% 0.14 152);
2148
+ --p-code-del: oklch(75% 0.15 25);
2149
+ }
2150
+ }
2151
+
2152
+ /*
2153
+ * `mono` is the one theme that follows the page, and the only one with no hue
2154
+ * in it at all: the structure is carried by weight and by how far a run is
2155
+ * muted. It is what a block printed on paper, or read by someone who cannot
2156
+ * separate the hues above, is left with — so it has to stay legible on its own
2157
+ * rather than being a degraded copy of a colour theme.
2158
+ */
2159
+ .plass-code[data-code-theme='mono'] {
2160
+ --p-code-bg: color-mix(in oklab, var(--plass-fg) 4%, var(--plass-surface));
2161
+ --p-code-fg: var(--plass-fg);
2162
+
2163
+ --p-code-comment: var(--plass-muted-fg);
2164
+ --p-code-keyword: var(--plass-fg);
2165
+ --p-code-string: var(--plass-muted-fg);
2166
+ --p-code-number: var(--plass-muted-fg);
2167
+ --p-code-function: var(--plass-fg);
2168
+ --p-code-type: var(--plass-fg);
2169
+ --p-code-variable: var(--plass-fg);
2170
+ --p-code-tag: var(--plass-fg);
2171
+ --p-code-attr: var(--plass-muted-fg);
2172
+ --p-code-meta: var(--plass-muted-fg);
2173
+ --p-code-add: var(--plass-fg);
2174
+ --p-code-del: var(--plass-muted-fg);
2175
+ }
2176
+
2177
+ .plass-code[data-code-theme='mono'] .hljs-keyword,
2178
+ .plass-code[data-code-theme='mono'] .hljs-selector-tag,
2179
+ .plass-code[data-code-theme='mono'] .hljs-title,
2180
+ .plass-code[data-code-theme='mono'] .hljs-tag,
2181
+ .plass-code[data-code-theme='mono'] .hljs-type,
2182
+ .plass-code[data-code-theme='mono'] .hljs-built_in {
2183
+ font-weight: 600;
2184
+ }
2185
+
2186
+ /*
2187
+ * The eight ports.
2188
+ *
2189
+ * They exist because a code block is the one component whose colours a reader
2190
+ * already has an opinion about: someone who writes in One Dark all day reads a
2191
+ * Dracula block as a different product's documentation. The published values
2192
+ * are kept exactly, in the hex they were published in, rather than re-solved
2193
+ * into the oklch the rest of this file uses — a Dracula that had been corrected
2194
+ * against Neba's own ground would be a theme nobody recognises and nobody
2195
+ * asked for.
2196
+ *
2197
+ * Six dark and two light, which is the ratio of how they are used. Each is
2198
+ * fourteen declarations, because the muted, the rule, the hover and the two
2199
+ * marked-line slots are all derived from the two at the top of it.
2200
+ */
2201
+ .plass-code[data-code-theme='one-dark'] {
2202
+ --p-code-bg: #282c34;
2203
+ --p-code-fg: #abb2bf;
2204
+
2205
+ --p-code-comment: #5c6370;
2206
+ --p-code-keyword: #c678dd;
2207
+ --p-code-string: #98c379;
2208
+ --p-code-number: #d19a66;
2209
+ --p-code-function: #61afef;
2210
+ --p-code-type: #e5c07b;
2211
+ --p-code-variable: #e06c75;
2212
+ --p-code-tag: #e06c75;
2213
+ --p-code-attr: #d19a66;
2214
+ --p-code-meta: #56b6c2;
2215
+ --p-code-add: #98c379;
2216
+ --p-code-del: #e06c75;
2217
+ }
2218
+
2219
+ .plass-code[data-code-theme='dracula'] {
2220
+ --p-code-bg: #282a36;
2221
+ --p-code-fg: #f8f8f2;
2222
+
2223
+ --p-code-comment: #6272a4;
2224
+ --p-code-keyword: #ff79c6;
2225
+ --p-code-string: #f1fa8c;
2226
+ --p-code-number: #bd93f9;
2227
+ --p-code-function: #50fa7b;
2228
+ --p-code-type: #8be9fd;
2229
+ --p-code-variable: #f8f8f2;
2230
+ --p-code-tag: #ff79c6;
2231
+ --p-code-attr: #50fa7b;
2232
+ --p-code-meta: #6272a4;
2233
+ --p-code-add: #50fa7b;
2234
+ --p-code-del: #ff5555;
2235
+ }
2236
+
2237
+ .plass-code[data-code-theme='monokai'] {
2238
+ --p-code-bg: #272822;
2239
+ --p-code-fg: #f8f8f2;
2240
+
2241
+ --p-code-comment: #75715e;
2242
+ --p-code-keyword: #f92672;
2243
+ --p-code-string: #e6db74;
2244
+ --p-code-number: #ae81ff;
2245
+ --p-code-function: #a6e22e;
2246
+ --p-code-type: #66d9ef;
2247
+ --p-code-variable: #f8f8f2;
2248
+ --p-code-tag: #f92672;
2249
+ --p-code-attr: #a6e22e;
2250
+ --p-code-meta: #75715e;
2251
+ --p-code-add: #a6e22e;
2252
+ --p-code-del: #f92672;
2253
+ }
2254
+
2255
+ .plass-code[data-code-theme='nord'] {
2256
+ --p-code-bg: #2e3440;
2257
+ --p-code-fg: #d8dee9;
2258
+
2259
+ --p-code-comment: #616e88;
2260
+ --p-code-keyword: #81a1c1;
2261
+ --p-code-string: #a3be8c;
2262
+ --p-code-number: #b48ead;
2263
+ --p-code-function: #88c0d0;
2264
+ --p-code-type: #8fbcbb;
2265
+ --p-code-variable: #d8dee9;
2266
+ --p-code-tag: #81a1c1;
2267
+ --p-code-attr: #8fbcbb;
2268
+ --p-code-meta: #5e81ac;
2269
+ --p-code-add: #a3be8c;
2270
+ --p-code-del: #bf616a;
2271
+ }
2272
+
2273
+ .plass-code[data-code-theme='night-owl'] {
2274
+ --p-code-bg: #011627;
2275
+ --p-code-fg: #d6deeb;
2276
+
2277
+ --p-code-comment: #637777;
2278
+ --p-code-keyword: #c792ea;
2279
+ --p-code-string: #ecc48d;
2280
+ --p-code-number: #f78c6c;
2281
+ --p-code-function: #82aaff;
2282
+ --p-code-type: #ffcb8b;
2283
+ --p-code-variable: #addb67;
2284
+ --p-code-tag: #7fdbca;
2285
+ --p-code-attr: #addb67;
2286
+ --p-code-meta: #82aaff;
2287
+ --p-code-add: #addb67;
2288
+ --p-code-del: #ef5350;
2289
+ }
2290
+
2291
+ .plass-code[data-code-theme='gruvbox'] {
2292
+ --p-code-bg: #282828;
2293
+ --p-code-fg: #ebdbb2;
2294
+
2295
+ --p-code-comment: #928374;
2296
+ --p-code-keyword: #fb4934;
2297
+ --p-code-string: #b8bb26;
2298
+ --p-code-number: #d3869b;
2299
+ --p-code-function: #b8bb26;
2300
+ --p-code-type: #fabd2f;
2301
+ --p-code-variable: #83a598;
2302
+ --p-code-tag: #8ec07c;
2303
+ --p-code-attr: #fabd2f;
2304
+ --p-code-meta: #928374;
2305
+ --p-code-add: #b8bb26;
2306
+ --p-code-del: #fb4934;
2307
+ }
2308
+
2309
+ .plass-code[data-code-theme='github'] {
2310
+ --p-code-bg: #ffffff;
2311
+ --p-code-fg: #24292f;
2312
+
2313
+ --p-code-comment: #6e7781;
2314
+ --p-code-keyword: #cf222e;
2315
+ --p-code-string: #0a3069;
2316
+ --p-code-number: #0550ae;
2317
+ --p-code-function: #8250df;
2318
+ --p-code-type: #953800;
2319
+ --p-code-variable: #953800;
2320
+ --p-code-tag: #116329;
2321
+ --p-code-attr: #0550ae;
2322
+ --p-code-meta: #6e7781;
2323
+ --p-code-add: #116329;
2324
+ --p-code-del: #82071e;
2325
+ }
2326
+
2327
+ .plass-code[data-code-theme='solarized-light'] {
2328
+ --p-code-bg: #fdf6e3;
2329
+ --p-code-fg: #657b83;
2330
+
2331
+ --p-code-comment: #93a1a1;
2332
+ --p-code-keyword: #859900;
2333
+ --p-code-string: #2aa198;
2334
+ --p-code-number: #d33682;
2335
+ --p-code-function: #268bd2;
2336
+ --p-code-type: #b58900;
2337
+ --p-code-variable: #268bd2;
2338
+ --p-code-tag: #268bd2;
2339
+ --p-code-attr: #b58900;
2340
+ --p-code-meta: #cb4b16;
2341
+ --p-code-add: #859900;
2342
+ --p-code-del: #dc322f;
2343
+ }
2344
+
2345
+ /*
2346
+ * A line, and the two things in front of it that are not code.
2347
+ *
2348
+ * The number and the prompt are generated content off a `data-*` attribute, not
2349
+ * text nodes, and that is the whole point: a `$` a reader drags across and
2350
+ * pastes into their shell is a `$` their shell chokes on. Generated content
2351
+ * cannot be selected, cannot be found by find-in-page and never reaches the
2352
+ * clipboard — `user-select: none` is only *usually* true of all three. The
2353
+ * `order` is what lets one pseudo-element sit in front of the other and both in
2354
+ * front of the code, since `::after` would otherwise draw last.
2355
+ *
2356
+ * `min-height` keeps a blank line a line high. A flex row with nothing in it is
2357
+ * zero pixels tall, and a code block that closed up its own paragraph breaks
2358
+ * would be reflowing the reader's file.
2359
+ */
2360
+ .plass-code-line {
2361
+ display: flex;
2362
+ min-height: 1.5em;
2363
+ min-height: 1lh;
2364
+ /*
2365
+ * Transparent on every line, coloured on a marked one. A border rather than
2366
+ * an inset `box-shadow` because `box-shadow` has no logical form and this one
2367
+ * has to sit on the *start* edge in both writing directions; drawn on all of
2368
+ * them so marking a line does not shift its text two pixels sideways.
2369
+ */
2370
+ border-inline-start: 2px solid transparent;
2371
+ }
2372
+
2373
+ /*
2374
+ * A marked line, and the reason its horizontal padding is on the line rather
2375
+ * than on the box that scrolls it.
2376
+ *
2377
+ * A highlight that stopped at the padding would be a stripe floating inside the
2378
+ * block instead of a marked row. With the padding here the line box *is* the
2379
+ * row, so the tint reaches both edges — and because the lines sit in a
2380
+ * `w-max min-w-full` block, every one of them reaches the same edge whether the
2381
+ * code is narrower than the block or scrolled sideways within it.
2382
+ */
2383
+ .plass-code-line[data-mark] {
2384
+ background: var(--p-code-mark);
2385
+ border-inline-start-color: var(--p-code-mark-edge);
2386
+ }
2387
+
2388
+ .plass-code-line[data-line]::before {
2389
+ content: attr(data-line);
2390
+ order: 0;
2391
+ flex: none;
2392
+ width: var(--p-code-gutter, 2ch);
2393
+ margin-inline-end: 1.25em;
2394
+ text-align: end;
2395
+ color: var(--p-code-dim);
2396
+ -webkit-user-select: none;
2397
+ user-select: none;
2398
+ }
2399
+
2400
+ .plass-code-line[data-prompt]::after {
2401
+ content: attr(data-prompt);
2402
+ order: 1;
2403
+ flex: none;
2404
+ margin-inline-end: 0.75em;
2405
+ color: var(--p-code-dim);
2406
+ -webkit-user-select: none;
2407
+ user-select: none;
2408
+ }
2409
+
2410
+ .plass-code-line > code {
2411
+ order: 2;
2412
+ min-width: 0;
2413
+ font: inherit;
2414
+ background: none;
2415
+ padding: 0;
2416
+ white-space: pre;
2417
+ }
2418
+
2419
+ .plass-code[data-code-wrap='true'] .plass-code-line > code {
2420
+ white-space: pre-wrap;
2421
+ overflow-wrap: anywhere;
2422
+ }
2423
+
2424
+ /*
2425
+ * highlight.js's scopes, mapped onto the sixteen slots.
2426
+ *
2427
+ * Grouped by what a run *is* rather than by what highlight.js calls it, because
2428
+ * the names are the union of a hundred and ninety grammars and half of them are
2429
+ * one language's word for another language's idea — `selector-tag` and `tag`
2430
+ * and `name` are all "the thing being declared". The point of the mapping is
2431
+ * that the same idea gets the same colour whatever file it appears in.
2432
+ */
2433
+ .plass-code .hljs-comment,
2434
+ .plass-code .hljs-quote {
2435
+ color: var(--p-code-comment);
2436
+ font-style: italic;
2437
+ }
2438
+
2439
+ .plass-code .hljs-keyword,
2440
+ .plass-code .hljs-literal,
2441
+ .plass-code .hljs-selector-tag,
2442
+ .plass-code .hljs-operator,
2443
+ .plass-code .hljs-doctag,
2444
+ .plass-code .hljs-formula {
2445
+ color: var(--p-code-keyword);
2446
+ }
2447
+
2448
+ .plass-code .hljs-string,
2449
+ .plass-code .hljs-regexp,
2450
+ .plass-code .hljs-char,
2451
+ .plass-code .hljs-link {
2452
+ color: var(--p-code-string);
2453
+ }
2454
+
2455
+ .plass-code .hljs-number,
2456
+ .plass-code .hljs-symbol,
2457
+ .plass-code .hljs-bullet {
2458
+ color: var(--p-code-number);
2459
+ }
2460
+
2461
+ .plass-code .hljs-title,
2462
+ .plass-code .hljs-section,
2463
+ .plass-code .hljs-name,
2464
+ .plass-code .hljs-selector-id,
2465
+ .plass-code .hljs-selector-class {
2466
+ color: var(--p-code-function);
2467
+ }
2468
+
2469
+ .plass-code .hljs-type,
2470
+ .plass-code .hljs-built_in,
2471
+ .plass-code .hljs-class {
2472
+ color: var(--p-code-type);
2473
+ }
2474
+
2475
+ .plass-code .hljs-variable,
2476
+ .plass-code .hljs-template-variable,
2477
+ .plass-code .hljs-params,
2478
+ .plass-code .hljs-subst {
2479
+ color: var(--p-code-variable);
2480
+ }
2481
+
2482
+ .plass-code .hljs-tag,
2483
+ .plass-code .hljs-template-tag {
2484
+ color: var(--p-code-tag);
2485
+ }
2486
+
2487
+ .plass-code .hljs-attr,
2488
+ .plass-code .hljs-attribute,
2489
+ .plass-code .hljs-property,
2490
+ .plass-code .hljs-selector-attr,
2491
+ .plass-code .hljs-selector-pseudo {
2492
+ color: var(--p-code-attr);
2493
+ }
2494
+
2495
+ .plass-code .hljs-meta,
2496
+ .plass-code .hljs-punctuation {
2497
+ color: var(--p-code-meta);
2498
+ }
2499
+
2500
+ .plass-code .hljs-addition {
2501
+ color: var(--p-code-add);
2502
+ }
2503
+
2504
+ .plass-code .hljs-deletion {
2505
+ color: var(--p-code-del);
2506
+ }
2507
+
2508
+ .plass-code .hljs-emphasis {
2509
+ font-style: italic;
2510
+ }
2511
+
2512
+ .plass-code .hljs-strong {
2513
+ font-weight: 700;
2514
+ }
2515
+
2516
+ /* ---------------------------------------------------------------------------
2517
+ * The gallery
2518
+ *
2519
+ * `PlGallery` rides the same `--p-cols` chain `PlGrid` does, one block above,
2520
+ * with a default of two rather than twelve: a wall of photographs is counted in
2521
+ * tiles across and a layout grid is counted in tracks, and two is the narrowest
2522
+ * arrangement that still reads as a set.
2523
+ *
2524
+ * The three lines below are what the slot is *for*. A grid and a quilt lay out
2525
+ * in CSS Grid off `--p-cols`; a masonry deals its items into lanes in JavaScript
2526
+ * and writes the count and the rows inline, because which lane an item lands in
2527
+ * depends on the heights of the items before it and no stylesheet can work that
2528
+ * out; and a justified row is flexbox, which needs no count at all — it fills
2529
+ * to the edge with whatever fits.
2530
+ * ------------------------------------------------------------------------- */
2531
+
2532
+ .plass-gallery-grid,
2533
+ .plass-gallery-quilted {
2534
+ grid-template-columns: repeat(var(--p-cols, 2), minmax(0, 1fr));
2535
+ }
2536
+
2537
+ /*
2538
+ * What holds a justified gallery's last row down.
2539
+ *
2540
+ * Every tile is grown in proportion to its own width, which is what makes a row
2541
+ * come out one height once it has been stretched to the edge. The last row is
2542
+ * the exception: it has fewer tiles and the same width to share, so they stretch
2543
+ * further than any row above them — one leftover photograph ends up filling the
2544
+ * whole width and standing two or three times as tall as the gallery it belongs
2545
+ * to.
2546
+ *
2547
+ * An empty `::after` with an absurd `flex-grow` eats the leftover width instead,
2548
+ * so the real tiles keep their basis and the row lands at the height it was
2549
+ * aiming for. It has to be a pseudo-element rather than a filler item: the list
2550
+ * is a `<ul>` with `role="list"`, and an extra `<li>` would be an extra item in
2551
+ * it — a photograph that is not there, counted by every screen reader that
2552
+ * announces how many there are.
2553
+ *
2554
+ * It costs a row of nothing when the last row happens to be full, which is why
2555
+ * the flex-basis is zero.
2556
+ */
2557
+ .plass-gallery-justified::after {
2558
+ content: '';
2559
+ flex-grow: 1000000;
2560
+ flex-basis: 0;
2561
+ }
2562
+
1252
2563
  /* ---------------------------------------------------------------------------
1253
2564
  * Reduced motion
1254
2565
  *
@@ -1320,6 +2631,27 @@
1320
2631
  animation: none;
1321
2632
  }
1322
2633
 
2634
+ /*
2635
+ * A marquee that stops would leave everything past the edge of its box out
2636
+ * of sight for good. One copy is drawn, and the box scrolls along it instead
2637
+ * of clipping it, so the strip stays one line rather than wrapping down the
2638
+ * page; a platform that draws a permanent scrollbar adds only the bar. The
2639
+ * component makes the box a tab stop while it scrolls.
2640
+ */
2641
+ .plass-marquee {
2642
+ overflow-x: auto;
2643
+ overflow-y: hidden;
2644
+ }
2645
+
2646
+ .plass-marquee-vertical {
2647
+ overflow-x: hidden;
2648
+ overflow-y: auto;
2649
+ }
2650
+
2651
+ .plass-marquee-track + .plass-marquee-track {
2652
+ display: none;
2653
+ }
2654
+
1323
2655
  /* The arc stops travelling and becomes an even glow. The same trade the
1324
2656
  skeleton makes: the decoration survives, the motion does not. */
1325
2657
  .plass-anim-lighting::before {