efficient-shell 12.7.0 → 12.10.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 (388) hide show
  1. package/README.md +44 -3
  2. package/dist/{Browser-AKBOECNB.js → Browser-G2HGYZVD.js} +16 -16
  3. package/dist/Calculator-ALPNISJT.js +29 -0
  4. package/dist/{CurrencyConverter-UVOKFPMG.js → CurrencyConverter-KBY2OXQ2.js} +8 -8
  5. package/dist/Files-OY5TSWUZ.js +126 -0
  6. package/dist/{Notepad-P6JFXK3G.js → Notepad-CRHG5FLI.js} +10 -10
  7. package/dist/PdfViewer-L4FJS3M6.js +1 -0
  8. package/dist/{PomodoroTimer-UOV4CCYH.js → PomodoroTimer-NGQPYDI3.js} +68 -68
  9. package/dist/{Preview-XF5FKLVZ.js → Preview-BVTWP7RW.js} +24 -24
  10. package/dist/Sidebar-QOGK5LJ2.js +44 -0
  11. package/dist/{Stock-6D4I2EWM.js → Stock-O7AQ2WUN.js} +3 -3
  12. package/dist/{Weather-BCOAQJDT.js → Weather-WHXA5TTP.js} +21 -21
  13. package/dist/{WorldClock-WX3O3EDU.js → WorldClock-CZCIVYKB.js} +6 -6
  14. package/dist/ai/index.js +57 -57
  15. package/dist/apps/ImageAnnotator.js +1 -1
  16. package/dist/apps/index.d.ts +55 -1
  17. package/dist/apps/index.js +1 -1
  18. package/dist/bin/media-host-check.js +1 -1
  19. package/dist/bin/ui-check.js +1 -1
  20. package/dist/brand.css +1 -1
  21. package/dist/charts/BoxPlotChart.js +1 -1
  22. package/dist/charts/CandlestickChart.js +1 -1
  23. package/dist/charts/CartesianPlot.js +1 -1
  24. package/dist/charts/ChartBrush.js +1 -1
  25. package/dist/charts/ChartFrame.js +1 -1
  26. package/dist/charts/ChartSkeleton.js +1 -1
  27. package/dist/charts/ChordChart.js +1 -1
  28. package/dist/charts/ColumnChart.js +1 -1
  29. package/dist/charts/FlowChart.js +1 -1
  30. package/dist/charts/FunnelChart.js +1 -1
  31. package/dist/charts/HeatmapChart.js +1 -1
  32. package/dist/charts/HistogramChart.js +1 -1
  33. package/dist/charts/Meter.js +1 -1
  34. package/dist/charts/PieChart.js +1 -1
  35. package/dist/charts/RadarChart.js +1 -1
  36. package/dist/charts/RadialBarChart.js +1 -1
  37. package/dist/charts/RangeChart.js +1 -1
  38. package/dist/charts/RankedBars.js +1 -1
  39. package/dist/charts/SankeyChart.js +1 -1
  40. package/dist/charts/ScatterChart.js +1 -1
  41. package/dist/charts/SpecChart.js +1 -1
  42. package/dist/charts/StatTile.js +1 -1
  43. package/dist/charts/SunburstChart.js +1 -1
  44. package/dist/charts/TimeSeriesChart.js +1 -1
  45. package/dist/charts/TreemapChart.js +1 -1
  46. package/dist/charts/WaterfallChart.js +1 -1
  47. package/dist/{chunk-UDHJTQBA.js → chunk-22LU6FKN.js} +12 -12
  48. package/dist/{chunk-NC36LJCA.js → chunk-2GS2VOQT.js} +10 -10
  49. package/dist/{chunk-3PWI5IH7.js → chunk-2NZBQOA6.js} +11 -11
  50. package/dist/{chunk-4ZUV6WQT.js → chunk-2WNTDGOP.js} +1 -1
  51. package/dist/{chunk-RFKCSRJX.js → chunk-2X4U3VX2.js} +6 -6
  52. package/dist/chunk-3C5NKOVF.js +1 -0
  53. package/dist/{chunk-SYZLS2JA.js → chunk-3DWVSQIJ.js} +1 -1
  54. package/dist/{chunk-6JDR6T4U.js → chunk-3RDJFCIZ.js} +1 -1
  55. package/dist/{chunk-5NDONLH5.js → chunk-42BVXJZN.js} +3 -3
  56. package/dist/chunk-457SK2XV.js +9 -0
  57. package/dist/chunk-4GTXRVDF.js +3 -0
  58. package/dist/{chunk-G2X5YYIQ.js → chunk-4MUE4CYB.js} +2 -2
  59. package/dist/{chunk-3CMCGOOV.js → chunk-4UQNNA4K.js} +4 -4
  60. package/dist/{chunk-NEAT7BIP.js → chunk-5G4CB3E6.js} +1 -1
  61. package/dist/{chunk-PH3P54QQ.js → chunk-5HOXR3L4.js} +1 -1
  62. package/dist/{chunk-QNYZTD7V.js → chunk-5MFWM6L4.js} +1 -1
  63. package/dist/{chunk-Y4RERPFN.js → chunk-5QVCBAK2.js} +1 -1
  64. package/dist/chunk-5RT5XDHG.js +6 -0
  65. package/dist/{chunk-3UHTHQGK.js → chunk-5S4YF5XA.js} +8 -8
  66. package/dist/{chunk-FLTPVFKA.js → chunk-5WCHUZ6O.js} +1 -1
  67. package/dist/{chunk-YRJJKF5H.js → chunk-5YPCZLBW.js} +1 -1
  68. package/dist/{chunk-PT77FC5X.js → chunk-5Z6XJPAX.js} +1 -1
  69. package/dist/{chunk-MGW7SX53.js → chunk-63J2MBXV.js} +10 -10
  70. package/dist/chunk-675RYIWR.js +7 -0
  71. package/dist/{chunk-ND5IZ37V.js → chunk-67BWG353.js} +9 -9
  72. package/dist/{chunk-SCU2CWNJ.js → chunk-6BK3KRT5.js} +18 -18
  73. package/dist/chunk-6BQUSUNK.js +14 -0
  74. package/dist/{chunk-XMH2JOZ2.js → chunk-6ITEA6SX.js} +1 -1
  75. package/dist/{chunk-4KJ7MLWO.js → chunk-6JLXXX4H.js} +5 -5
  76. package/dist/{chunk-6BATVJBA.js → chunk-6P7SIIG4.js} +14 -14
  77. package/dist/{chunk-CNVYM3HP.js → chunk-6YIVKPWQ.js} +1 -1
  78. package/dist/{chunk-2HZQZTW5.js → chunk-7Q4DE4CT.js} +1 -1
  79. package/dist/{chunk-56GGBTAD.js → chunk-7XGUX3TH.js} +3 -3
  80. package/dist/{chunk-BKKKIHHV.js → chunk-A2JYBUPB.js} +6 -6
  81. package/dist/{chunk-IYPRFUTT.js → chunk-AKTEMZOT.js} +1 -1
  82. package/dist/{chunk-I5BS6AP6.js → chunk-AMSE4PMQ.js} +3 -3
  83. package/dist/{chunk-TX5FZBPQ.js → chunk-ASOVTAIT.js} +1 -1
  84. package/dist/{chunk-CD7P34VC.js → chunk-AUCNJFTP.js} +7 -7
  85. package/dist/{chunk-BGJMDP6J.js → chunk-BJAJOIVY.js} +1 -1
  86. package/dist/chunk-BR7L5NE3.js +13 -0
  87. package/dist/{chunk-DJ2XDBAO.js → chunk-BUZ5AJLR.js} +6 -6
  88. package/dist/{chunk-EOGXCGQF.js → chunk-BYDSBDVS.js} +6 -6
  89. package/dist/{chunk-MOMOZVOW.js → chunk-C3E6XFIC.js} +3 -3
  90. package/dist/{chunk-45IVWLKF.js → chunk-C7M7KYNY.js} +1 -1
  91. package/dist/chunk-CA3OC4YY.js +9 -0
  92. package/dist/{chunk-H7HRYFRQ.js → chunk-CB5FQMFB.js} +9 -9
  93. package/dist/{chunk-62275PI2.js → chunk-CINGDJPM.js} +1 -1
  94. package/dist/{chunk-IFQXTIMY.js → chunk-CRRC72EE.js} +9 -9
  95. package/dist/{chunk-NS37Y5CN.js → chunk-D4K72BHN.js} +1 -1
  96. package/dist/{chunk-BFO72WQB.js → chunk-EDANELWX.js} +1 -1
  97. package/dist/chunk-EHVBJUQI.js +28 -0
  98. package/dist/{chunk-KUEYOJBN.js → chunk-EIXMUGVZ.js} +2 -2
  99. package/dist/{chunk-7FBAZLBX.js → chunk-EVEGK57J.js} +1 -1
  100. package/dist/chunk-EVYD6UFQ.js +2 -0
  101. package/dist/chunk-F7BXUVN4.js +6 -0
  102. package/dist/{chunk-EIY6YGEZ.js → chunk-FOCQEWUH.js} +1 -1
  103. package/dist/chunk-FQHY6DTF.js +4 -0
  104. package/dist/{chunk-4UGFNTZ3.js → chunk-FZWAOYAM.js} +7 -7
  105. package/dist/{chunk-NEYHBQLG.js → chunk-G3VRO4CK.js} +2 -2
  106. package/dist/{chunk-CJH2BGXY.js → chunk-G67CJAQ2.js} +1 -1
  107. package/dist/{chunk-FPYABAOX.js → chunk-GB2XLSR5.js} +11 -11
  108. package/dist/{chunk-TS36J7RW.js → chunk-GBEDLYND.js} +2 -2
  109. package/dist/{chunk-IXBKWVEP.js → chunk-GMJ5WOB2.js} +1 -1
  110. package/dist/{chunk-GEXETMGL.js → chunk-GMLDGXNQ.js} +1 -1
  111. package/dist/{chunk-JM2IQC4J.js → chunk-HD7OBASH.js} +1 -1
  112. package/dist/{chunk-RBMZSZOH.js → chunk-HE24VQMU.js} +1 -1
  113. package/dist/{chunk-3WFJ4PYV.js → chunk-HEX3EP5F.js} +3 -3
  114. package/dist/chunk-HL3V67JZ.js +2 -0
  115. package/dist/{chunk-GZQD6IBV.js → chunk-HRDR56SK.js} +3 -3
  116. package/dist/chunk-HULQSIX5.js +8 -0
  117. package/dist/{chunk-OY3JH66O.js → chunk-HV4VQ5XV.js} +7 -7
  118. package/dist/{chunk-EYPKBJYG.js → chunk-HY6CBG4M.js} +1 -1
  119. package/dist/{chunk-E227NVFX.js → chunk-IARCNQD3.js} +1 -1
  120. package/dist/{chunk-34SPT4I6.js → chunk-ICNGLA5O.js} +4 -4
  121. package/dist/{chunk-KDTL6VEC.js → chunk-IIMFLLYT.js} +8 -8
  122. package/dist/{chunk-N442GPRJ.js → chunk-INFL4YZF.js} +1 -1
  123. package/dist/{chunk-Y46WPTKY.js → chunk-ISU4FCEX.js} +7 -7
  124. package/dist/chunk-ISZOD5S6.js +2 -0
  125. package/dist/{chunk-H6PFTU3L.js → chunk-J4IT5C3A.js} +1 -1
  126. package/dist/chunk-J7BMSKOM.js +7 -0
  127. package/dist/{chunk-DW45EZHA.js → chunk-JGJWPONL.js} +5 -5
  128. package/dist/{chunk-JPNAEN53.js → chunk-JMGDGNM7.js} +1 -1
  129. package/dist/chunk-JOD5ISTB.js +11 -0
  130. package/dist/{chunk-TRWHVG3A.js → chunk-JTZVUO3I.js} +1 -1
  131. package/dist/{chunk-WCPAQHHA.js → chunk-JVNJCRHM.js} +4 -4
  132. package/dist/chunk-KFS7WSCC.js +15 -0
  133. package/dist/{chunk-XZH5PEML.js → chunk-KIRLSUQT.js} +5 -5
  134. package/dist/{chunk-WMLBMR4E.js → chunk-KOPTKTHN.js} +3 -3
  135. package/dist/{chunk-3LTZ4N46.js → chunk-KPHYWZXL.js} +13 -13
  136. package/dist/chunk-KRUI4LVW.js +4 -0
  137. package/dist/chunk-KVU5IQOZ.js +7 -0
  138. package/dist/{chunk-N7JX27JE.js → chunk-KWTK6TGH.js} +1 -1
  139. package/dist/{chunk-DFYXIW4O.js → chunk-KZ7RR7EU.js} +1 -1
  140. package/dist/{chunk-YU6KOO6O.js → chunk-LFW3CQMF.js} +4 -4
  141. package/dist/{chunk-2BMGV6DE.js → chunk-LFWRHBTM.js} +2 -2
  142. package/dist/{chunk-X32TVINY.js → chunk-LS6VU6F7.js} +1 -1
  143. package/dist/{chunk-J53LQWWY.js → chunk-M4MN2GOE.js} +13 -13
  144. package/dist/{chunk-XWFLIGDQ.js → chunk-M5K4AX4E.js} +1 -1
  145. package/dist/{chunk-GJ23UZDQ.js → chunk-MAI2DN7N.js} +1 -1
  146. package/dist/{chunk-7B5KFESH.js → chunk-MBXCXFQO.js} +1 -1
  147. package/dist/{chunk-32WEY6O5.js → chunk-MEAJGM6F.js} +1 -1
  148. package/dist/{chunk-DNLRUZGS.js → chunk-MPTOEXED.js} +1 -1
  149. package/dist/chunk-MTP3MBZA.js +22 -0
  150. package/dist/{chunk-EUUCNDIS.js → chunk-NAWIVFAN.js} +13 -13
  151. package/dist/{chunk-54K2ADBT.js → chunk-NDAZPAQL.js} +1 -1
  152. package/dist/{chunk-ZKQWS2ML.js → chunk-NKZINXHG.js} +2 -2
  153. package/dist/chunk-NOCOLZ2W.js +1 -0
  154. package/dist/{chunk-SCGBCBXP.js → chunk-NV7QRWQJ.js} +1 -1
  155. package/dist/{chunk-XK4U5MAS.js → chunk-O3YCIWHF.js} +1 -1
  156. package/dist/chunk-OAFFHLJ4.js +8 -0
  157. package/dist/{chunk-DANLBFBD.js → chunk-OCI3PZDU.js} +1 -1
  158. package/dist/chunk-OSNHRKX6.js +5 -0
  159. package/dist/{chunk-C5LBNLFJ.js → chunk-OSQ5NRV3.js} +1 -1
  160. package/dist/{chunk-UVBX5LEU.js → chunk-OW5LQWPU.js} +4 -4
  161. package/dist/chunk-PEIRPNXT.js +23 -0
  162. package/dist/{chunk-LGK47SEN.js → chunk-PHJFGLXB.js} +12 -12
  163. package/dist/{chunk-N6Q7HNAH.js → chunk-PICRPJBL.js} +1 -1
  164. package/dist/{chunk-G7I255HN.js → chunk-POOPWYJL.js} +9 -9
  165. package/dist/chunk-PY7GHIYF.js +19 -0
  166. package/dist/{chunk-7HIHQR3X.js → chunk-Q3RJMQYE.js} +1 -1
  167. package/dist/{chunk-JQBVSPF5.js → chunk-QAS22BIS.js} +1 -1
  168. package/dist/{chunk-TTQ7K4AJ.js → chunk-QIMMZVWV.js} +1 -1
  169. package/dist/{chunk-RQDVAUXD.js → chunk-QJGZOD6X.js} +3 -3
  170. package/dist/{chunk-NHWDB7R6.js → chunk-QMNDKNK2.js} +1 -1
  171. package/dist/{chunk-RIXX6NRV.js → chunk-QQM36CYU.js} +1 -1
  172. package/dist/{chunk-QIUIP6YZ.js → chunk-QSK2OWT3.js} +2 -2
  173. package/dist/{chunk-AHJAJLSK.js → chunk-RAQBZUU2.js} +23 -23
  174. package/dist/{chunk-YMAU4EIK.js → chunk-RGKSJBXJ.js} +8 -8
  175. package/dist/{chunk-UVGEOQI4.js → chunk-RHD4V6CE.js} +9 -9
  176. package/dist/{chunk-XK4SMAVR.js → chunk-RIF6BFEH.js} +1 -1
  177. package/dist/{chunk-6U25ELYF.js → chunk-RLGPIJHB.js} +1 -1
  178. package/dist/{chunk-R3K3LVVS.js → chunk-RQKD5AAL.js} +1 -1
  179. package/dist/{chunk-I3QFYBOP.js → chunk-SEHKTBVM.js} +1 -1
  180. package/dist/{chunk-75MSXRFY.js → chunk-SFFELHLP.js} +5 -5
  181. package/dist/chunk-SOZCWT6I.js +6 -0
  182. package/dist/{chunk-UGOJLNYR.js → chunk-SV5RRBVA.js} +1 -1
  183. package/dist/{chunk-SBZCJNNP.js → chunk-SY65V6K7.js} +10 -10
  184. package/dist/{chunk-UIWGVOFH.js → chunk-T3NLFOLW.js} +2 -1
  185. package/dist/{chunk-57YY4J6T.js → chunk-TDMZFQRB.js} +1 -1
  186. package/dist/chunk-TJSJVC6P.js +1 -0
  187. package/dist/{chunk-VYMM2BPX.js → chunk-TKFINWY6.js} +2 -2
  188. package/dist/{chunk-MM5AFQ24.js → chunk-TVVSFXWY.js} +7 -7
  189. package/dist/{chunk-5JUG74UR.js → chunk-UD4NESX7.js} +1 -1
  190. package/dist/{chunk-NJTFI7AA.js → chunk-UG5GKEU5.js} +1 -1
  191. package/dist/{chunk-5MO5JBBK.js → chunk-UMZJRZFN.js} +1 -1
  192. package/dist/{chunk-LTESFDTF.js → chunk-V6FHZGCL.js} +1 -1
  193. package/dist/{chunk-ZOZEQZUA.js → chunk-VLCHHTX6.js} +1 -1
  194. package/dist/{chunk-A4KQKN32.js → chunk-VN3A43SA.js} +1 -1
  195. package/dist/{chunk-UPTKROT7.js → chunk-VPZOSVDF.js} +10 -10
  196. package/dist/{chunk-DPUM3H5N.js → chunk-VWNHSLFY.js} +1 -1
  197. package/dist/{chunk-HE767CVB.js → chunk-W5B7UNMJ.js} +1 -1
  198. package/dist/{chunk-RNQBWWYR.js → chunk-WDAOTHX5.js} +5 -5
  199. package/dist/{chunk-R3JKZXII.js → chunk-WJBP5SND.js} +5 -5
  200. package/dist/{chunk-RVQUSPXC.js → chunk-WM2BBRT6.js} +1 -1
  201. package/dist/{chunk-EEVLRCMA.js → chunk-Y4YXZIES.js} +9 -9
  202. package/dist/chunk-YMD2F3NL.js +1 -0
  203. package/dist/{chunk-525O4AUQ.js → chunk-YRG6XJ6M.js} +8 -8
  204. package/dist/chunk-YVAJ42M2.js +8 -0
  205. package/dist/{chunk-DZBGJ6X4.js → chunk-YVIV7SKG.js} +1 -1
  206. package/dist/{chunk-53EW4M5S.js → chunk-YX4MRM7A.js} +6 -6
  207. package/dist/chunk-Z334LCCX.js +4 -0
  208. package/dist/{chunk-J4KYZGHQ.js → chunk-Z6KW4WZ6.js} +20 -20
  209. package/dist/{chunk-7KIDOIPY.js → chunk-Z7RXWXR5.js} +1 -1
  210. package/dist/{chunk-WVHGHMW3.js → chunk-ZC6MXV4L.js} +1 -1
  211. package/dist/chunk-ZPHUMLET.js +1 -0
  212. package/dist/{chunk-7H7U3HC6.js → chunk-ZR2UWJIR.js} +4 -4
  213. package/dist/data/DataTable.js +1 -1
  214. package/dist/data/EntityList.js +1 -1
  215. package/dist/data/Kanban.js +1 -1
  216. package/dist/data/ListFooter.js +1 -1
  217. package/dist/data/ListLoadError.js +1 -1
  218. package/dist/data/Pagination.js +1 -1
  219. package/dist/data/ResizableTable.js +1 -1
  220. package/dist/file-intake/index.js +1 -1
  221. package/dist/forms/AlignmentGrid.js +1 -1
  222. package/dist/forms/BorderInput.js +1 -1
  223. package/dist/forms/BrandAssetEditor.js +1 -1
  224. package/dist/forms/Button.js +1 -1
  225. package/dist/forms/Calendar.js +1 -1
  226. package/dist/forms/ColorPicker.js +1 -1
  227. package/dist/forms/ComposerAttachments.js +1 -1
  228. package/dist/forms/CornersInput.js +1 -1
  229. package/dist/forms/DatePicker.js +1 -1
  230. package/dist/forms/DateRangePicker.js +1 -1
  231. package/dist/forms/DateTimePicker.js +1 -1
  232. package/dist/forms/DisplayChips.js +1 -1
  233. package/dist/forms/FilePicker.js +1 -1
  234. package/dist/forms/FormErrorSummary.js +1 -1
  235. package/dist/forms/IconButton.js +1 -1
  236. package/dist/forms/IconPicker.js +1 -1
  237. package/dist/forms/ImageFocusPoint.js +1 -1
  238. package/dist/forms/Input.js +1 -1
  239. package/dist/forms/InputNumber.d.ts +6 -0
  240. package/dist/forms/InputNumber.js +1 -1
  241. package/dist/forms/LinkPicker.js +1 -1
  242. package/dist/forms/MediaLibrary.js +1 -1
  243. package/dist/forms/MediaUploadField.js +1 -1
  244. package/dist/forms/MediaUploadGrid.js +1 -1
  245. package/dist/forms/MediaUsedInList.js +1 -1
  246. package/dist/forms/NumericKeypad.js +1 -1
  247. package/dist/forms/PictureTiles.js +1 -1
  248. package/dist/forms/PositionInput.js +1 -1
  249. package/dist/forms/RenameField.js +1 -1
  250. package/dist/forms/Segmented.js +1 -1
  251. package/dist/forms/Select.js +1 -1
  252. package/dist/forms/SidesInput.d.ts +12 -1
  253. package/dist/forms/SidesInput.js +1 -1
  254. package/dist/forms/Slider.js +1 -1
  255. package/dist/forms/Snippet.js +1 -1
  256. package/dist/forms/SplitButton.js +1 -1
  257. package/dist/forms/TagInput.js +1 -1
  258. package/dist/forms/TextToolbar.js +1 -1
  259. package/dist/forms/TimePicker.js +1 -1
  260. package/dist/forms/UnitMenu.d.ts +16 -0
  261. package/dist/forms/UnitMenu.js +1 -0
  262. package/dist/forms/WidthsBar.js +1 -1
  263. package/dist/forms/mediaLibraryMenu.js +1 -1
  264. package/dist/forms/mediaMoveItems.js +1 -1
  265. package/dist/forms/textAlign.js +1 -1
  266. package/dist/forms/useFileIntake.js +1 -1
  267. package/dist/icons/efficient-glyphs.js +1 -1
  268. package/dist/icons/efficient-looks.js +1 -1
  269. package/dist/icons/efficient-meanings.d.ts +37 -37
  270. package/dist/icons/efficient-meanings.js +1 -1
  271. package/dist/icons/efficient.js +1 -1
  272. package/dist/icons/index.js +1 -1
  273. package/dist/icons/looks/map.js +1 -1
  274. package/dist/icons/sets.js +1 -1
  275. package/dist/index.d.ts +1 -0
  276. package/dist/index.js +665 -665
  277. package/dist/locales/zh-Hans.js +1 -1
  278. package/dist/map/index.js +3 -3
  279. package/dist/markdown/index.js +1 -1
  280. package/dist/page-tabs/index.js +5 -5
  281. package/dist/pdf/index.js +1 -1
  282. package/dist/shell/Accordion.js +1 -1
  283. package/dist/shell/AppUpdateBanner.js +1 -1
  284. package/dist/shell/Avatar.js +1 -1
  285. package/dist/shell/Banner.js +1 -1
  286. package/dist/shell/Breadcrumbs.js +1 -1
  287. package/dist/shell/BudgetBar.js +1 -1
  288. package/dist/shell/Card.js +1 -1
  289. package/dist/shell/ColoredBadge.js +1 -1
  290. package/dist/shell/ConfirmDialog.js +1 -1
  291. package/dist/shell/ContainerFillChart.js +1 -1
  292. package/dist/shell/ContextMenu.js +1 -1
  293. package/dist/shell/CountBadge.js +1 -1
  294. package/dist/shell/Dialog.js +1 -1
  295. package/dist/shell/Drawer.js +1 -1
  296. package/dist/shell/DropdownMenu.d.ts +13 -2
  297. package/dist/shell/DropdownMenu.js +1 -1
  298. package/dist/shell/EditableGrid.js +1 -1
  299. package/dist/shell/EmptyState.js +1 -1
  300. package/dist/shell/GlobalSearch.js +1 -1
  301. package/dist/shell/HelpCenter.js +1 -1
  302. package/dist/shell/IconRail.js +1 -1
  303. package/dist/shell/ImageLightbox.js +1 -1
  304. package/dist/shell/ItemCount.js +1 -1
  305. package/dist/shell/LanguageSelect.js +1 -1
  306. package/dist/shell/Markdown.js +1 -1
  307. package/dist/shell/MetricBar.js +1 -1
  308. package/dist/shell/MetricBarLegend.js +1 -1
  309. package/dist/shell/MilestoneTimeline.js +1 -1
  310. package/dist/shell/PageHeader.js +1 -1
  311. package/dist/shell/PopupMenu.d.ts +1 -1
  312. package/dist/shell/PopupMenu.js +1 -1
  313. package/dist/shell/ProductionTimeline.js +1 -1
  314. package/dist/shell/ResizeHandle.js +1 -1
  315. package/dist/shell/Result.js +1 -1
  316. package/dist/shell/SearchableSelect.js +1 -1
  317. package/dist/shell/SettingReset.js +1 -1
  318. package/dist/shell/SettingRow.js +1 -1
  319. package/dist/shell/SidebarLayout.js +1 -1
  320. package/dist/shell/SidebarNav.js +1 -1
  321. package/dist/shell/SortableList.js +1 -1
  322. package/dist/shell/Statistic.js +1 -1
  323. package/dist/shell/StatusBadge.js +1 -1
  324. package/dist/shell/StepChain.js +1 -1
  325. package/dist/shell/Stepper.js +1 -1
  326. package/dist/shell/Tabs.js +1 -1
  327. package/dist/shell/TimeAgo.js +1 -1
  328. package/dist/shell/TimelineTrack.js +1 -1
  329. package/dist/shell/Tooltip.js +1 -1
  330. package/dist/shell/TopNav.js +1 -1
  331. package/dist/shell/TransferProgress.js +1 -1
  332. package/dist/shell/Tree.js +1 -1
  333. package/dist/shell/discardGuard.js +1 -1
  334. package/dist/shell/language.js +1 -1
  335. package/dist/shell/strings.d.ts +8 -0
  336. package/dist/shell/strings.js +1 -1
  337. package/dist/shell/toast.js +1 -1
  338. package/dist/telemetry/index.js +1 -1
  339. package/dist/templates/AuthScreen.js +1 -1
  340. package/dist/templates/ChatTemplate.js +1 -1
  341. package/dist/templates/CheckoutTemplate.js +1 -1
  342. package/dist/templates/DashboardTemplate.js +1 -1
  343. package/dist/templates/DataTablePage.js +1 -1
  344. package/dist/templates/EmailTemplate.js +1 -1
  345. package/dist/templates/ErrorBoundary.js +1 -1
  346. package/dist/templates/ErrorPage.js +1 -1
  347. package/dist/templates/FormLayoutPage.js +1 -1
  348. package/dist/templates/GalleryTemplate.js +1 -1
  349. package/dist/ui/index.d.ts +1 -0
  350. package/dist/ui/index.js +1 -1
  351. package/dist/version.js +1 -1
  352. package/package.json +1 -1
  353. package/dist/Calculator-OJLVM42W.js +0 -29
  354. package/dist/Files-CRQDRSFS.js +0 -121
  355. package/dist/PdfViewer-GUXUWGMG.js +0 -1
  356. package/dist/Sidebar-F7HHC5GY.js +0 -44
  357. package/dist/chunk-2YRLRMZH.js +0 -23
  358. package/dist/chunk-43MCNASD.js +0 -1
  359. package/dist/chunk-6DZGOGB2.js +0 -1
  360. package/dist/chunk-6EHPEBGP.js +0 -5
  361. package/dist/chunk-7RRJPNYN.js +0 -4
  362. package/dist/chunk-A6WZF65N.js +0 -22
  363. package/dist/chunk-BG2OL3MO.js +0 -7
  364. package/dist/chunk-BTFBXZS2.js +0 -1
  365. package/dist/chunk-BUGTNNZQ.js +0 -15
  366. package/dist/chunk-C57PNNAW.js +0 -13
  367. package/dist/chunk-EB2UE6ZR.js +0 -10
  368. package/dist/chunk-EZPSNUYR.js +0 -14
  369. package/dist/chunk-FVZXRGVM.js +0 -8
  370. package/dist/chunk-GEZ45J4Z.js +0 -2
  371. package/dist/chunk-GUIJCTFJ.js +0 -8
  372. package/dist/chunk-I64TVNHS.js +0 -6
  373. package/dist/chunk-IHPAYSTJ.js +0 -8
  374. package/dist/chunk-M54OL3YR.js +0 -2
  375. package/dist/chunk-N7YHXL2F.js +0 -3
  376. package/dist/chunk-OLVKHYHV.js +0 -9
  377. package/dist/chunk-P2C33RHT.js +0 -1
  378. package/dist/chunk-PIWC3CAC.js +0 -4
  379. package/dist/chunk-PM4Y2FMQ.js +0 -9
  380. package/dist/chunk-PVXX77MY.js +0 -6
  381. package/dist/chunk-PWYLGTZS.js +0 -1
  382. package/dist/chunk-QQ2LDC6C.js +0 -6
  383. package/dist/chunk-SZT72QMD.js +0 -28
  384. package/dist/chunk-TQWLJ5VM.js +0 -7
  385. package/dist/chunk-UDVQORQM.js +0 -19
  386. package/dist/chunk-UJJXWLHE.js +0 -2
  387. package/dist/chunk-YZR4T5FZ.js +0 -7
  388. /package/dist/{chunk-T75VCE6K.js → chunk-GMHMWDXU.js} +0 -0
@@ -0,0 +1 @@
1
+ var e={"academic-cap":"academic-cap",accent:"the ACCENT — the site's one emphasis, the phrase picked out inside a heading. Worn by `Accent` on the Text tab and by `Brand colour` on the Theme tab. ONE drawing for both, for two reasons that hold each other up. (1) `accent` is a NAMED ROLE on this site, not a coincidence of spelling: it is declared as a font role (`FONT_ROLES`) and as a colour role (`WORD_STYLE_COLOURS`). The Text tab's `Accent` sets that role's TYPEFACE; the Theme tab's `Brand colour` sets the colour it is painted in. One role, two halves — which is why one drawing serves both. (2) the Site styles Theme tab names every colour row by the ELEMENT it colours and never by a glyph meaning \"colour\" — `Text colour` wears `type`, `Label colour` wears `text-small`, `Page background` wears `page` (ThemeField ROW_ICON, card 66205). The glyph names the element; the row says what it sets. Card 66310, 2026-09-01. ⚠️ THIS CORRECTS TWO EARLIER GOES AT THIS SENTENCE, and the RULING survived both — one drawing still serves both rows and the drawing has not moved. 66310's own first entry said the two rows keep the key `accent` in one place, which is not so. es#36 replaced that with a NUMBER, and a number is the wrong shape here: counting what `accent` IS gives the role declarations above, while counting where an accent VALUE lives gives the typeface, the preset colour and — since card 66307 — the site brand colour. Both counts are true, of different things, so a figure that needs its counting rule carried beside it will be misread in a one-line entry. The structure is what does not move. Corrected on card 66315, 2026-09-01. Not \"a star\" — a star borrowed for any other row would be a second meaning on one SVG, which is the rule this set is written under",account:"a person — the account / sign-in row and the header's account icon","account-circle":"account-circle",add:"Add / plus","add-circle":"Used in shell src/apps/PomodoroTimer.tsx:412","add-person":"add-person",adjust:"adjust","align-center":"align center","align-justify":"JUSTIFY — text whose rows run edge to edge. Worn by the Justify button on the final text box's second toolbar row, beside Left, Center and Right, and by the Justify chip of the alignment strip. Three full-width rows on the same three heights the other alignment glyphs use. Decided 2026-10-06 (the design was made final that day).","align-left":"WHICH WAY content is aligned — worn by the `Alignment` row of the campaign editor's Text, Button, Badge, Divider and Social blocks, and by the storefront part panel's `align` row (efficient-shop PartSettingsPanel FIELD_ICONS). The row's own segments draw each answer; this names the question. ⚠️ The text panel v3 (GG 2026-10-15) gives the question its own glyph, `alignment`, so a row whose segments include Left no longer wears this drawing twice; once those rows move to `alignment`, this entry is the Left answer only.","align-right":"align right","align-separate":"align separate — the rows pushed apart to both edges",alignment:"WHICH WAY text is aligned — the QUESTION, worn by the `Alignment` row of the one text panel (the website editor's part panel and the campaign editor's Text block draw the same panel). The row's own segments draw each answer with `align-left`, `align-center`, `align-right` and `align-justify`; this names the question, so no answer's drawing is worn twice in one row. Three lines of text over a two-headed arrow: the text can sit anywhere from side to side. NOT `align-left`, which is the Left answer (its entry named the question too, until this split). NOT `width`, whose arrow runs between two bars and says how wide a thing is. Decided GG 2026-10-15, text panel v3.",anchor:"anchor",animation:'how a thing MOVES — the `Animation` settings tab, the second of the two tabs of every settings panel (`Design · Animation`, owner 2026-10-08, final 2026-10-10). Owner, 2026-09-11, asked for the tab himself, so that every element can have a motion. The drawing is the owner\'s own pick (2026-10-09, option C of the tab glyphs: a moving block): a block with speed lines trailing behind it, so it names MOVEMENT ITSELF rather than any one motion — Entrance, Scroll, Hover, Click and Loop are all rows under this tab. Its partner on the strip is `adjust` (sliders), the Design tab. NOT `play`, whose entry says only "play": a triangle is video PLAYBACK — this glyph WAS a triangle with motion lines until 2026-10-13, and the owner did not like it ("动画的icon 我不喜欢"). NOT `rotate`, turning a thing in place, one motion out of many. NOT `direction`, which says WHICH WAY a thing travels. NOT `hover`, the pointer resting on a card: one MOMENT which can start a motion, never the motion.',apps:"Used in shell src/shell/Desktop.tsx:1232","archive-box":"archive-box",arrow:"One meaning; heroicons ships each direction as its own file.","arrow-down":"arrow-down","arrow-left":"arrow-left","arrow-left-end-on-rectangle":"arrow-left-end-on-rectangle","arrow-long-right":"arrow-long-right","arrow-right":"arrow-right","arrow-trending-down":"arrow-trending-down","arrow-trending-up":"arrow-trending-up","arrow-up":"arrow-up","arrow-up-right":"arrow-up-right","at-symbol":"at-symbol",attach:"attach",background:"the BAND A SECTION LAYS DOWN — the section's own background, the thing other boxes sit on top of. Worn by `Section background` and `Backdrop` in the admin portal's email editor (the email editor's block config, lines 784 and 2398), both of which inherit from the theme and reset with 'Back to the theme color', and by the four section-band `Background` rows in efficient-shop's `backgroundField`. ⚠️ ITS ORIGINAL REASON IS DEAD AND IS KEPT HERE ONLY SO NOBODY REVIVES IT. This entry used to read \"the `Background` row of the section panel's `Colour` group (card 66313), whose choices are Page / Dark / Accent\". That picker is gone: card 66510 removed the choice, `ss.section-theme-picker` stopped the renderer reading the stored value, and the last 62 stored keys were cleared on 2026-09-03. A glyph outliving its stated reason is the `contrast` case — right on screen, dead why — and here it cost a real decision: PR #1456 ruled against this glyph because of that sentence and put `ground` on the four shop rows instead. ⚠️ NOT `ground`, which is the fill of the BOX the content sits in and covers this band — the two sit one line apart in the email editor's section panel, and that pair is the definition. The test is not what colour is set but WHAT SURFACE: a section's own band is `background`; a box drawn on top of it, at any level, is `ground`. Card 66315, 2026-09-01; reason replaced with a live one 2026-09-23",bag:"bag",bank:"Used in admin-portal src/pages/integrations/providerIcons.tsx:32","bars-3-bottom-left":"bars-3-bottom-left",battery:"Used in shell src/shell/Desktop.tsx:1254",beaker:"beaker",bell:"Notification bell","bell-alert":"bell-alert","bell-plus":"bell-plus",billing:"Used in admin-portal src/shell-config/nav.tsx:108","black-and-white":"colour taken out of a picture on purpose — the `Black and white` row of the three storefront photography sections and `Black and white logos` on the Logos strip. `doc/naming.md` N10.1 fixes those words and forbids `Grayscale` (owner ruling 2026-08-28), so the glyph is named for the idea the shop says out loud. ⚠️ A HALF-FILLED CIRCLE WAS DRAWN FIRST AND REJECTED: that is what `contrast` already is, and `contrast` heads the Theme tab. This is a PICTURE with one half ruled out, which is the thing the row does. Hatched rather than filled, because the house standard for this set is stroke on currentColor and no baked plate. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22","block-badge":"the BADGE block - a small word pinned on a product, like NEW. Worn by a Badge row in the Layers tree and the Badge tile. Decided 2026-09-17. NOT `tag`, which the owner ruled is the `label` field row (2026-09-05), not a badge.","block-banner":"the BANNER block - words laid over an image. Worn by a Banner row in the Layers tree and the Banner tile, in both editors. Decided 2026-09-17. NOT `image` (a picture alone) and NOT `button`.","block-box":"the BOX block - a container that holds blocks (N8.1: `Box`). The campaign editor called it Group until Lewis renamed it Box, 2026-09-17. Worn by a Box row in the Layers tree and the Box tile, in both editors. NOT `direction`, whose arrows say which way a thing travels.","block-button":"the BUTTON block - one call to action in an email. Worn by a Button row in the Layers tree and the Button tile. Decided 2026-09-17. NOT `button`, whose entry is the settings ROW for a button's own look - the row and the block are two ideas.","block-column":"one COLUMN of a Section block - the slot its blocks stand in. Worn by the `Column 1` / `Column 2` rows of the Layers tree. Decided 2026-09-17. NOT `columns`, which is three bars and answers HOW MANY columns, not which one.","block-coupon":"the COUPON CODE block - a ticket with the code each person gets. Worn by its Layers row and the Coupon code tile. Decided 2026-09-17. The dashed line is the tear line where the code sits.","block-divider":"the DIVIDER block - a rule between things, in an email and on a website page. Worn by a Divider row in the Layers tree and the Divider tile, in both editors. Decided 2026-09-17. NOT `plus-minus` or any settings row: it is the block itself.","block-footer":"the FOOTER block - the bottom of an email or of a website page, pinned last. Worn by the Footer row in the Layers tree, in both editors. Decided 2026-09-17. NOT `page` and NOT `layout`: it is the block, not the page or its settings.","block-heading":"the HEADING block - the legacy heading kind older campaigns still hold (GTS-8 has six). Worn by its Layers row. Decided 2026-09-17. NOT `type`, the T that marks text settings, and NOT `text-size`.","block-image":"Image / photo","block-included-list":"the INCLUDED LIST block - model names on the left, prices on the right, row by row. Worn by its Layers row and the Included list tile. Decided 2026-09-17. NOT `list`, which is worn by the Header panel's menu item.","block-layered-images":"the LAYERED IMAGES block - one picture laid over another. Worn by its Layers row and the Layered images tile. Decided 2026-09-17. NOT `image` (one picture) and NOT `copy` (two pages, a clipboard action).","block-product":"the PRODUCT block - one catalogue product quoted in an email, its price and its buttons (the Add tile that said `Price` becomes `Product`, Lewis 2026-09-17). Drawn as a PACKAGE: the thing sold. Worn by its Layers row and tile. NOT `dollar`, worn by the price field row, NOT `tag`, the label row, and NOT `cart`, which is buying.. ⚠️ AND IT IS ALREADY WORN IN THE SHOP, which this entry did not say until now. `GalleryProductBinding`, `GalleryShowcaseSource`, `ProductPicker` and `SpecTableSource` each draw a `Product` row with this glyph, and the storefront config's own `Product` picker joins them. One catalogue product, whether it is quoted in an email or picked in a panel. Recorded on card [FIX] The 176 Settings Rows With No Picture, 2026-09-23, because pre-existing silent reuse is still silent reuse and is worse undocumented than documented","block-product-title":"Used in admin-portal src/components/email/emailBlockIcons.tsx:145","block-section":"the SECTION block - one full-width band of an email that holds one to four columns of blocks. Worn by a Section row in the Layers tree and the Section tile. Decided 2026-09-17. NOT `layout` (the Layout settings tab) and NOT `columns` (three bars, a count of columns).","block-social":"the SOCIAL block - links to whichever social platforms the business has, never one platform's mark. Worn by a Social row in the Layers tree and the Social tile, in both editors. Decided 2026-09-17. NOT `link` (one link) and NOT `share` actions.","block-spacer":"the SPACER block - empty room between blocks, in an email and on a website page. Worn by a Spacer row in the Layers tree and the Spacer tile, in both editors. Decided 2026-09-17. NOT `gap` (the air between cards, a settings row) and NOT `padding-top`.","block-text":"the TEXT block - a run of words a person types into an email. Worn by a Text row in the Layers tree and the Text tile. Decided 2026-09-17. NOT `text-lines`, which is WORN already by the body-text field row and the Content tab (efficient-shop FieldGlyph.tsx) - a block row wearing it would be one drawing with two meanings.","block-video":"the VIDEO block - a video shown in an email as a poster with a play mark. Worn by its Layers row and the Video tile. Decided 2026-09-17. NOT `play`: a bare triangle is playback, and this is the block that holds a video.","blog-post":"one written article of a series — the `Blog posts` and `Blog post source` rows of the storefront's blog panels. An article laid out: a picture block, its headline beside it, the body beneath. ⚠️ NOT `page`, and that is the whole reason this drawing exists: `page` means a PAGE of the site and the Pages rail, one meaning by the owner's ruling of 2026-08-20, so a blog row wearing it would say a post is a page. NOT `note`, which is a short note ABOUT a thing rather than the thing, and NOT `text-lines`, which is body copy with no article around it. ⚠️ IT IS THE DENSEST DRAWING IN THE SET AND THAT IS DELIBERATE: the block-beside-lines arrangement is what separates it from `page` at 16px, and a simpler page-with-a-heading was drawn first and thrown away because it WAS `page` with an extra stroke. Card [FIX] The 28 Hand-Rolled Settings Rows, 2026-09-22",bold:"the BOLD mark — the toolbar button that writes `**words**` (Strong, ⌘B) over the selection in the copy box's formatting bar. A capital B, the letter every word processor puts on this button. One idea: the mark, not a weight setting. Decided 2026-10-02.",bolt:"bolt","book-open":"book-open",bookmark:"Used in admin-portal src/pages/Notepad.tsx:480","bookmark-square":"bookmark-square","border-all":"THE LINE ROUND A BOX, on all its sides — the `Border` row's own picture: a website Box's Border row, and the email designer's Border rows (Section, Column, the phone tab's Border, a Badge's Border). The edge drawn heavy all round, nothing inside. THE BORDER FAMILY: a border is a LINE drawn ON the box's edge, so the side or sides THIS number sets are drawn HEAVY on the edge, the other sides dashed, and nothing inside the box. ⚠️ NOT the padding family (`padding-*`: a thin side round a small inner box = the ROOM inside the edge), NOT `padding-all` (the room on all four sides), NOT `square` (a plain shape, which the email Border rows and the theme's Borders row wear today only because nothing better existed), NOT `corner` / `radius` (how round the corners are). Decided GG 2026-10-15 (Box Border: one Border control for both editors, a website Box's four sides; trigger the Hartes name block, a red line on the left of a small Box). Approved by Lewis 2026-10-15 (Box Border, answers 1-6).","border-bottom":"THE LINE ON ONE SIDE — THE BOTTOM — of a box: the fourth width box of the `Border` row while `Each side` is on. THE BORDER FAMILY: a border is a LINE drawn ON the box's edge, so the side or sides THIS number sets are drawn HEAVY on the edge, the other sides dashed, and nothing inside the box. ⚠️ NOT the padding family (`padding-*`: a thin side round a small inner box = the ROOM inside the edge): NOT `padding-bottom` (the room inside that edge). Decided GG 2026-10-15 (Box Border: one Border control for both editors, a website Box's four sides; trigger the Hartes name block, a red line on the left of a small Box). Approved by Lewis 2026-10-15 (Box Border, answers 1-6).","border-left":"THE LINE ON ONE SIDE — THE LEFT — of a box: the first width box of the `Border` row while `Each side` is on — the Hartes name block's red rule is this one side. THE BORDER FAMILY: a border is a LINE drawn ON the box's edge, so the side or sides THIS number sets are drawn HEAVY on the edge, the other sides dashed, and nothing inside the box. ⚠️ NOT the padding family (`padding-*`: a thin side round a small inner box = the ROOM inside the edge): NOT `padding-left` (the room inside that edge). Decided GG 2026-10-15 (Box Border: one Border control for both editors, a website Box's four sides; trigger the Hartes name block, a red line on the left of a small Box). Approved by Lewis 2026-10-15 (Box Border, answers 1-6).","border-right":"THE LINE ON ONE SIDE — THE RIGHT — of a box: the third width box of the `Border` row while `Each side` is on. THE BORDER FAMILY: a border is a LINE drawn ON the box's edge, so the side or sides THIS number sets are drawn HEAVY on the edge, the other sides dashed, and nothing inside the box. ⚠️ NOT the padding family (`padding-*`: a thin side round a small inner box = the ROOM inside the edge): NOT `padding-right` (the room inside that edge). Decided GG 2026-10-15 (Box Border: one Border control for both editors, a website Box's four sides; trigger the Hartes name block, a red line on the left of a small Box). Approved by Lewis 2026-10-15 (Box Border, answers 1-6).","border-top":"THE LINE ON ONE SIDE — THE TOP — of a box: the second width box of the `Border` row while `Each side` is on (left · top, then right · bottom). THE BORDER FAMILY: a border is a LINE drawn ON the box's edge, so the side or sides THIS number sets are drawn HEAVY on the edge, the other sides dashed, and nothing inside the box. ⚠️ NOT the padding family (`padding-*`: a thin side round a small inner box = the ROOM inside the edge): NOT `padding-top` (the room inside that edge). Decided GG 2026-10-15 (Box Border: one Border control for both editors, a website Box's four sides; trigger the Hartes name block, a red line on the left of a small Box). Approved by Lewis 2026-10-15 (Box Border, answers 1-6).","box-item-alignment":"WHERE EACH BLOCK SITS ACROSS THE WAY A BOX RUNS — the glyph of the `Item alignment` ROW itself (the question), beside its answers `box-x-*` / `box-y-*`. A box frame with a tall and a short block. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. Choice (a): the question has its own glyph, no arrows. NOT `align-left` (text alignment), NOT `box-justify` (the other row).","box-justify":"HOW A BOX'S BLOCKS SHARE THE WAY THEY RUN — the glyph of the `Justify` ROW itself (the question), beside its answers `box-x-*` / `box-y-*`. A box frame with three blocks in a row. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. Choice (a): the question has its own glyph, no arrows. NOT `align-separate` (the old Justify glyph), NOT `box-x-between` (one answer).","box-x-between":"ONE BLOCK AT EACH EDGE, side to side, THE MIDDLE EMPTY (`Space between`) — the `Space between` answer of a Box row that moves blocks side to side: in One row it answers `Justify`; in Stacked it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-y-between` (the same answer on the other axis), NOT `align-separate` (the old Justify row glyph, outline boxes).","box-x-center":"THE BLOCKS GATHER ON THE MIDDLE, side to side — the `Center` answer of a Box row that moves blocks side to side: in One row it answers `Justify`; in Stacked it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-y-center` (the same answer on the other axis).","box-x-end":"THE BLOCKS GATHER AT THE RIGHT EDGE — the `End` answer of a Box row that moves blocks side to side: in One row it answers `Justify`; in Stacked it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-y-end` (the same answer on the other axis).","box-x-start":"THE BLOCKS GATHER AT THE LEFT EDGE — the `Start` answer of a Box row that moves blocks side to side: in One row it answers `Justify`; in Stacked it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-y-start` (the same answer on the other axis), NOT `align-left` (text alignment).","box-x-stretch":"THE BLOCKS FILL FROM EDGE TO EDGE, side to side — the `Stretch` answer of a Box row that moves blocks side to side: in One row it answers `Justify`; in Stacked it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-y-stretch` (the same answer on the other axis).","box-y-between":"ONE BLOCK AT EACH EDGE, top to bottom, THE MIDDLE EMPTY (`Space between`) — the `Space between` answer of a Box row that moves blocks top to bottom: in Stacked it answers `Justify`; in One row it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-x-between` (the same answer on the other axis), NOT `align-separate` (the old Justify row glyph, outline boxes).","box-y-center":"THE BLOCKS GATHER ON THE MIDDLE, top to bottom — the `Center` answer of a Box row that moves blocks top to bottom: in Stacked it answers `Justify`; in One row it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-x-center` (the same answer on the other axis).","box-y-end":"THE BLOCKS GATHER AT THE BOTTOM EDGE — the `End` answer of a Box row that moves blocks top to bottom: in Stacked it answers `Justify`; in One row it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-x-end` (the same answer on the other axis).","box-y-start":"THE BLOCKS GATHER AT THE TOP EDGE — the `Start` answer of a Box row that moves blocks top to bottom: in Stacked it answers `Justify`; in One row it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-x-start` (the same answer on the other axis), NOT `align-left` (text alignment).","box-y-stretch":"THE BLOCKS FILL FROM EDGE TO EDGE, top to bottom — the `Stretch` answer of a Box row that moves blocks top to bottom: in Stacked it answers `Justify`; in One row it answers `Item alignment`. Lewis 2026-10-28, the Box icon page, v2: a Box's `Justify` and `Item alignment` rows are icon choices that turn with `Direction`. ONE family: two filled blocks, a long and a short one, and one line that says where they gather. NOT `box-x-stretch` (the same answer on the other axis).",braces:'INSERT A MERGE TAG — a word that fills in for each reader ({{first_name}}, a coupon code). Worn by the campaign designer\'s Insert button, named "Insert variable", in the text toolbar: the last cell of row 1 of the floating toolbar on the canvas and of any panel box that keeps it (`CopyBox` `lastTool`), which opens its list of tags. Two curly braces, the shape a merge tag is written in. Decided 2026-10-07; drawn as two curly braces 2026-10-20 (Lewis: "{ }", not the "(x)" of Heroicons\' `variable` it wore until then). ⛔ NOT `code` or a pair of angle brackets: nothing here is code, and the braces are the tag\'s own spelling.',breadcrumb:"the trail back up to where a shopper came from — the `Breadcrumb` row of the storefront Gallery panel's `Show / hide elements` group. NOT `sitemap`, which is the whole structure of a site rather than one path through it, and NOT `chevron`, which is a disclosure. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22",briefcase:"Used in admin-portal src/pages/integrations/providerIcons.tsx:48",bug:"bug","bug-ant":"bug-ant","building-library":"building-library","building-office-2":"building-office-2",button:'THE WORDS ON A BUTTON, and where it goes — the settings row that holds a clickable\'s text and its link, drawn by `TextLinkField` (the storefront Button block\'s `Button` row; storefront `doc/naming.md` N10.1 gives this glyph to the idea "the words on a button", and N10.3 names the row `Button`). Re-decided 2026-10-15 (Button panel v4c): it used to read "the settings row for a button\'s own look", but that look is the `Style` row, which wears `styles`. ⚠️ The email editor\'s Button block still wears this glyph on its `Style` row (efficient-admin-portal); that row is the odd one out and moves to `styles` when that block is next touched. NOT `block-button`, the Button BLOCK itself in the Layers tree (an alias of this drawing, one idea per name); NOT `button-icon`, the picture beside the words. Named by card 66310, 2026-09-01, when it read "button", a shape.',"button-arrow":"the arrow a button carries after its words — the `Arrow` row of the storefront Button block. ⚠️ IT IS NEITHER OF THE TWO GLYPHS IT SITS BETWEEN. `button` is the settings row for a button's own look, and this row is one detail inside that; `direction-right` is which way a thing SCROLLS. Here the button and its arrow are drawn together because the row is about the pair. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22","button-icon":"WHICH PICTURE a button carries beside its words, and on which side — the `Icon` row of the storefront editor's Button block (None, or one glyph from this set, then Before text / After text). Decided 2026-10-15 (Lewis approved the Button panel v4c; card [MOVE] Every Panel Part Into The Shell). NOT `button`, the button's WORDS and where they go; NOT `button-arrow`, the retired one-glyph switch this row replaces; NOT `image`, a picture the page shows. A button with a small mark at its leading end and a line for its words.",calculator:"calculator",calendar:"calendar","calendar-check":"calendar-check",camera:"camera",caption:"Used in storefront packages/web-builder/src/components/FieldGlyph.tsx:140",car:"the shopper's own vehicle, which a product either fits or does not — the `Ask for the car first` row of the storefront Alloy wheels listing and the `Vehicle fitment` row of the Product hero. ⚠️ NOT `wheel`, which is the PRODUCT this shop sells; this is the thing the product has to fit, and a panel that drew both rows with `wheel` would say the two questions are the same question. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22","card-payment":"card-payment",caret:"Used in storefront packages/web-builder/src/components/storefront-editor.css:964",cart:"Cart",case:"letter case","case-capitalized":"letter case CAPITALIZED — the first letter of EVERY WORD is a capital (CSS `text-transform: capitalize`). Worn by the `Capitalized` option of the Capitalization strip in the one text panel (As typed / Uppercase / Capitalized / Lowercase), in both editors. A capital A beside a one-storey a: the word as a capitalized word reads. NOT `case-normal` (now a dash: the text left as typed), NOT `case-upper` (`AA`), NOT `case-lower` (`aa`). Figma's letter case set, approved by Lewis; decided GG 2026-10-15, text panel v3. It takes the `Aa` drawing `case-normal` wore from 2026-10-06; the two-word `Aa Aa` drawn for it earlier the same day was too small to read at 16px and is retired.","case-lower":"letter case ALL SMALL LETTERS — `aa`, the `Lowercase` option of the Letter case buttons on the campaign editor's Text block, and of the storefront part panel's Case strip. Two one-storey a's. Decided 2026-10-06.","case-normal":"letter case LEFT AS TYPED — no change: the words keep the letters the merchant typed (no `text-transform`). Worn by the `As typed` option of the Capitalization strip in the one text panel, the Letter case row of the easel text styles, and the case buttons of the shell's TextToolbar (Normal / Uppercase / Lowercase), in both editors. A short dash: nothing is done to the letters, the way Figma draws its no-case option. Shorter than `block-divider` (a whole rule between blocks) and with no ring, so NOT `block-divider` and NOT `remove`. NOT `case-capitalized` (`Aa`), NOT `case-upper` (`AA`), NOT `case-lower` (`aa`). Meaning decided 2026-10-06; drawn as the dash by Lewis's Figma-style ruling, GG 2026-10-15, text panel v3 (it was `Aa`, which now draws `case-capitalized`).","case-upper":"letter case ALL CAPITALS — `AA`, the `Uppercase` option of the Letter case buttons on the campaign editor's Text block, and of the storefront part panel's Case strip. Two capital A's. Decided 2026-10-06.",category:"the group of products a merchant files a thing under — the `Category` row of the storefront's Product picker, Gallery showcase, Spec table and Product hero source panels. A FOLDER: the drawer several products live in. ⚠️ NOT `tag`, which is the shell's luggage tag and already draws a storefront `Label` row — a tag is one name pinned on one thing, a category is the drawer it is filed in, and a panel that drew both with one picture would say those are the same question. NOT `layers`, which is the Layers panel and means stacking order, and NOT `grid`, which is a layout of equal cells. ALSO WORN BY THE `Collection` ROW, ON PURPOSE — see the note in that row's own panel: a collection is a curated group of products and a category is the catalogue's own, but both are \"the group this is filed under\", and four separate drawings for a collection were made and thrown away because none could be told from `grid`, `layers` or this folder at 16px. Card [FIX] The 28 Hand-Rolled Settings Rows, 2026-09-22. …and the `Product type` row of a dynamic page template, which says which KIND of product (`alloy-wheel`, `tyre`) the template is written for. A category is a grouping the merchant invents and a product type is one the catalogue already has, but both answer “which drawer does this belong in”, which is what the folder draws. ⚠️ NOT `product-field`, whose sentence is “the words come from the catalogue record” — that names where a VALUE is read from, never which KIND a thing is. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23",chart:"chart","chart-bar":"A bar chart: analytics, a report. Lewis 2026-10-13: the heroicons bar chart (the set's own three bars on a base read worse beside it).","chart-bar-square":"chart-bar-square","chart-line":"Used in shell src/apps/Preview.tsx:1811",chat:"Chat","chat-bubble-left-right":"chat-bubble-left-right","chat-bubble-oval-left-ellipsis":"chat-bubble-oval-left-ellipsis",check:"Checkmark / success","check-circle":"check-circle",checkbox:"Used in shell src/apps/PomodoroTimer.tsx:642",chevron:"Disclosure — rotate for direction","chevron-double":"chevron-double","chevron-double-left":"chevron-double-left","chevron-double-right":"chevron-double-right","chevron-down":"chevron-down","chevron-left":"chevron-left","chevron-right":"chevron-right","chevron-up":"chevron-up","chevron-up-down":"Used in shell src/forms/Select.tsx:519","circle-stack":"circle-stack","clear-marks":"CLEAR MARKS — the toolbar button that takes every mark off the selection in the copy box's formatting bar (⌘⇧X), keeping the words and any link. A T with a small × at its foot: the text, with its marks crossed out. Decided 2026-10-02.",clipboard:"clipboard","clipboard-check":"Used in admin-portal src/pages/todo/TodoList.tsx:949","clipboard-document-list":"clipboard-document-list","clipboard-list":"Used in admin-portal src/pages/Dashboard.tsx:135",clock:"clock",close:"Close / dismiss / clear a value. Clear a value: the `Unlink` action in the editor's Body box empties a value connected to a live number (Stats design B, Lewis 2026-10-29); the set had no glyph for clearing a value. NOT `link-slash` (disconnect a domain).","close-circle":"close-circle",cloud:"cloud","cloud-alert":"SAVE FAILED: the last save did not reach the server, and the edits are still held. Drawn in the danger tone. Used by the save icon in the editors' bar, one glyph per save state with the words in its Tooltip (card [DESIGN] A Clearer Save In Both Editors; Lewis approved save icon option A, 2026-10-15). NOT `warning` or `error`, a problem in general; NOT `cloud-slash`, offline. The shipped cloud with an exclamation mark inside.","cloud-arrow-up":"CHANGED, NOT SAVED YET: there are edits the editor has not saved yet. Used by the save icon in the editors' bar, one glyph per save state with the words in its Tooltip (card [DESIGN] A Clearer Save In Both Editors; Lewis approved save icon option A, 2026-10-15). NOT `upload`, sending a file of yours somewhere; NOT `cloud-download`, getting something from the cloud. The shipped cloud with an arrow going up inside.","cloud-check":"SAVED: every change is saved and nothing is waiting. Drawn muted. Used by the save icon in the editors' bar, one glyph per save state with the words in its Tooltip (card [DESIGN] A Clearer Save In Both Editors; Lewis approved save icon option A, 2026-10-15). NOT `check` or `check-circle`, a step done or a choice made; NOT `cloud`, the cloud itself. The shipped cloud with a tick inside.","cloud-download":"cloud-download","cloud-pause":"AUTO-SAVE PAUSED: the person turned auto-save off, so edits wait until they save by hand. Used by the save icon in the editors' bar, one glyph per save state with the words in its Tooltip (card [DESIGN] A Clearer Save In Both Editors; Lewis approved save icon option A, 2026-10-15). NOT `pause`, pausing playback or a job; NOT `cloud-arrow-up`, edits that will save on their own. The shipped cloud with a pause mark inside.","cloud-slash":"OFFLINE: the editor cannot reach the server, so nothing can be saved until it can. Used by the save icon in the editors' bar, one glyph per save state with the words in its Tooltip (card [DESIGN] A Clearer Save In Both Editors; Lewis approved save icon option A, 2026-10-15). NOT `signal-slash`, no network signal in general; NOT `cloud-alert`, a save that failed. The shipped cloud with a slash across it.",code:"inline CODE — words drawn in a fixed-width face. Worn by the `Code` button of the shell TextToolbar's row 1 (opt-in; the chat composer offers it), and by the shell's DevIndicator.","code-bracket":"code-bracket",collapse:"collapse","collapse-all":"Used in easel src/screen/components/ScreenChrome.tsx:257","column-gap":"the air between columns SIDE BY SIDE — the `Gap between columns` row of the campaign editor's Section settings. Decided 2026-09-17. The GAP is the subject: two short upright bars with an arrowed space between them, drawn like `width`'s arrows. NOT `gap`, which is the air between STACKED things (the `Space between items` row wears that), and NOT `block-column`, whose two boxes the first draft read as at 16px (GG, 2026-09-17).","column-widths":"how the width is SHARED between a section's columns — the `Column widths` row of the campaign editor's Section settings (a ratio at two columns, shares at three). Decided 2026-09-17. NOT `columns`, which answers HOW MANY, and NOT `block-column`, a block kind that never wears a settings row.. …and the storefront's `Positions` row, where a block in a grid says how many CELLS it spans (`Auto`, `1 position`, `2 positions`, …). A share and a span are two answers to ONE question — how much of a multi-column row this thing takes — and the arrow across the bars draws the question rather than either answer. ⚠️ NOT `columns`, which is a COUNT of them; the two are told apart at 16px by that arrow. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23",columns:"columns",company:"company",compose:"compose",contrast:"the Theme tab of the Site styles panel — where a site's one palette is set. ⚠️ THIS MEANING WAS REWRITTEN BY CARD 66310, 2026-09-01: it used to say the tab held light/dark pairs, and cards 66238/66239 deleted that — a theme is ONE FLAT palette now. The drawing did not move and does not need to; the filled half disc reads as TONE, which is what a palette sets. The fill is justified in `from` below and stays",cookie:"cookie",copied:"copied",copy:'put this block on the clipboard so it can be pasted somewhere else — the `Copy` row (⌘C) of the block right-click menu the owner approved 2026-08-31. NOT `copy-to-page`, whose meaning is already "Copy to another page" and which names a DESTINATION rather than the clipboard. NOT `duplicate`, which sits two rows below this one in the same menu and makes a second block in place at once without ever touching the clipboard. Card 66400.a, 2026-09-02',"copy-style":"take a component's LOOK so it can be put on another one — the `Copy style` row (⌥⌘C) of the right-click menu in both editors, the campaign editor's block menu and the website editor's node menu. Decided 2026-09-19 (card [ADD] Copy Style And Paste Style; GG: one meaning per glyph, so it is not `copy`). The brush is the style; the back sheet is `copy`'s own, so the pair reads as \"copy, but the look\". NOT `copy`, which takes the whole block, and NOT `styles`, which opens the site's Styles panel.","copy-to-page":"Copy to another page",corner:"the `Which corners` row in a section's Style > Shape group, on the storefront editor","count-up":"A NUMBER COUNTS UP from 0 to its value when it scrolls into view — the `Count up numbers` row of a Text block's Animation tab (Lewis 2026-10-27, on the new-blocks page: no Number block; one setting on the Text block instead). The motion is the storefront's one count-up, web-builder `useCountUp`, which the Stats figures already use. A small number sign with an arrow rising beside it. NOT `hash` (a number or its unit, with no motion) and NOT `numbered-list` (1. 2. 3. before lines).",crop:"Used in shell src/apps/ImageAnnotator.tsx:573","crop-bottom":"HOW MUCH OF THE BOTTOM OF A PICTURE IS CUT AWAY, in px — the bottom box (`Each side` on) of the `Crop` row in the campaign editor's Layered images block (a `SidesInput` with `glyphs=\"crop\"`). Lewis 2026-10-21 (Layered images v3). Drawn in the sides family's grammar: the picture is a dashed square, and the cut is a heavy line across the bottom, running past the square like a crop mark. ⚠️ NOT `padding-*`, the room INSIDE a box (a small box drawn inside). NOT `border-*`, a line ON the edge. NOT `crop`, the image annotator's crop tool.","crop-left":"HOW MUCH OF THE LEFT SIDE OF A PICTURE IS CUT AWAY, in px — the left box (`Each side` on) of the `Crop` row in the campaign editor's Layered images block (a `SidesInput` with `glyphs=\"crop\"`). Lewis 2026-10-21 (Layered images v3). Drawn in the sides family's grammar: the picture is a dashed square, and the cut is a heavy line across the left side, running past the square like a crop mark. ⚠️ NOT `padding-*`, the room INSIDE a box (a small box drawn inside). NOT `border-*`, a line ON the edge. NOT `crop`, the image annotator's crop tool.","crop-left-right":"HOW MUCH OF THE LEFT AND RIGHT SIDES, AS ONE NUMBER, OF A PICTURE IS CUT AWAY, in px — the first box (`Each side` off) of the `Crop` row in the campaign editor's Layered images block (a `SidesInput` with `glyphs=\"crop\"`). Lewis 2026-10-21 (Layered images v3). Drawn in the sides family's grammar: the picture is a dashed square, and the cut is a heavy line across both sides, running past the square like a crop mark. ⚠️ NOT `padding-*`, the room INSIDE a box (a small box drawn inside). NOT `border-*`, a line ON the edge. NOT `crop`, the image annotator's crop tool.","crop-right":"HOW MUCH OF THE RIGHT SIDE OF A PICTURE IS CUT AWAY, in px — the right box (`Each side` on) of the `Crop` row in the campaign editor's Layered images block (a `SidesInput` with `glyphs=\"crop\"`). Lewis 2026-10-21 (Layered images v3). Drawn in the sides family's grammar: the picture is a dashed square, and the cut is a heavy line across the right side, running past the square like a crop mark. ⚠️ NOT `padding-*`, the room INSIDE a box (a small box drawn inside). NOT `border-*`, a line ON the edge. NOT `crop`, the image annotator's crop tool.","crop-top":"HOW MUCH OF THE TOP OF A PICTURE IS CUT AWAY, in px — the top box (`Each side` on) of the `Crop` row in the campaign editor's Layered images block (a `SidesInput` with `glyphs=\"crop\"`). Lewis 2026-10-21 (Layered images v3). Drawn in the sides family's grammar: the picture is a dashed square, and the cut is a heavy line across the top, running past the square like a crop mark. ⚠️ NOT `padding-*`, the room INSIDE a box (a small box drawn inside). NOT `border-*`, a line ON the edge. NOT `crop`, the image annotator's crop tool.","crop-y":"HOW MUCH OF THE TOP AND BOTTOM, AS ONE NUMBER, OF A PICTURE IS CUT AWAY, in px — the second box (`Each side` off) of the `Crop` row in the campaign editor's Layered images block (a `SidesInput` with `glyphs=\"crop\"`). Lewis 2026-10-21 (Layered images v3). Drawn in the sides family's grammar: the picture is a dashed square, and the cut is a heavy line across the top and the bottom, running past the square like a crop mark. ⚠️ NOT `padding-*`, the room INSIDE a box (a small box drawn inside). NOT `border-*`, a line ON the edge. NOT `crop`, the image annotator's crop tool.","cube-transparent":"cube-transparent",cursor:"Used in shell src/apps/ImageAnnotator.tsx:11","cursor-arrow-rays":"cursor-arrow-rays","cursor-click":"Used in shell src/apps/Preview.tsx:1953",dashboard:"dashboard",date:"Used in storefront packages/web-builder/src/components/FieldGlyph.tsx:129",desktop:"Desktop",detach:"DETACH FROM SHARED: this page takes its own copy of a shared section, and the other pages keep the shared one. The `Detach from shared` row of a shared section's menu. The two links of `shared`, pulled apart, with the break marked between them. NOT `link-slash` (disconnect a domain), NOT `trash` (the section stays on the page). Lewis approved the Shared section design v4, 2026-10-21.",diagram:"a measured drawing of a product rather than a photograph of it — the `Dimension diagram` row of the storefront Spec table. The object ruled on two sides. ⚠️ A CIRCLE OVER A DIMENSION LINE WAS DRAWN FIRST AND THROWN AWAY: at 16px a circle above a wide horizontal line is a head and shoulders, and the glyph read as a person. NOT `image`, which is a photograph, and NOT `width` or `height`, which are single settings a merchant TYPES; this is a picture the shopper is shown. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22",direction:"which way this thing travels — the heading a merchant picks for a section's own motion. ⚠️ DRAWN FOR the `Scroll direction` row on the Scrolling Bar section AND NOT WORN BY IT. efficient-shop's `doc/naming.md` N10.1 gives the `Direction` idea a DASH in its Glyph column, and names `Direction` itself as one of the two reasons a row gets that dash: it is a MODIFIER, not a thing, and a modifier takes no leading glyph. So that row ships with no mark beside its label, and that is CORRECT rather than an omission — which is the whole reason this sentence is here, so the next reader does not file a bug against a row that is drawn the way it was decided. The marks a merchant actually presses are `direction-left`, `direction-right`, `direction-up` and `direction-down`, inside the control, and those four ARE worn. This glyph therefore has the same standing as `button`: drawn, correct, and not wired to a row. SS seat, 2026-09-11, recording that its own canvas drew a leading glyph in the field head and the naming table is what governs. ⚠️ AND IT NEVER HEADED THE HERO'S OVERLAY ROW, though it was briefed as if it did. The SS seat settled that row as a PLACEMENT on 2026-09-11: a lit cell there means where the DARK SITS, which is one of nine positions, which is what this shell's 3×3 grid already means at every one of its call sites — so that row draws the ordinary dots and wants nothing from this set. Both withdrawn claims are recorded rather than deleted, because a glyph that was once said to head a row is the first thing a later reader puts back. NOT `move-up` and NOT `move-down`, which REORDER a block inside its parent's list — card 66400.a's entries already say in writing that they do not scroll a view, which is exactly the thing this idea DOES say, so those are the first two glyphs a borrower will reach for and the two that must be refused hardest. NOT `chevron`, which is disclosure: its own meaning reads \"rotate for direction\", and that sentence is the one a borrower will read as permission — a chevron is turned to point AT the thing it opens, it never says which way anything travels. NOT `width`, which is a SPAN — how wide the content column may grow — and is double-headed for exactly that reason; a span names an extent, this names a heading. Owner, 2026-09-11","direction-down":"the direction a marquee travels — the bar runs downwards, so its content walks towards the bottom edge. Worn by the BOTTOM cell of the `Scroll direction` control on the Scrolling Bar section, which is the shell's 3×3 placement grid with four live cells, each drawing an arrow in place of the grid's dot. One of a family of four, and the family is one drawing turned: `direction-right` rotated a quarter turn at a time. ⚠️ NOT `move-up` and NOT `move-down`, and that refusal is the reason this entry is long. Those two are arrows, they are already in this set, and they mean the one thing these four must never be read as — REORDERING a block inside its parent's list, which their own entries say does not scroll a view. An arrow here that did not refuse them by name would be borrowed by one within a release. NOT `chevron`, which is disclosure and is turned to point AT the thing it opens. NOT `direction`, which is the row's LEADING glyph — the mark beside the label saying the row is about travel at all — where these four are the ANSWERS inside the control. Owner, 2026-09-11","direction-left":"the direction a marquee travels — the bar runs leftwards, so its content walks towards the left edge. Worn by the LEFT cell of the `Scroll direction` control on the Scrolling Bar section, which is the shell's 3×3 placement grid with four live cells, each drawing an arrow in place of the grid's dot. One of a family of four, and the family is one drawing turned: `direction-right` rotated a quarter turn at a time. ⚠️ NOT `move-up` and NOT `move-down`, and that refusal is the reason this entry is long. Those two are arrows, they are already in this set, and they mean the one thing these four must never be read as — REORDERING a block inside its parent's list, which their own entries say does not scroll a view. An arrow here that did not refuse them by name would be borrowed by one within a release. NOT `chevron`, which is disclosure and is turned to point AT the thing it opens. NOT `direction`, which is the row's LEADING glyph — the mark beside the label saying the row is about travel at all — where these four are the ANSWERS inside the control. Owner, 2026-09-11","direction-right":"the direction a marquee travels — the bar runs rightwards, so its content walks towards the right edge. Worn by the RIGHT cell of the `Scroll direction` control on the Scrolling Bar section, which is the shell's 3×3 placement grid with four live cells, each drawing an arrow in place of the grid's dot. One of a family of four, and the family is one drawing turned: `direction-right` rotated a quarter turn at a time. ⚠️ NOT `move-up` and NOT `move-down`, and that refusal is the reason this entry is long. Those two are arrows, they are already in this set, and they mean the one thing these four must never be read as — REORDERING a block inside its parent's list, which their own entries say does not scroll a view. An arrow here that did not refuse them by name would be borrowed by one within a release. NOT `chevron`, which is disclosure and is turned to point AT the thing it opens. NOT `direction`, which is the row's LEADING glyph — the mark beside the label saying the row is about travel at all — where these four are the ANSWERS inside the control. Owner, 2026-09-11","direction-up":"the direction a marquee travels — the bar runs upwards, so its content walks towards the top edge. Worn by the TOP cell of the `Scroll direction` control on the Scrolling Bar section, which is the shell's 3×3 placement grid with four live cells, each drawing an arrow in place of the grid's dot. One of a family of four, and the family is one drawing turned: `direction-right` rotated a quarter turn at a time. ⚠️ NOT `move-up` and NOT `move-down`, and that refusal is the reason this entry is long. Those two are arrows, they are already in this set, and they mean the one thing these four must never be read as — REORDERING a block inside its parent's list, which their own entries say does not scroll a view. An arrow here that did not refuse them by name would be borrowed by one within a release. NOT `chevron`, which is disclosure and is turned to point AT the thing it opens. NOT `direction`, which is the row's LEADING glyph — the mark beside the label saying the row is about travel at all — where these four are the ANSWERS inside the control. Owner, 2026-09-11",document:"document","document-check":"document-check","document-magnifying-glass":"document-magnifying-glass",dollar:"dollar",dot:"Used in admin-portal src/shell-config/nav.tsx:37",download:"download",drag:"Drag handle",drop:"a COLOUR, where the row is named for the colour itself rather than for the element it paints — worn by the `Divider` colour row of the campaign editor's Email styles and by its Divider block's `Color`. The set names a colour by its ELEMENT wherever it can (`text-color`, `ground`, `link`); this is the answer where there is no element to name.",duplicate:"Duplicate — owner pick 08-20, two-pages form",duration:"HOW LONG A MOTION LASTS — the ONE shared `Duration` row of the website editor's Animation tab, worn wherever a motion is picked: under `Entrance` (a section), under `Count up numbers` (a Text block) and under `Loop` = Scroll (a Box). Lewis 2026-10-27: Count up gets the switch PLUS Duration, and Duration is one row with one scale (Short / Normal / Long) for every motion, built once in one animation module. It also replaces the old Scrolling Bar's `Scroll duration` row, which wore `clock`. An hourglass: time that runs out. NOT `clock`, which stays the popup's `Delay` (how long before a thing starts).",edit:"edit",email:"email",emphasis:"the EMPHASIS mark — the toolbar button that writes `==words==` over the selection in the copy box's formatting bar: the phrase painted in the brand accent colour. A diamond, the ◆ the bar has shown for this mark since the campaign designer first drew it. Decided 2026-10-02. (retired by Lewis 2026-10-10; goes when nothing draws it)",enter:"SEND WHAT WAS WRITTEN BY PRESSING ENTER — the ↵ at the end of a chat's message box, which sends on a click and says that Enter does too (the assistant chat's composer; Victor Mau 2026-10-27: the message box looks like Claude's, with no Send button). NOT `send` (a paper plane, the labelled Send of a form or a mail) and NOT `reply` (answer a note on a timeline).",eraser:"eraser",error:"error",expand:"expand",external:"Leaves this surface",eye:"Show","eye-off":"Hide","face-smile":"face-smile",filter:"filter",finish:"THE FINISHES A PRODUCT IS OFFERED IN — the swatch row a shopper picks a colour from. Worn by the `Finishes` row of the `Show on a card` group, on the storefront editor's Product Listing and Product Grid sections, which says whether a card draws that row at all (card [ADD] Choose What A Product Card Shows, 2026-09-21). Three swatches, because the idea is a CHOICE between finishes and a single swatch is just a colour. ⚠️ IT IS NOT `drop`, which is one colour where the row is named for the colour itself; not `accent`, which is the site's ONE emphasis rather than a set to pick from; not `contrast`, which is the tone of a whole palette; and not `theme`. Those four all answer \"what colour is this thing\"; this answers \"which of these does the shopper choose\".. …and the Spec Table's `Finish` row, where a MERCHANT picks which of a linked product's finishes the table should describe. Same subject — the finishes a product is offered in — seen from the other side of the editor. ⚠️ AND DELIBERATELY NOT THE `Opening filter`'s `Finish`, one line away in the same vocabulary, which carries NO glyph at all by the owner's facet ruling of 2026-08-29: a facet's options grow out of the merchant's catalogue, so an icon-per-facet queue never empties. Two rows, one drawn and one bare, written here where somebody is standing rather than left to be discovered. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23",fire:"fire",flag:"flag","flag-au":"Australia, as its flag — one country (or region) a shopper picks in the storefront's country selector. A FLAG, in its own colours, not a line glyph: the one set's exception to currentColor (owner 2026-10-17, simplified real flags), and the one 3:2 drawing (24 by 16 viewBox). NOT `flag`, which is a plain flag glyph, and NOT `globe`, which is the selector row itself.","flag-ca":"Canada, as its flag — one country (or region) a shopper picks in the storefront's country selector. A FLAG, in its own colours, not a line glyph: the one set's exception to currentColor (owner 2026-10-17, simplified real flags), and the one 3:2 drawing (24 by 16 viewBox). NOT `flag`, which is a plain flag glyph, and NOT `globe`, which is the selector row itself.","flag-eu":"the European Union (the euro region), as its flag — one country (or region) a shopper picks in the storefront's country selector. A FLAG, in its own colours, not a line glyph: the one set's exception to currentColor (owner 2026-10-17, simplified real flags), and the one 3:2 drawing (24 by 16 viewBox). NOT `flag`, which is a plain flag glyph, and NOT `globe`, which is the selector row itself.","flag-gb":"the United Kingdom, as its flag — one country (or region) a shopper picks in the storefront's country selector. A FLAG, in its own colours, not a line glyph: the one set's exception to currentColor (owner 2026-10-17, simplified real flags), and the one 3:2 drawing (24 by 16 viewBox). NOT `flag`, which is a plain flag glyph, and NOT `globe`, which is the selector row itself.","flag-nz":"New Zealand, as its flag — one country (or region) a shopper picks in the storefront's country selector. A FLAG, in its own colours, not a line glyph: the one set's exception to currentColor (owner 2026-10-17, simplified real flags), and the one 3:2 drawing (24 by 16 viewBox). NOT `flag`, which is a plain flag glyph, and NOT `globe`, which is the selector row itself.","flag-us":"the United States, as its flag — one country (or region) a shopper picks in the storefront's country selector. A FLAG, in its own colours, not a line glyph: the one set's exception to currentColor (owner 2026-10-17, simplified real flags), and the one 3:2 drawing (24 by 16 viewBox). NOT `flag`, which is a plain flag glyph, and NOT `globe`, which is the selector row itself.",folder:"folder","folder-open":"folder-open","folder-plus":"folder-plus",forward:"Used in admin-portal src/pages/mail/MessageCard.tsx:182","full-width":"how far a picture REACHES — the `Width` row (Default / Full width) of the campaign editor's Image block. Decided 2026-09-17. A band running edge to edge between two end walls. NOT `width`, a plain measure with two arrowheads, which says how wide rather than how far it reaches.",gap:"the air between two cards — the `Card gap` row on the storefront's Site styles ▸ Basics tab, beside `Corners`. …and the Box's block-spacing row, which is the same air one tier down: the room between the BLOCKS a merchant stacks inside a box rather than between two cards in a grid. One idea — the space between siblings — at two scales, which is why one drawing serves both rather than the shop drawing a second. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23 …AND THE TICKER'S `Join` ROW, which makes THREE SCALES for one idea: between two cards, between the blocks inside a box, and between a section and the one above or below it. ⚠️ AND `Join` SETS THE SAME THING BY CLOSING IT. `Nothing` / `Section above` / `Section below` picks which seam disappears, which reads at first glance like a different question — it is not. The space between siblings is what is being set either way, and zero is one of its answers. Written down because somebody will otherwise read `Join` as adjacency or as a border and reach for another drawing. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23",gem:"Used in admin-portal src/take/ConsentGate.tsx:297",gift:"gift",globe:"a globe — the country / region selector row",grid:"Grid",ground:"the fill of the BOX THE CONTENT SITS IN — the ground under the content, at whatever level the box is. Worn at every level today, and they are one idea, not several: the `Background` row under `Surfaces` in a theme's colour sheet (the row card 66510 renamed from `Page background` when a theme stopped colouring a page and started colouring a SECTION); in the admin portal's email editor, `Card color` (block config, line 684), `Content background` (:790, hinted \"Covers the section color, but not its image.\"), `Email body` (:2404), a button's `Fill color` and `Zebra rows`, and `Column background` (ColumnLookControls.tsx:193, a SwatchRow); and in the shop, `Image background`, the fill of the well behind a product card's picture — a box inside a card inside a section. `Card color` is the closest precedent for that last one: a CARD's own fill already wears this glyph in shipped code. Level is not meaning: a new glyph per level would name WHERE the box is rather than WHAT the row sets, which is the `drop` / `styles` fault in this file's own rule. ⚠️ NOT `background`, AND THE REASON PRINTED HERE UNTIL 2026-09-23 WAS A GHOST. It said `background` meant the section panel's Page / Dark / Accent picker — but card 66510 removed that choice, `ss.section-theme-picker` stopped the renderer reading it, and [FIX] Section Theme Colours cleared the last 62 stored keys on 2026-09-03. Nothing had worn that meaning for three weeks. Ruling against a control that no longer exists is how the same wrong decision gets made twice, and it was: PR #1456 read that sentence and put THIS glyph on the four section-band `Background` rows. The live distinction is in efficient-admin-portal's email editor, one line apart under a comment citing this file (block config, line 781): `Section background` wears `background`, `Content background` wears `ground`, and the hint says why — \"Covers the section color, but not its image.\" `background` is the band a section lays down; `ground` is the fill of the box that covers it. NOT `page`, which carries an owner ruling (2026-08-20) pinning it to the page and the Pages rail — the meaning this row stopped having, which is the whole reason this glyph exists. NOT `layout` and NOT `square`, its two siblings in the same `Surfaces` group — `Panels & cards` and `Borders`. ⚠️ AND IT IS NOT CALLED `surface`, which is the obvious name and the wrong one: `surface` is already the shop's stored colour KEY for `Panels & cards`, the row directly below this one, so a glyph of that name would sit on the one row in the group it does not name — the same fault as `page` on this row, committed again one line down. Card 66511, 2026-09-02; wearers and the ghost corrected 2026-09-23",hand:"Used in admin-portal src/pages/todo/TodoList.tsx:956","hand-thumb-up":"hand-thumb-up",hash:"a NUMBER or its unit — worn by the `Measure length in` row (px / %) of the campaign editor's Divider, which picks what the length beside it is counted in.",headquarters:'the one office of several that is the main one — the `HQ` row of each office in the storefront Footprint section. The star is what separates it from a plain building: this glyph never means "an office", it means "THE office". NOT `globe`, which is the country / region selector. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22',heart:"heart",height:"how TALL a thing is — the `Min height` row of the campaign editor's Column settings. Decided 2026-09-17. `width` stood upright, so the pair reads as one family. NOT `width`, which is side to side.",help:"help","help-off":"Used in shell src/apps/Browser.tsx:450",hexagon:"Used in shell .design-sync/previews/PageHeader.tsx:8",home:"home",hover:"the pointer resting on a card — the `Hover effect` row on the storefront's Site styles ▸ Basics tab, beside `Corners`","hover-lift":"THE PART RISES, with a shadow under it, when the pointer rests on it. Worn by the `Lift` answer of the `Hover effect` row. The frame with an arrow up inside it, and a short shadow line under it. NOT `shadow` (the `Card shadow` row: how deep a card always sits). One of the five answers of the ONE `Hover effect` setting in the editors' Animation tab (backlog 2026-10-23: None / Next image / Rotate / Zoom / Lift), on the part that moves (a product card, a gallery card, an image). Lewis 2026-10-27: the answers are ABSTRACT, never a wheel or any product, because every tenant sells something different. One grammar for all five: the same plain picture frame, plus one mark that says the motion. NOT `hover`, which is the row's own glyph and asks the question.","hover-next-image":"THE NEXT PICTURE COMES IN when the pointer rests on the part: a product card shows its second photo. Worn by the `Next image` answer of the `Hover effect` row. The frame, a second frame behind it, and a sideways arrow inside. NOT `images` (several pictures as content) and NOT a slideshow's arrows (`slide-arrows-*`). One of the five answers of the ONE `Hover effect` setting in the editors' Animation tab (backlog 2026-10-23: None / Next image / Rotate / Zoom / Lift), on the part that moves (a product card, a gallery card, an image). Lewis 2026-10-27: the answers are ABSTRACT, never a wheel or any product, because every tenant sells something different. One grammar for all five: the same plain picture frame, plus one mark that says the motion. NOT `hover`, which is the row's own glyph and asks the question.","hover-none":"NO HOVER EFFECT: the picture stays still when the pointer rests on it. Worn by the `None` answer of the `Hover effect` row. The plain frame alone, with no motion mark. NOT `shape-rect` (a drawing tool's rectangle) and NOT `image` (a picture as content). One of the five answers of the ONE `Hover effect` setting in the editors' Animation tab (backlog 2026-10-23: None / Next image / Rotate / Zoom / Lift), on the part that moves (a product card, a gallery card, an image). Lewis 2026-10-27: the answers are ABSTRACT, never a wheel or any product, because every tenant sells something different. One grammar for all five: the same plain picture frame, plus one mark that says the motion. NOT `hover`, which is the row's own glyph and asks the question.","hover-rotate":"THE PICTURE TURNS when the pointer rests on the part. Worn by the `Rotate` answer of the `Hover effect` row; it replaces the old `Rotate on hover` switch. The frame with a half-circle arrow turning over its top. NOT `rotate` (the action that turns a picture by a quarter in an image tool) and NOT `refresh`. One of the five answers of the ONE `Hover effect` setting in the editors' Animation tab (backlog 2026-10-23: None / Next image / Rotate / Zoom / Lift), on the part that moves (a product card, a gallery card, an image). Lewis 2026-10-27: the answers are ABSTRACT, never a wheel or any product, because every tenant sells something different. One grammar for all five: the same plain picture frame, plus one mark that says the motion. NOT `hover`, which is the row's own glyph and asks the question.","hover-zoom":"THE PICTURE GROWS A LITTLE inside its part when the pointer rests on it. Worn by the `Zoom` answer of the `Hover effect` row. The frame with two arrows pointing out from opposite corners. NOT `expand` (open a thing bigger, no frame) and NOT `zoom-in` (the view's magnifier). One of the five answers of the ONE `Hover effect` setting in the editors' Animation tab (backlog 2026-10-23: None / Next image / Rotate / Zoom / Lift), on the part that moves (a product card, a gallery card, an image). Lewis 2026-10-27: the answers are ABSTRACT, never a wheel or any product, because every tenant sells something different. One grammar for all five: the same plain picture frame, plus one mark that says the motion. NOT `hover`, which is the row's own glyph and asks the question.","icon-after-text":'THE PICTURE SITS AFTER THE WORDS it goes with — the `Icon after text` choice under the storefront editor\'s Button `Icon` row (an icon-only Segmented: before / after). Decided 2026-10-15 (Lewis approved the Button panel v4c; card [MOVE] Every Panel Part Into The Shell), after Lewis asked for the two words to be pictures. The small mark is the one `button-icon` draws, so the pair reads as "that picture, on this side". NOT `icon-before-text`, its mirror; NOT `align-left` / `align-right`, which move the words themselves; NOT `direction-left` / `direction-right`, which way a thing travels. A small four-point mark after two lines of words.',"icon-at-end":"THE PICTURE SITS AT THE FAR END of a full-width button, the words at its start — the `Icon at the far end` choice, third on the storefront editor's Button `Icon` row (an icon-only Segmented: before / after / at the far end), shown only while the button's `Width` is `Fill`. Decided 2026-10-26 (GG for Lewis, the Box gaps redo: the old CTA Heading's full-width bar draws its words at the start and its arrow at the end). The frame is the button, so the picture reads as \"words here, picture at the edge\". NOT `icon-after-text`, the picture right after the words; NOT `icon-before-text`, its mirror; NOT `align-separate`, which is a Box's `Justify` (the blocks of a row pushed apart). A button frame with one line of words at its start and a small four-point mark at its end.","icon-before-text":'THE PICTURE SITS BEFORE THE WORDS it goes with — the `Icon before text` choice under the storefront editor\'s Button `Icon` row (an icon-only Segmented: before / after). Decided 2026-10-15 (Lewis approved the Button panel v4c; card [MOVE] Every Panel Part Into The Shell), after Lewis asked for the two words to be pictures. The small mark is the one `button-icon` draws, so the pair reads as "that picture, on this side". NOT `icon-after-text`, its mirror; NOT `align-left` / `align-right`, which move the words themselves; NOT `direction-left` / `direction-right`, which way a thing travels. A small four-point mark before two lines of words.',identification:"identification",image:"Image / photo","image-off":"image-off",images:"images",inbox:"inbox",info:"info",italic:"the ITALIC mark — the toolbar button that writes `_words_` (⌘I) over the selection in the copy box's formatting bar. A slanted capital I with its two serifs, the button every word processor draws. Decided 2026-10-02.",key:"key",layers:"Layers",layout:"page layout — the Layout settings bucket, not columns. …AND THE ROWS THAT ASK IT DIRECTLY: the `Layout`, `Arrangement` and `Card layout` rows of the storefront editor, which pick which arrangement a section draws. The bucket and the row are one idea at two scales — the bucket holds the questions about how a section is laid out, and these rows are that question asked directly. ⚠️ STILL NOT `columns`, which is a COUNT of them, and still not `grid`, which is equal cells: the distinction the sentence above draws is unchanged. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23","letter-spacing":"letter spacing",lightbulb:"lightbulb","line-between":"a rule drawn BETWEEN two columns of content — the `Line between columns` row of the campaign editor's Section settings. Decided 2026-09-17. An upright rule with words on both sides. NOT `block-divider`, the Divider block kind, which is a flat line across.. …and the storefront's `Separator` row, which draws the same rule between ITEMS in a run rather than between columns. The picture is the rule itself, so what it divides is the row's business and not the glyph's. ⚠️ NOT `block-divider`, the divider BLOCK kind, which never heads a settings row — the refusal above stands. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23","line-dashed":"the DASHED option of a Line style row — the line drawn as dashes. It is one of the three answers of a `Line style` row (Solid / Dashed / Dotted): the campaign editor's Divider `Line style`, and the `Style` of every Border row (a Section's Border and its Line between columns, a Column's Border, the Phone tab's Border). The ROW is `line-style` (the three stacked); each answer is ONE horizontal line drawn the way it chooses, the whole width of the glyph (3 to 21 on the 24 grid), so the three answers line up as one swatch family. The option's word (Solid / Dashed / Dotted) is its tooltip and its accessible name. Three dashes with clear gaps, readable at 14px. NOT `more` (three round dots, the ellipsis) and NOT `line-dotted` (round dots, not dashes). NOT `line-style` (the question, three lines stacked). Decided GG 2026-10-15 (Lewis: the Solid / Dashed / Dotted row becomes icons).","line-dotted":"the DOTTED option of a Line style row — the line drawn as dots. It is one of the three answers of a `Line style` row (Solid / Dashed / Dotted): the campaign editor's Divider `Line style`, and the `Style` of every Border row (a Section's Border and its Line between columns, a Column's Border, the Phone tab's Border). The ROW is `line-style` (the three stacked); each answer is ONE horizontal line drawn the way it chooses, the whole width of the glyph (3 to 21 on the 24 grid), so the three answers line up as one swatch family. The option's word (Solid / Dashed / Dotted) is its tooltip and its accessible name. Five small dots, closer and smaller than an ellipsis, so the row reads as a line and not as a menu. NOT `more` (three bigger dots, the ellipsis that opens a menu) and NOT `line-dashed`. NOT `line-style` (the question, three lines stacked). Decided GG 2026-10-15 (Lewis: the Solid / Dashed / Dotted row becomes icons).","line-solid":"the SOLID option of a Line style row — the line drawn as one unbroken stroke. It is one of the three answers of a `Line style` row (Solid / Dashed / Dotted): the campaign editor's Divider `Line style`, and the `Style` of every Border row (a Section's Border and its Line between columns, a Column's Border, the Phone tab's Border). The ROW is `line-style` (the three stacked); each answer is ONE horizontal line drawn the way it chooses, the whole width of the glyph (3 to 21 on the 24 grid), so the three answers line up as one swatch family. The option's word (Solid / Dashed / Dotted) is its tooltip and its accessible name. NOT `block-divider` (the Divider BLOCK, a shorter rule, 5 to 19, worn in Layers and on the Divider tile, never in a settings row) and NOT `case-normal` (the As typed dash of the Capitalization strip, 7.5 to 16.5, half this length): this line runs the whole width, the longest plain line in the set, and is only ever drawn beside its Dashed and Dotted siblings of the same length. NOT `line-style` (the question, three lines stacked). Decided GG 2026-10-15 (Lewis: the Solid / Dashed / Dotted row becomes icons).","line-spacing":"LINE SPACING — the room between the lines of ONE paragraph, in % of the font size. Worn by the `Line spacing` number cell of the text box and the one text panel (efficient-easel `COPY_CELLS.lineHeight`), in both editors. Four evenly spaced lines with a two-headed upright arrow beside them: the same room between every line of one block. NOT `paragraph-spacing`, the room between one paragraph and the next (two groups of lines, the arrow in the gap between them). NOT `text-lines`, which is worn by the body-text field row and the Content tab and only shows lines. NOT `height`, how tall a thing is. Decided GG 2026-10-15, text panel v3.","line-style":"WHICH DASH a rule is drawn with — the `Line style` row (Solid / Dashed / Dotted) of the campaign editor's Divider, and of every Border row. Decided 2026-09-17. Three rules stacked: solid, dashed, dotted, so the row's own choices are the drawing. NOT `block-divider`, the Divider BLOCK kind, which is one plain line and never wears a settings row. ⚠️ Its three answers have their own glyphs, `line-solid`, `line-dashed` and `line-dotted` (GG 2026-10-15), so a strip whose segments draw them keeps this glyph for the question only. ⟨And the website Box's Border row (Box Border, approved by Lewis 2026-10-15).⟩",link:"CONNECT: a hyperlink, or a value connected to a live number (the `Connect to a live number` action in the editor's Body box; Stats design B, Lewis 2026-10-29). One meaning, connect, so one drawing (harness UI-30).","link-slash":"link-slash",list:"a list of entries a merchant orders — worn by the `Phone order` row of the campaign editor's Section settings and by the `Links` row of its Social block. …AND THE `Bulleted list` toolbar button of the campaign editor's Text block, and the `Bulleted list` item of its No list / Bulleted list / Numbered list menu (final design, 2026-10-06): lines set as a list. `numbered-list` is its pair, with figures in place of the dots.","list-format":"WHETHER the lines are a list, and WHICH KIND — the QUESTION, worn by the list row of the one text panel (No list / Bulleted list / Numbered list), in both editors. The answers draw themselves: `list-none` is No list, `list` is Bulleted list and `numbered-list` is Numbered list. The column where a list mark goes is picked out in a frame, so the drawing names the PLACE for a mark, not one kind of mark. NOT `list`, which is the Bulleted list answer (and the Links and Phone order rows). Decided GG 2026-10-15, text panel v3.","list-none":"NOT A LIST — the lines are plain lines, with no mark before them. Worn by the `No list` answer of the List row in the one text panel (easel `TextPartPanel`: No list / Bulleted / Numbered), in both editors, where the row's own glyph `list-format` asks the question. `list`'s three lines with ONE SLASH through the empty mark column: the place for a mark, with no mark in it. NOT `list` (Bulleted: dots in that column) and NOT `numbered-list` (Numbered: figures in it). NOT `list-format`, the question, which frames the column. NOT `align-left`, NOT `align-justify` (they say where lines sit) and NOT `text-lines` (the body-text row): those draw no mark column at all. Decided GG 2026-10-16, text panel E2.",location:"A POINT ON THE EARTH, given as numbers — the `Coordinates`, `Latitude` and `Longitude` rows of the storefront's location editor, where a merchant types or fetches a place's figures. A map pin. ⚠️ NOT `drop`, which is the nearest shape in the set and means A COLOUR: that droplet's point is at the TOP and it is solid, this pin's point is at the BOTTOM and it is pierced. Rendered side by side at 16px before this was kept, because a teardrop beside a teardrop was the obvious way to lose. NOT `globe`, which is the country / region selector — a globe is which MARKET, a pin is which SPOT. NOT `headquarters`, which is one office of several and is a building with a star. Card [FIX] The 28 Hand-Rolled Settings Rows, 2026-09-22",lock:"Locked",logo:"a brand mark — the Header panel's Logo tab",logout:"logout",loop:"A MOTION THAT REPEATS FOR EVER while the part is on screen — the `Loop` row of a Box's Animation tab (None / Scroll; Lewis 2026-10-27 on the new-blocks page: no Strip block, a strip is a Box of Text blocks that loops). `Scroll` runs the storefront's one marquee, web-builder `lib/sections/ticker-scroll`. An infinity sign: it goes round and never ends. NOT `refresh` (load a thing again), NOT `rotate` (turn a picture a quarter) and NOT `hover-rotate` (a picture turns while the pointer rests on it).",map:"map",media:"Media","media-layout-big-two":"a picture area laid out as ONE BIG PICTURE AND TWO SMALL ONES: the big one on the left, the two small ones stacked on the right. Worn by the `One big, two small` option of the `Layout` row of the storefront Hero's Media part. Lewis 2026-10-17.","media-layout-inset":"a picture area laid out as ONE PICTURE WITH A SMALL ONE INSET in a corner. Worn by the `Inset` option of the `Layout` row of the storefront Hero's Media part. Lewis 2026-10-17.","media-layout-side-by-side":"a picture area laid out as TWO PICTURES SIDE BY SIDE, each half the width. Worn by the `Side by side` option of the `Layout` row of the storefront Hero's Media part. Lewis 2026-10-17.","media-layout-stacked":"a picture area laid out as TWO PICTURES STACKED, one above the other, each half the height. Worn by the `Stacked` option of the `Layout` row of the storefront Hero's Media part. Lewis 2026-10-17.",megaphone:"megaphone",menu:"a navigation menu the merchant builds — the `Menu` row of the storefront's Menu picker. The bar a shopper reads along, with the menu dropped open beneath it. ⚠️ NOT `list`, which is a list of entries a merchant orders by hand (the campaign editor's `Phone order` row): every menu is a list, but not every list is the thing a shopper navigates by, and the bar is what says which one this is. NOT `sitemap`, which is the whole structure of a site rather than one menu in it, and NOT `tabs`, which is one strip where only one panel shows at a time. Card [FIX] The 28 Hand-Rolled Settings Rows, 2026-09-22",meta:"THE SMALL LINE OF FACTS ALONG THE BOTTOM of an item — a date, a code, a deadline, run together on one line. Worn by a settings row that holds that line. One full rule with three SHORT runs under it: the gaps are the drawing, because the gaps are what make it read as several facts instead of a paragraph. Decided 2026-09-25.",microphone:"microphone",money:"money",moon:"moon",more:"more","more-vertical":"Used in shell .design-sync/previews/IconButton.tsx:8","move-down":"send this block one step later in its parent's order — the `Move down` row of the block right-click menu the owner approved 2026-08-31. The mirror of `move-up` and it reorders the same way: it does not scroll a view, sort a list or lower a number. NOT `chevron`, which is disclosure rather than movement. Card 66400.a, 2026-09-02","move-up":"send this block one step earlier in its parent's order — the `Move up` row of the block right-click menu the owner approved 2026-08-31. It REORDERS: it does not scroll a view, sort a list or raise a number. NOT `chevron`, which is disclosure — a section opening, not a block moving — and is the first arrow-shaped thing a borrower meets in this set. Card 66400.a, 2026-09-02",newspaper:"newspaper","no-symbol":"no-symbol",note:"a short note ABOUT a thing rather than the thing — worn by the `Alt text` row of the campaign editor's Image block, the words a reader gets when the picture does not load.",nudge:"A FINE ADJUSTMENT FROM WHERE A THING ALREADY SITS — the storefront hero group's `Sideways` and `Up and down` rows, each a ±px offset. ⚠️ ONE DRAWING FOR BOTH ROWS, deliberately. They are one idea on two axes, and the ROW'S OWN LABEL says which axis — `Sideways` and `Up and down` are as plain as the panel gets. The padding family splits by side because WHICH EDGE changes what the setting means; an axis does not change what a nudge is. ⚠️ NOT `placement`, and refusing it is the point: that entry is WHERE A THING SITS among NINE POSITIONS in a 3×3 pad, and a nudge is not one of nine — it is a small move from wherever the thing already is. ⚠️ NOT `width` or `height`, which are a line with arrowheads at both ends: those MEASURE an extent, this MOVES a thing. NOT `direction-up`/`-down`/`-left`/`-right`, single arrows that say which way a marquee TRAVELS. NOT `drag`, six dots, which is a handle a person grabs. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23 ⟨2026-10-21, Lewis (Layered images v3, option A): the two rows become ONE `Position` row. This drawing heads that row; its two boxes wear `nudge-x` and `nudge-y`, this drawing split by axis.⟩","nudge-x":"MOVE A PART LEFT OR RIGHT FROM WHERE IT SITS, in px — the left box of the ONE `Position` row: a picture's own panel in the campaign editor's Layered images block, and the website Hero group's box. Lewis 2026-10-21 (Layered images v3, option A: one `Position` row with a left-right box and an up-down box, in place of the two `Sideways` / `Up and down` rows). The `nudge` drawing with only its left-right arrows, so the box says which way it moves; `nudge` itself heads the row. ⚠️ NOT `width` or `height`, a line between two walls that MEASURES an extent. NOT `direction-left`/`-right`/`-up`/`-down`, single arrows that say which way a marquee TRAVELS. NOT `move-up`/`move-down`, which REORDER a block.","nudge-y":"MOVE A PART UP OR DOWN FROM WHERE IT SITS, in px — the right box of the ONE `Position` row: a picture's own panel in the campaign editor's Layered images block, and the website Hero group's box. Lewis 2026-10-21 (Layered images v3, option A: one `Position` row with a left-right box and an up-down box, in place of the two `Sideways` / `Up and down` rows). The `nudge` drawing with only its up-down arrows, so the box says which way it moves; `nudge` itself heads the row. ⚠️ NOT `width` or `height`, a line between two walls that MEASURES an extent. NOT `direction-left`/`-right`/`-up`/`-down`, single arrows that say which way a marquee TRAVELS. NOT `move-up`/`move-down`, which REORDER a block.","numbered-list":"a NUMBERED LIST — the lines the caret is on, written as 1. 2. 3. Worn by the `Numbered list` toolbar button of the campaign editor's Text block and the `Numbered list` item of its No list / Bulleted list / Numbered list menu. Three rules with 1, 2, 3 down the left. Decided 2026-10-06.",opacity:"opacity","own-text":"the words are the merchant's own, not the product's — the `My own text` segment of the Card text control",package:"package","package-open":"package-open","padding-all":"THE ROOM ON ALL FOUR SIDES of a box — the `Padding` row's own picture, in a section's and a Box's panel and in the email designer (four-side padding, Lewis 2026-10-14/15). The family of `padding-top`, `padding-y` and `padding-left`: walls and a box, here a wall on every side. NOT `sides-each` (the row's Each side toggle), NOT `padding-y` (above and below only) and NOT `padding-x` (the Side space a PAGE leaves at its edges). Approved by Lewis 2026-10-15: four-side Padding v2. ⟨The whole side is drawn heavy (twice the line) so it reads at 16px beside the dashed ones: GG 2026-10-16, on PR #502.⟩","padding-bottom":"padding bottom ⟨v2: REDRAWN, same meaning — THE v2 PADDING FAMILY: a box's four sides round a small inner box (the content held off them); the side or sides THIS number sets are solid, the others dashed. The `Padding` row draws two of these (`padding-left-right`, `padding-y`) with its `Each side` toggle off, and four (`padding-left`, `padding-top`, `padding-right`, `padding-bottom`) with it on. Approved by Lewis 2026-10-15: four-side Padding v2 (one row for all four sides).⟩ ⟨The whole side is drawn heavy (twice the line) so it reads at 16px beside the dashed ones: GG 2026-10-16, on PR #502.⟩","padding-left":"THE ROOM ON ONE SIDE — THE LEFT — of a box, worn by the storefront's `Padding left` row and by the folded `Left` row of a section's padding group. Drawn in `padding-top`'s grammar exactly: a rule at that edge, and the box held off it. ⚠️ IT EXISTS BECAUSE THE FAMILY WAS ASYMMETRIC, which is the whole finding. The set drew top and bottom as SINGLE sides and left/right only as a PAIR, so a row about one horizontal side had nothing true to wear and the obvious reach was `padding-x`. ⚠️ NOT `padding-x`, and bending that entry was refused on purpose: its sentence is “the room a PAGE leaves at its left and right edge — the `Side space` row”, which is a different thing at a different scale, and it refuses other uses by name. An entry that has been stretched twice stops meaning anything. GG, 2026-09-23. Card [FIX] The 176 Settings Rows With No Picture ⟨v2: REDRAWN, same meaning — THE v2 PADDING FAMILY: a box's four sides round a small inner box (the content held off them); the side or sides THIS number sets are solid, the others dashed. The `Padding` row draws two of these (`padding-left-right`, `padding-y`) with its `Each side` toggle off, and four (`padding-left`, `padding-top`, `padding-right`, `padding-bottom`) with it on. Approved by Lewis 2026-10-15: four-side Padding v2 (one row for all four sides).⟩ ⟨The whole side is drawn heavy (twice the line) so it reads at 16px beside the dashed ones: GG 2026-10-16, on PR #502.⟩","padding-left-right":"THE ROOM LEFT AND RIGHT of a box, as ONE number — the first box of the `Padding` row while `Each side` is off. The sideways twin of `padding-y`. THE v2 PADDING FAMILY: a box's four sides round a small inner box (the content held off them); the side or sides THIS number sets are solid, the others dashed. The `Padding` row draws two of these (`padding-left-right`, `padding-y`) with its `Each side` toggle off, and four (`padding-left`, `padding-top`, `padding-right`, `padding-bottom`) with it on. ⚠️ NOT `padding-x`, which N10.1 gives to the Side space a PAGE leaves at its edges (two walls and a wide box, no dashes) — a different idea at a different scale. Approved by Lewis 2026-10-15: four-side Padding v2 (one row for all four sides). ⟨The whole side is drawn heavy (twice the line) so it reads at 16px beside the dashed ones: GG 2026-10-16, on PR #502.⟩","padding-right":"THE ROOM ON ONE SIDE — THE RIGHT — of a box. The mirror of `padding-left`, and it lands with it so the four sides are finally one family: top, bottom, left, right, each a rule at its own edge with the box held off it. ⚠️ NOT `padding-x`, which is the PAGE's side space — see `padding-left` for why that entry was not stretched. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23 ⟨v2: REDRAWN, same meaning — THE v2 PADDING FAMILY: a box's four sides round a small inner box (the content held off them); the side or sides THIS number sets are solid, the others dashed. The `Padding` row draws two of these (`padding-left-right`, `padding-y`) with its `Each side` toggle off, and four (`padding-left`, `padding-top`, `padding-right`, `padding-bottom`) with it on. Approved by Lewis 2026-10-15: four-side Padding v2 (one row for all four sides).⟩ ⟨The whole side is drawn heavy (twice the line) so it reads at 16px beside the dashed ones: GG 2026-10-16, on PR #502.⟩","padding-top":"padding top ⟨v2: REDRAWN, same meaning — THE v2 PADDING FAMILY: a box's four sides round a small inner box (the content held off them); the side or sides THIS number sets are solid, the others dashed. The `Padding` row draws two of these (`padding-left-right`, `padding-y`) with its `Each side` toggle off, and four (`padding-left`, `padding-top`, `padding-right`, `padding-bottom`) with it on. Approved by Lewis 2026-10-15: four-side Padding v2 (one row for all four sides).⟩ ⟨The whole side is drawn heavy (twice the line) so it reads at 16px beside the dashed ones: GG 2026-10-16, on PR #502.⟩","padding-x":"the room a page leaves at its left and right edge — the `Side space` row on the storefront's Site styles ▸ Basics tab, beside `Content width`. NOT the air between two cards, which is `gap` on that same tab, and NOT `width`, which is how wide the content column itself may grow","padding-y":"THE ROOM ABOVE AND BELOW a box, as ONE setting — the storefront's `Space above and below` row. ⚠️ IT RETIRES A WORKAROUND THAT WAS ALREADY SHIPPING, KNOWINGLY. `efficient-shop`'s `components/PartSettingsPanel.tsx` FIELD_ICONS carries this comment against its own padding row: “The set draws `padding-top` and `padding-bottom` and has no glyph for the PAIR, which is what this one row moves. `PaddingTopIcon` is the nearer of the two … Flagged to the seat rather than solved quietly.” That flag is what this drawing answers; that row should move to this glyph. ⚠️ NOT `v-align`, AND THE PROPORTIONS ARE THE WHOLE REASON IT CAN LIVE. `v-align` is ALREADY two full-width rules with a narrow box between them — the obvious drawing for this idea is already taken, and drawing it again would have been a duplicate. This one INVERTS that: SHORT ticks and a WIDE box. `v-align` says which of three positions the content sits in; this says how much room is left. ⚠️ ITS KILL CONDITION follows from that: if `v-align` is ever redrawn with a wide box, or a second short-tick-and-wide-box drawing is added, THIS is the one to question first — it survives on proportion rather than on a shape nothing else has. ⚠️ NOT `gap`, which is the space BETWEEN siblings at three scales; this is room INSIDE one box. NOT `layout`, a frame with a band across it. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23 ⟨v2: REDRAWN, same meaning — THE v2 PADDING FAMILY: a box's four sides round a small inner box (the content held off them); the side or sides THIS number sets are solid, the others dashed. The `Padding` row draws two of these (`padding-left-right`, `padding-y`) with its `Each side` toggle off, and four (`padding-left`, `padding-top`, `padding-right`, `padding-bottom`) with it on. Approved by Lewis 2026-10-15: four-side Padding v2 (one row for all four sides).⟩ ⟨The whole side is drawn heavy (twice the line) so it reads at 16px beside the dashed ones: GG 2026-10-16, on PR #502.⟩",page:"Page AND the Pages rail — owner ruling 08-20, one meaning","paint-brush":"paint-brush",palette:"the SITE'S LOOK as a whole — its colour themes, fonts and default light or dark mode. Worn by the `Appearance` button in the template editor's toolbar, which opens the website's look settings. A painter's palette with three colour wells. NOT `swatch` (ONE colour row or chip), NOT `paint-brush` (applying a style), NOT `text-color` (the colour of a run of words). Lewis 2026-10-19 (SSOT cleanup: the web-builder's local AppearanceIcon moves into the one set).","panel-left":"the LEFT SIDE PANEL itself — worn by the Hide panel button at the end of a left panel's head (`MediaPanelHead`, both editors' SidePanelHeads) and by the Show panel button in the strip a hidden left panel leaves. One control, so one drawing: hiding and showing the panel wear the same glyph. A frame with its left column ruled off. ⛔ NOT an ✕: an ✕ closes a dialog, and a panel head has none (owner, 2026-10-04).","panel-right":"the RIGHT SIDE PANEL itself — the twin of `panel-left` for the settings panel: its head's Hide panel button and the strip a hidden right panel leaves. A frame with its right column ruled off.","paragraph-spacing":"PARAGRAPH SPACING — the room between one paragraph and the next, in px. Worn by the fourth value of the campaign editor's Text block number row (`Paragraph spacing`, beside Font size, Line spacing and Letter spacing). Two short paragraphs with a small upright mark in the room between them. Decided 2026-10-06.",parcel:"package",paste:"drop whatever is on the clipboard into here — the `Paste` row (⌘V) of the block right-click menu the owner approved 2026-08-31. The other half of `copy`, and the only entry in the set that means the clipboard's CONTENTS coming back out. NOT `add`, which opens a chooser for a new block rather than placing one already taken. Card 66400.a, 2026-09-02","paste-style":"put a held look onto this component — the `Paste style from …` row (⌥⌘V) of the right-click menu in both editors. Decided 2026-09-19 (card [ADD] Copy Style And Paste Style). The other half of `copy-style`: the same brush, beside `paste`'s clipboard. NOT `paste`, which drops a whole block, and NOT `copy-style`, which takes the look rather than putting it down.",pause:"pause",pen:"Used in shell src/apps/ImageAnnotator.tsx:567",people:"people",percent:"percent",phone:"Phone","phone-hidden":"Used in admin-portal src/components/email/emailPhoneMarks.tsx:22",placement:"WHERE A THING SITS inside its box, in two dimensions — the `Placement`, `Content position` and `Text position` rows of the storefront editor, and the Hero's `Overlay position`. Each is a 3×3 pad, and the drawing is one square resting in a corner of a frame. ⚠️ NOT `v-align`, and this is the whole reason the drawing exists: that entry says it means \"where content sits UP AND DOWN inside its box\" — one dimension, top / middle / bottom. A 3×3 pad is two, and borrowing a one-dimensional picture for it would be a second meaning on one drawing. NOT `grid`, which is a layout of equal cells, and NOT `columns`. ⚠️ `layout` IS THE CLOSE ONE, and the distinction is that `layout`'s inner marks TOUCH the frame — a header band across it, a divider down it — while this square FLOATS in a corner, because floating is what says it could sit somewhere else. They can appear in one panel, since a `Placement` row lives inside the Layout bucket. If this square is ever redrawn touching an edge it becomes `layout` and should go. Card [FIX] The 28 Hand-Rolled Settings Rows, 2026-09-22",play:"play","plus-minus":"plus minus",power:"power","presentation-chart-bar":"presentation-chart-bar",print:"print",product:"product","product-field":"the words come from the catalogue record — the `From product` segment of the Card text control","product-size":"THE SIZES A PRODUCT IS SOLD IN — the row of size chips on a product card, each one an orderable variant. Worn by the `Sizes` row of the `Show on a card` group, on the storefront editor's Product Listing and Product Grid sections, which says whether a card draws those chips (card [ADD] Choose What A Product Card Shows, 2026-09-21). Two upright boxes on one baseline, one plainly bigger, because the idea is SEVERAL sizes of one product; one box would be a shape and would claim nothing. The pair is drawn SIDE BY SIDE and never overlapping: overlapping rounded boxes are already `copy`, and the difference a reader must see here is the SIZE, which an overlap turns into \"two of them\" instead. Three ascending boxes were drawn and rejected the same way — beside `columns` they read as a bar chart. ⚠️ IT CARRIES THE `product-` QUALIFIER FOR A REASON, and `product-field` is the precedent. Bare `size` is a word three rows of this set already want: `text-size` is how big type is set, `width` and `height` are how big a section is. None of them is a product's own catalogue of sizes, and a bare name is what lets the next borrower attach a second meaning to one drawing. It is also not `square`, which is one box and a shape.",progress:"Used in shell src/shell/timelineGlyphs.tsx:95",quote:"a QUOTED PARAGRAPH — the lines the caret is on, written with > before them (a block quote). Worn by the `Quote` button of the shell TextToolbar's row 2, beside the lists (opt-in; the chat composer offers it). A bar down the left and three lines. Drawn 2026-10-17.","radio-dot":"Used in storefront lib/site-icon.ts:31",radius:"how ROUND a box's corners are — the `Corner radius` row of the campaign editor's Section and Column settings, and the image `Corner radius` row of Email styles. Decided 2026-09-17. A box with ONE strongly rounded corner. NOT `corner`, which is the storefront's `Which corners` row, and NOT `square`, which is the Borders row one line above.",receipt:"Used in admin-portal src/shell-config/search.ts:66","receipt-percent":"receipt-percent","receipt-refund":"receipt-refund","rectangle-group":"rectangle-group",redo:"Redo",refresh:"refresh",remove:"Used in shell src/shell/Desktop.tsx:1199","remove-circle":"remove-circle",rename:"Rename / edit",reply:"Used in admin-portal src/pages/crm/NotesTimeline.tsx:269","reply-all":"Used in admin-portal src/pages/mail/MessageCard.tsx:178",revert:"Revert to inherited",robot:"Used in admin-portal src/shell-config/nav.tsx:303",rotate:"rotate",scale:"scale","scroll-point":"HOW FAR DOWN a reader has got before something happens — the Subscribe popup's `Scroll` row, a percentage of the page. An arrow travelling down to the line it must reach. ⚠️ ITS SIBLING ROW IS WHY IT HAD TO EXIST. One row up, `Delay` wears `clock`, honestly: a delay IS a time. This row is a POSITION, and wearing a clock beside it would make two different questions look like one. Same defect `clock` had on the `Trigger` row (corrected in 0.56.0), one row along. ⚠️ NOT `sticky`, which is the close one at 16px: both are a bar and a down arrow, and what separates them is WHICH END THE MASS IS AT — `sticky` is a thick pinned bar at the TOP with content moving away beneath it, this is a thin line at the BOTTOM with an arrow arriving at it. ⚠️ ITS KILL CONDITION: if `sticky` is ever redrawn with its bar at the bottom, these two collide and this is the one to question first. ⚠️ NOT `direction-down`, a plain arrow with nothing to arrive at — the line is the whole idea. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23","scroll-text":"scroll-text",search:"Search","select-all":"Used in admin-portal src/pages/mail/MessageList.tsx:66",send:"Send","separator-slash":"SLASH SEPARATOR — one forward stroke leaning right, the `/` between two words. Worn by an answer of the `Separator` row on the Box's Design tab (web-builder; shown when Direction is One row): the mark drawn between the blocks of a strip. Lewis ruled on 2026-10-27 (new-blocks page, item 3) that there is no Strip block: a strip is a Box of Text blocks, and the Box draws the mark. The row's answers are None (`no-symbol`), Dot (`dot`), Cross (`close`), Slash and Triangle. NOT `dot` (the Dot answer), NOT `close` (two crossed strokes), NOT `no-symbol` (None: a slash through a circle), NOT `strike` (a line through letters) and NOT `list-none`.","separator-triangle":"TRIANGLE SEPARATOR — a small closed triangle pointing down, the `▼` between two words. Worn by an answer of the `Separator` row on the Box's Design tab (web-builder; shown when Direction is One row): the mark drawn between the blocks of a strip. Lewis ruled on 2026-10-27 (new-blocks page, item 3) that there is no Strip block: a strip is a Box of Text blocks, and the Box draws the mark. The row's answers are None (`no-symbol`), Dot (`dot`), Cross (`close`), Slash and Triangle. NOT `dot` (the Dot answer), NOT `close` (Cross), NOT `no-symbol` (None), NOT `chevron-down` (an open V that opens a list) and NOT `caret`.",server:"server",settings:"site settings — a gear; heads the Basics tab of the Site styles panel",shadow:"the depth a card sits at — the `Card shadow` row on the storefront's Site styles ▸ Basics tab, beside `Corners`","shape-ellipse":"Used in shell src/apps/ImageAnnotator.tsx:569","shape-rect":"Used in shell src/apps/ImageAnnotator.tsx:568",share:"share",shared:"ONE SECTION THAT MANY PAGES USE LIVE: a shared section, and the site header and footer, which every page shows. A change to it shows on every page that has it. Worn at the end of its Layers row, on its canvas tag and on its Add card, always with the success green (colour never stands alone). Two links of a chain, side by side and level. NOT `link` (a URL a reader follows: the diagonal chain of the link rows), NOT `share` (send this page to someone), NOT `copy-to-page` (a copy keeps no link). Lewis approved the Shared section design v4, 2026-10-21.","shield-check":"shield-check","shield-exclamation":"shield-exclamation","sides-each":"SET EACH SIDE ON ITS OWN — the toggle at the right end of the `Padding` row's head (an `IconButton` with aria-pressed, named `Each side` in its Tooltip): off = two numbers (left and right · top and bottom), on = four. Every side dashed: no side is set by this button, it opens them all. THE v2 PADDING FAMILY: a box's four sides round a small inner box (the content held off them); the side or sides THIS number sets are solid, the others dashed. The `Padding` row draws two of these (`padding-left-right`, `padding-y`) with its `Each side` toggle off, and four (`padding-left`, `padding-top`, `padding-right`, `padding-bottom`) with it on. NOT `padding-all` (the row's own picture: room on all four sides) and NOT `expand` (make a thing bigger). Approved by Lewis 2026-10-15: four-side Padding v2 (one row for all four sides). ⟨Also the same toggle at the right end of the `Border` row's head (Box Border, approved by Lewis 2026-10-15): the same idea, set each side on its own, so the same glyph. One key for both rows, so it is named for the idea (each side), not for Padding.⟩",signal:"Used in shell src/shell/Desktop.tsx:1278","signal-slash":"signal-slash",sitemap:"Sitemap","slide-arrows-bare":"a slideshow's arrows with NO frame: the chevron alone. Worn by the `Bare` option of the `Arrows shape` row of the storefront Hero panel. The chevron itself, so an alias of it.","slide-arrows-round":"a slideshow's arrows drawn in a ROUND frame: a chevron in a circle. Worn by the `Outline` option of the `Arrows shape` row of the storefront Hero panel (this drawing), and by its `Solid` option in its solid look (the filled disc), so the two read as one frame drawn two ways. Lewis 2026-10-14: a choice between shapes is shown as pictures.","slide-arrows-square":"a slideshow's arrows drawn in a SQUARE frame: a chevron in a rounded square. Worn by the `Square` option of the `Arrows shape` row of the storefront Hero panel. Lewis 2026-10-14.","slide-picker-bar":"a slideshow's slide picker drawn as a BAR: one track, the part filled shows how far through the slides it is. Worn by the `Bar` option of the `Slide picker shape` row of the storefront Hero panel. Lewis 2026-10-14.","slide-picker-cards":"a slideshow's slide picker drawn as CARDS: a column of named cards, one per slide. Worn by the `Cards` option of the `Slide picker shape` row of the storefront Hero panel, beside Dots, Numbers and Bar. Lewis 2026-10-14: a choice between shapes is shown as pictures.","slide-picker-dots":"a slideshow's slide picker drawn as DOTS: one dot per slide, the shown one a longer pill. Worn by the `Dots` option of the `Slide picker shape` row of the storefront Hero panel. Lewis 2026-10-14.","slide-picker-numbers":"a slideshow's slide picker drawn as NUMBERS: the slides' numbers in a row, the shown one underlined. Worn by the `Numbers` option of the `Slide picker shape` row of the storefront Hero panel. Lewis 2026-10-14.","slide-picker-squares":"a slideshow's slide picker drawn as numbered SQUARES: a column of boxes, one per slide, the shown one filled. Worn by the `Squares` option of the `Slide picker shape` row of the storefront Hero panel, beside Cards, Dots, Numbers and Bar. Lewis 2026-10-17 (the pantherawheels.com rebuild).",sort:"the order a SHOPPER puts a list in — the `Sort control` row of the Gallery panel and the `Sort + Clear all` row of the storefront's Catalog filter bar. ⚠️ NOT `list`, which is a list of entries the MERCHANT orders by hand (the campaign editor's `Phone order` and `Links` rows). The difference is who does the ordering, so the arrow is the whole point of this drawing. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22",sparkles:"sparkles",speaker:"Used in shell src/apps/PomodoroTimer.tsx:651","speaker-wave":"speaker-wave","spec-table":"the table of a product's measured facts on its own page — the `Spec table` row of the storefront Product hero's `Show in the buy box` group. A header band over two name/value columns. NOT `grid`, which is a layout of equal cells, and NOT `line-between`, which is one rule drawn between two columns of CONTENT. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22",spinner:"Deprecated (2026-10-15): draws the shell's one spinner, SpinnerRing. Use SpinnerRing; removed in the next major.",split:"Used in admin-portal src/shell-config/nav.tsx:135",square:"square",star:"star",state:"WHICH OF SEVERAL STATES a thing is in, where no one of them is the good one — the `State` row of a Mockup's result rows (`Match / done`, `In progress`, `No match`). A ring with its centre filled: one position chosen out of several, which is the idea, rather than any particular verdict. ⚠️ NOT `check`, and refusing it is the whole reason this entry exists. `check` means “checkmark / success”, which is TRUE OF ONE ANSWER IN THREE and false of the other two — a row wearing it would say `done` while a merchant is looking at `No match`. That is the same defect `clock` had on the `Trigger` row, found the same way and written here so the next person does not reach for `check` again. ⚠️ NOT `warning`, a triangle, which is wrong for the success case for the mirror-image reason. ⚠️ NOT `hash`, which is a NUMBER or its unit. ⚠️ NOT `contrast`, a circle with one HALF filled: that is a tone, and its hard straight edge is what tells the two apart at 16px — this one's fill is a centred dot. NOT `eye`, whose pupil sits inside a lens rather than a circle, and NOT `drag`, which is six dots in two columns. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23","status-circle":"Used in shell src/apps/PomodoroTimer.tsx:376","status-dot":"Used in shell src/shell/ServerStatusIndicator.tsx:287",sticky:"a thing that stays put while the page scrolls under it — the `Stick under header` row of the storefront Category bar and the `Scroll-over` row of Intro bleed. The bar is pinned and the content moves away from it, which is why the arrow points DOWN and away rather than up. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22","stop-circle":"Used in admin-portal src/shell-config/nav.tsx:276",store:"store",strike:"the STRIKETHROUGH mark — the toolbar button that writes `~~words~~` over the selection in the copy box's formatting bar (a was-price beside a now-price). An S with a rule through its middle. Decided 2026-10-02.",styles:"Styles",subscript:"the SUBSCRIPT mark — lowered small text (H₂O). Worn by the `Subscript` toolbar button of the campaign editor's Text block and the `Subscript` item of its Normal / Superscript / Subscript menu. The same capital A as `superscript`, with the small 2 at its foot (Lewis, 2026-10-06: after seeing the T: use A for all). Decided 2026-10-06.","success-burst":"Used in admin-portal src/take/Submitted.tsx:3",sun:"sun",superscript:"the SUPERSCRIPT mark — raised small text (®, ™, a footnote¹). Worn by the `Superscript` toolbar button of the campaign editor's Text block and the `Superscript` item of its Normal / Superscript / Subscript menu. A capital A with a small 2 at its top right (Lewis, 2026-10-06: the design's x, then a T, then, after seeing the T: use A for all). Decided 2026-10-06.",swap:"swap",swatch:"swatch",table:"table",tablet:"Tablet",tabs:"one strip of choices where only one panel shows at a time — the `Tab switcher` row of the storefront Gallery panel. TWO tabs with the selected one drawn TALLER is what makes it a switcher — a single raised tab over a panel is a folder, which is what the first drawing read as and why it was thrown away rather than a `layout` or a plain panel; nothing else in this set draws a selected-of-several. Card [FIX] Panel Rows That Draw No Picture, 2026-09-22",tag:"tag",target:"target",team:"team",telephone:"telephone",template:"Template / bookmark","text-color":'the COLOUR one run of text is painted in — worn by the `Color` row of the storefront part panel\'s `Appearance` fold, the row that lets a merchant override the theme\'s ink on a single heading or paragraph. NOT `type`, which is the Site styles Theme tab\'s `Text colour` row AND the part panel\'s own `Font` row — that panel forbids two rows sharing a drawing (`scripts/test-part-field-icons.tsx` §4), so the element glyph the Theme tab\'s grammar would ask for is already spent one row up. NOT `accent`, which is one drawing already serving `Accent` (the type) and `Brand colour` (the colour) and may not take a third meaning. NOT `text-small`, which is `Label colour` on that same Theme tab. This is the one place in the set where a glyph names a COLOUR rather than the element it colours, and it does so because the element — a run of text — already has two drawings pointing at it. The letter IS the swatch: one closed A with its counter, marked `data-part="swatch"`, so a host fills it with the chosen colour (`[data-part="swatch"] { fill: … }`) while the line around it stays the ink, so light yellow and white still read on a white toolbar and black is told apart from no colour (a hollow A). Lewis 2026-10-13 picked this over "A + a drop" and "A + a bar", with the note "give the letter an outline, like the drop had". Drawn big enough to carry a fill, and thin enough to sit with the line icons beside it (Lewis 2026-10-13 asked for a thinner A): about 12 x 12px at 16px, legs 4 units. Card [ADD] A Run Of Text Can Take Its Own Color, 2026-09-09',"text-lines":"text lines","text-size":"text size","text-small":"SMALL TYPE — an eyebrow, a caption, a label run. Worn by the `Eyebrow` row of the campaign editor's Text block and by the `Tagline` row of its Logo. The set's `text-size` is the SIZE control; this is the small-type kind itself.","text-value":"Used in storefront packages/web-builder/src/components/FieldGlyph.tsx:111",texture:"Texture: a background pattern on a section or Box — the Texture row (None / Crosshatch / Fade). A square with three 45-degree hatch lines inside it: the box, and a pattern laid in it. NOT `styles`, which is a look in general, not one pattern. NOT `swatch` or `drop`, which are a colour. NOT `opacity`, which is how strong a thing is. NOT `layout` or `grid`, which arrange boxes; nothing is arranged here. NOT `ground` either: that is the fill of the box, hatched edge to edge; this is a pattern on top of it, three lines kept clear of the edge. Lewis 2026-10-14.",theme:"one whole palette a section can be painted in — paper, ink, borders and accent together, not one colour. Worn by the `Theme` row of the section panel's `Colour` group (card 66313), the dropdown that says which of the site's themes this one section is on. NOT `contrast`, which names the Site styles Theme TAB — that is a PLACE, not the idea “a palette”. NOT `accent`, which is the site's ONE emphasis colour, one colour rather than a whole set. Card 66315, 2026-09-01",ticket:"ticket",title:"THE HEADING OF ONE ITEM, not of the band around it — worn by a settings row that holds the loudest line on a single card. An H drawn INSIDE the item's frame, and the containment is the whole distinction. Drawn for the campaign editor's Coupon card, where every layout carries exactly one `title` place. Decided 2026-09-25.",trash:"Delete",trigger:"WHAT MAKES THIS HAPPEN — the event a merchant picks to start something, not the thing that is started. Drawn for the `Trigger` row of the storefront's Subscribe popup, whose three answers are `Delay`, `Scroll` and `Exit`: a wait, a scroll position and a pointer leaving the page. Nothing they share is a picture, which is exactly why none of the five shipped candidates could take the row. ⚠️ NOT `clock`, and this is the drawing this one exists to replace: a clock face says TIME, which is true of `Delay` and FALSE of the other two — it shipped on that row in efficient-shop #1468 and is corrected in the card that adds this. ⚠️ NOT `hover`, a pointer resting on a card: that names the MOUSE specifically, and neither a scroll position nor an exit is a hover. ⚠️ NOT `animation`, a block with speed lines behind it: that names MOVEMENT, and a trigger is not a motion — it is the moment one starts. ⚠️ NOT `sticky`, a bar with content moving away beneath it, which names a thing that STAYS PUT while the page scrolls; `Scroll` here is when the reader reaches a point, never what the bar does. ⚠️ NOT `play`, a triangle, which is video playback. The bolt is the one shape in this set that means a thing FIRING rather than a thing being or moving, and it is the only zigzag in 138 drawings, so it cannot be misread for a neighbour at 16px. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23",truck:"truck",tv:"tv",type:"Text marker — the T",tyre:"Used in admin-portal src/shell-config/nav.tsx:290",underline:"whether links are UNDERLINED — the `Underline links` row of the campaign editor's Email styles. Decided 2026-09-17. A U over a rule, the mark every word processor uses. NOT `type`, which is the text marker, the T. …AND THE `Underline` toolbar button of the campaign editor's Text block (final design, 2026-10-06): the mark that underlines the selected words. One idea, words with a rule under them, so the button wears this drawing rather than a second copy of it.",undo:"Undo",upload:"upload","v-align":"where content sits UP AND DOWN inside its box — the `Content position` row (top / middle / bottom) of the campaign editor's Column settings. Decided 2026-09-17. A block between a top and a bottom rule. NOT `padding-top`, which has one rule and says how much room is above.",verified:"verified","video-off":"video-off","view-columns":"view-columns",wallet:"wallet",warning:"Warning",weight:"HOW HEAVY A STROKE IS — a font's weight, and a rule's thickness. It was written as “font weight” alone until the storefront's `Thickness` row (a footer divider, 1-8px) needed it: both settings make a mark heavier, and that is what the drawing shows. ⚠️ NOT `line-style`, which is WHICH DASH a rule is drawn with — solid, dashed, dotted — a different question about the same rule. Extended on card [FIX] The 176 Settings Rows With No Picture, 2026-09-23",wheel:"Wheel",widgets:'WIDGETS - the small live panels a person puts on the desktop (clock, weather, stock, calculator and the rest). Worn by the desktop right-click row "Manage Widgets" and whatever opens the widget manager. Added 2026-10-13 (GG for Lewis: one icon means one thing; Manage Widgets drew `grid`, which is Snap to Grid\'s). NOT a plug-in or extension, and NOT `apps` or `layout`.',width:"width",window:"window",windows:"Used in shell src/shell/WindowManager.tsx:1051","words-from":"WHICH SIDE A ROW'S WORDS COME FROM, as the question rather than either answer — worn by a settings row that asks it, where the merchant picks between their own copy and copy the catalogue already holds. Drawn for the storefront Feature Rows block's `Rows from` row (`Product story` | `Detail shots`).",wrap:"WHETHER A ROW'S ITEMS FLOW ONTO A NEW LINE when they run out of room — the `Wrap` row of a Box's layout (`Wrap` / `No wrap`). The drawing is the RESULT rather than the motion: three items on the first line and one that has fallen to the second, because an uneven second row is the only thing that says wrapping happened. ⚠️ NOT `revert`, and this is the drawing this one was nearly drawn as. A line running right, turning down and coming back left with an arrowhead is the obvious picture for `wrap` and it is ALREADY `revert` — the two would have been the same drawing at 16px. Caught on the sheet before it was drawn, which is what the sheet is for. ⚠️ NOT `direction`, two same-way arrows, which names WHICH WAY a container's children run — and which is itself ruled to head no row (doc/naming.md N10.1 calls it a modifier). Wrapping is not a heading. ⚠️ NOT `columns`, three upright bars, which is a COUNT of columns, and NOT `grid`, which is equal cells: both draw an even arrangement, and unevenness is the whole of what this one says. ⚠️ NOT `line-between`, an upright rule with content either side, which divides two columns rather than describing how one row behaves. ⚠️ `grid` IS THE CLOSE ONE, AND THIS IS WHY IT IS ALLOWED TO LIVE. Both are a cluster of small squares, and at 16px what separates them is SILHOUETTE: this drawing is ASYMMETRIC — three across the top, one at the bottom LEFT, so it is wider on top and visibly short on the bottom right — against `grid`'s even 2×2. That difference survives the size; it was checked at 16px and again at 6× before it was kept, and it was handed up as a coin-flip rather than decided quietly. GG looked at both sheets and approved it, 2026-09-23. ⚠️ ITS KILL CONDITION, in the shape the bolt carries: if `grid` is ever redrawn asymmetric, or if a SECOND cluster-of-squares drawing is added to this set, THIS is the one to question first. Counting squares is a weaker way to be told apart than a shape nothing else has, and this drawing knows it. Card [FIX] The 176 Settings Rows With No Picture, 2026-09-23",wrench:"wrench","wrench-screwdriver":"wrench-screwdriver","zoom-in":"zoom-in","brand-1password":"1Password, as its mark: a vault, item or service account the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-adyen":"Adyen, as its mark: an Adyen payments account or payout the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-afterpay":"Afterpay, as its mark: Afterpay as a way to pay at checkout the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-aircall":"Aircall, as its mark: an Aircall phone line or call integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-alipay":"Alipay, as its mark: Alipay as a way to pay the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-amd":"AMD, as its mark: an AMD processor, GPU or part the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-americanexpress":"American Express, as its mark: an American Express card, as a way to pay the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-anthropic":"Anthropic, as its mark: a Claude model, subscription or usage the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-apple":"Apple, as its mark: a Mac, an Apple silicon chip, or an App Store / TestFlight item the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-applepay":"Apple Pay, as its mark: Apple Pay, as a way to pay the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-aws":"Amazon Web Services, as its mark: an AWS account, region, service or bill the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-bigcommerce":"BigCommerce, as its mark: a BigCommerce store or import the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-brevo":"Brevo, as its mark: a Brevo email or SMS account the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-calendly":"Calendly, as its mark: a Calendly booking link or calendar integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-campaignmonitor":"Campaign Monitor, as its mark: a Campaign Monitor email list or account the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-cloudflare":"Cloudflare, as its mark: a zone, DNS record, tunnel or Cloudflare service the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-dell":"Dell, as its mark: a Dell server or machine the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-dhl":"DHL, as its mark: a DHL shipping account, service or tracking link the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-dinersclub":"Diners Club, as its mark: a Diners Club card, as a way to pay the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-dropbox":"Dropbox, as its mark: a Dropbox folder or file integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-ebay":"eBay, as its mark: an eBay store or listing integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-etsy":"Etsy, as its mark: an Etsy shop or listing integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-facebook":"Facebook, as its mark: a Facebook page, profile link or integration the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Tabler's filled mark).","brand-fedex":"FedEx, as its mark: a FedEx shipping account, service or tracking link the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-github":"GitHub, as its mark: a repository, pull request, Actions run or GitHub App the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-gmail":"Gmail, as its mark: a Gmail mailbox or email integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-googleads":"Google Ads, as its mark: a Google Ads account or campaign the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-googleanalytics":"Google Analytics, as its mark: a Google Analytics property or tracking integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-googlecalendar":"Google Calendar, as its mark: a Google Calendar integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-googledrive":"Google Drive, as its mark: a Google Drive folder or file integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-googlepay":"Google Pay, as its mark: Google Pay, as a way to pay the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-googlesheets":"Google Sheets, as its mark: a Google Sheets export or integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-hubspot":"HubSpot, as its mark: a HubSpot CRM or marketing integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-instagram":"Instagram, as its mark: an Instagram profile link, feed or integration the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Tabler's filled mark).","brand-intel":"Intel, as its mark: an Intel processor or part the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-intercom":"Intercom, as its mark: an Intercom chat or support integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-jcb":"JCB, as its mark: a JCB card, as a way to pay the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-klarna":"Klarna, as its mark: Klarna as a way to pay at checkout the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-line":"LINE, as its mark: a LINE official account or chat link the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Efficient's own on Tabler's geometry, as web-builder draws it).","brand-linkedin":"LinkedIn, as its mark: a LinkedIn profile or company page link the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Simple Icons has no LinkedIn, so the default is Tabler's filled mark, cropped and sized the same way. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Tabler's filled mark).","brand-mailchimp":"MailChimp, as its mark: a Mailchimp list or email integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-mailgun":"Mailgun, as its mark: a Mailgun sending domain or email integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-make":"Make, as its mark: a Make automation scenario or integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-mastercard":"MasterCard, as its mark: a Mastercard card, as a way to pay the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-messenger":"Messenger, as its mark: a Messenger chat link or integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-meta":"Meta, as its mark: a Meta business account, pixel or ads integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-myob":"MYOB, as its mark: a MYOB accounting integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-notion":"Notion, as its mark: a Notion workspace or page integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-nvidia":"NVIDIA, as its mark: an NVIDIA GPU or part the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-paypal":"PayPal, as its mark: PayPal as a way to pay, or a PayPal account the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-pinterest":"Pinterest, as its mark: a Pinterest profile link or integration the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Tabler's filled mark).","brand-quickbooks":"QuickBooks, as its mark: a QuickBooks accounting integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-sage":"Sage, as its mark: a Sage accounting integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-samsung":"Samsung, as its mark: a Samsung drive, memory or device the row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-shopify":"Shopify, as its mark: a Shopify store or import the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-square":"Square, as its mark: a Square payments or point-of-sale integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-squarespace":"Squarespace, as its mark: a Squarespace site or import the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-stripe":"Stripe, as its mark: a Stripe payments account or integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-telegram":"Telegram, as its mark: a Telegram channel, chat link or integration the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Efficient's own on Tabler's geometry, as web-builder draws it).","brand-tiktok":"TikTok, as its mark: a TikTok profile link, shop or integration the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Tabler's filled mark).","brand-trello":"Trello, as its mark: a Trello board integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-ups":"UPS, as its mark: a UPS shipping account, service or tracking link the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-visa":"Visa, as its mark: a Visa card, as a way to pay the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-vonage":"Vonage, as its mark: a Vonage SMS or voice integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-wechat":"WeChat, as its mark: a WeChat official account or chat link the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Efficient's own on Tabler's geometry, as web-builder draws it).","brand-whatsapp":"WhatsApp, as its mark: a WhatsApp chat link or integration the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Tabler's filled mark).","brand-wise":"Wise, as its mark: a Wise account or payout the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-wix":"Wix, as its mark: a Wix site or import the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-woocommerce":"WooCommerce, as its mark: a WooCommerce store or import the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-x":"X, as its mark: an X (formerly Twitter) profile link the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Tabler's filled mark).","brand-xero":"Xero, as its mark: a Xero accounting integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-youtube":"YouTube, as its mark: a YouTube channel link, video or integration the chip, row or footer link is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set. Its other looks are the two the published footer offers, drawn square at size: outline (Tabler's outline mark, a 1.75 line) and solid (Tabler's filled mark).","brand-zapier":"Zapier, as its mark: a Zapier automation or integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-zendesk":"Zendesk, as its mark: a Zendesk support integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set.","brand-zoom":"Zoom, as its mark: a Zoom meeting link or integration the chip or row is about. A BRAND MARK: filled, one colour (currentColor), drawn at its own aspect and sized by area, never redrawn by a theme's icon set."};export{e as efficientIconMeanings};
@@ -1,8 +1,8 @@
1
- import{DragBand as e,tooltipBesideBand as t}from"./chunk-BFO72WQB.js";import{usePlotWidth as r}from"./chunk-MAFUXCPZ.js";import{niceAxis as i,niceMax as n,linearScale as o,axisGutter as l,bandScale as a}from"./chunk-2JWPNR2U.js";import{CHART_INK as h}from"./chunk-TZFACUMR.js";import{registerModalEscapeInterceptor as s}from"./chunk-TWVUQUUD.js";import{useShellStrings as c,useShellLocale as m}from"./chunk-43MCNASD.js";import{formatPlain as d}from"./chunk-C3QOHMR6.js";import{useRef as u,useState as f,useId as g,useEffect as p}from"react";import{jsx as x,jsxs as y}from"react/jsx-runtime";function v({labels:v,values:b,height:k=220,width:M,bandPadding:w=.24,min:N,max:A,yTickCount:$=4,formatValue:j,yAxisLabel:P,xTickAnchor:D="center",children:E,overlay:R,tooltip:U,onSelect:z,zoom:C,ariaLabel:S,className:F,emptyLabel:L}){const W=c().charts,B=m(),I=j??(e=>d(e,B)),T=L??W.noData,V=u(null),Q=r(V),O=M??Q,[Z,H]=f(null),J=g();if(p(()=>{if(null!==Z)return s(e=>"Escape"===e.key&&(H(null),!0))},[Z]),0===v.length||!b.some(Number.isFinite))/* @__PURE__ */
2
- return x("div",{className:F,ref:V,children:/* @__PURE__ */x("p",{className:"flex items-center justify-center text-sm text-gray-500",style:{height:k},children:T})});const K=b.filter(Number.isFinite),X=K.every(Number.isInteger),q=void 0===N&&void 0===A?i(Math.min(0,...K),Math.max(0,...K),{intervals:$+1,integer:X}):null,G=void 0!==N&&void 0===A?i(N,Math.max(N,...K),{intervals:$+1,integer:X,zero:!1}):null,Y=q?q.lo:N??Math.min(0,...K),_=q?q.hi:G?G.hi:A??n(Math.max(...K,0)),ee=q?q.ticks:G?[Y,...G.ticks.filter(e=>e>Y)]:o([Y,_],{from:0,to:1}).ticks($+1),te={top:12,right:16,bottom:26,left:l(ee.map(I),48)+(P?10:0)},re=te.left,ie=Math.max(re+1,O-te.right),ne=te.top,oe=k-te.bottom,le=o([Y,_],{from:oe,to:ne}),ae=a(v.length,{from:re,to:ie},w),he=(ie-re)/Math.max(1,v.length),se=he>=48,ce=se?1:Math.max(1,Math.ceil(v.length/Math.max(1,Math.floor(O/84)))),me=Math.max(2,Math.floor((he-6)/6.6)),de=e=>se&&e.length>me?`${e.slice(0,me-1).trimEnd()}…`:e;/* @__PURE__ */
3
- return y("div",{className:`relative ${F??""}`,ref:V,children:[
4
- /* @__PURE__ */y("svg",{width:"100%",height:k,viewBox:`0 0 ${O} ${k}`,role:"img","aria-label":S,tabIndex:0,className:"rosh-focus-ring focus-visible:ring-2 focus-visible:ring-[color:var(--rosh-focus-ring-deep)]",onMouseLeave:()=>H(null),onBlur:()=>H(null),onKeyDown:e=>{if(z&&null!==Z&&("Enter"===e.key||" "===e.key))return e.preventDefault(),void z(Z);if("ArrowRight"!==e.key&&"ArrowLeft"!==e.key)return;e.preventDefault();const t="ArrowRight"===e.key?1:-1;H(e=>Math.min(v.length-1,Math.max(0,(e??0)+t)))},style:C?{userSelect:"none",touchAction:"pan-y"}:void 0,children:[
5
- /* @__PURE__ */x("defs",{children:/* @__PURE__ */x("clipPath",{id:J,children:/* @__PURE__ */x("rect",{x:re,y:ne,width:ie-re,height:oe-ne})})}),ee.map(e=>/* @__PURE__ */x("line",{x1:re,y1:le(e),x2:ie,y2:le(e),stroke:h.grid,strokeWidth:1,shapeRendering:"crispEdges"},`g${e}`)),
6
- /* @__PURE__ */x("line",{x1:re,y1:le(Math.max(Y,0)),x2:ie,y2:le(Math.max(Y,0)),stroke:h.axis,strokeWidth:1,shapeRendering:"crispEdges"}),ee.map(e=>/* @__PURE__ */x("text",{x:re-8,y:le(e)+4,textAnchor:"end",fontSize:11,fill:h.label,style:{fontVariantNumeric:"tabular-nums"},children:I(e)},`t${e}`)),P&&/* @__PURE__ */x("text",{x:14,y:(ne+oe)/2,transform:`rotate(-90 14 ${(ne+oe)/2})`,textAnchor:"middle",fontSize:11,fill:h.label,children:P}),
7
- /* @__PURE__ */x("g",{clipPath:`url(#${J})`,children:E({x:ae,y:le,left:re,right:ie,top:ne,bottom:oe,width:O,height:k,clipId:J,active:Z})}),R?.({x:ae,y:le,left:re,right:ie,top:ne,bottom:oe,width:O,height:k,clipId:J,active:Z}),v.map((e,t)=>t%ce===0?/* @__PURE__ */x("text",{x:"start"===D?ae(t):ae.center(t),y:k-8,textAnchor:"middle",fontSize:11,fill:h.label,style:{fontVariantNumeric:"tabular-nums"},children:de(e)},`x${t}`):null),C?.drag&&/* @__PURE__ */x(e,{x0:ae.center(C.drag[0])-(ie-re)/v.length/2,x1:ae.center(C.drag[1])+(ie-re)/v.length/2,top:ne,bottom:oe}),v.map((e,t)=>/* @__PURE__ */x("rect",{x:ae.center(t)-(ie-re)/v.length/2,y:ne,width:(ie-re)/v.length,height:oe-ne,fill:"transparent",onMouseEnter:()=>H(t),onPointerDown:C?()=>C.press(t):void 0,onPointerEnter:C?()=>C.over(t):void 0,onPointerUp:C?.release,onClick:z?()=>z(t):void 0,style:z?{cursor:"pointer"}:void 0},`h${t}`))]}),U&&null!==Z&&
8
- /* @__PURE__ */x("div",{className:"pointer-events-none absolute top-2 z-10",style:t(ae.center(Z),ae.bandwidth,O),children:U(Z)})]})}export{v as CartesianPlot};
1
+ import{DragBand as e,tooltipBesideBand as t}from"./chunk-EDANELWX.js";import{usePlotWidth as r}from"./chunk-MAFUXCPZ.js";import{niceAxis as i,niceMax as n,linearScale as o,axisGutter as l,bandScale as a}from"./chunk-2JWPNR2U.js";import{CHART_INK as h}from"./chunk-TZFACUMR.js";import{registerModalEscapeInterceptor as s}from"./chunk-TWVUQUUD.js";import{useShellStrings as c,useShellLocale as m}from"./chunk-TJSJVC6P.js";import{formatPlain as d}from"./chunk-C3QOHMR6.js";import{useRef as u,useState as f,useId as g,useEffect as p}from"react";import{jsx as x,jsxs as y}from"react/jsx-runtime";function v({labels:v,values:b,height:k=220,width:M,bandPadding:w=.24,min:N,max:A,yTickCount:$=4,formatValue:j,yAxisLabel:E,xTickAnchor:P="center",children:D,overlay:R,tooltip:U,onSelect:z,zoom:C,ariaLabel:L,className:S,emptyLabel:T}){const V=c().charts,W=m(),F=j??(e=>d(e,W)),I=T??V.noData,J=u(null),B=r(J),Q=M??B,[X,Z]=f(null),H=g();if(p(()=>{if(null!==X)return s(e=>"Escape"===e.key&&(Z(null),!0))},[X]),0===v.length||!b.some(Number.isFinite))/* @__PURE__ */
2
+ return x("div",{className:S,ref:J,children:/* @__PURE__ */x("p",{className:"flex items-center justify-center text-sm text-gray-500",style:{height:k},children:I})});const K=b.filter(Number.isFinite),O=K.every(Number.isInteger),q=void 0===N&&void 0===A?i(Math.min(0,...K),Math.max(0,...K),{intervals:$+1,integer:O}):null,G=void 0!==N&&void 0===A?i(N,Math.max(N,...K),{intervals:$+1,integer:O,zero:!1}):null,Y=q?q.lo:N??Math.min(0,...K),_=q?q.hi:G?G.hi:A??n(Math.max(...K,0)),ee=q?q.ticks:G?[Y,...G.ticks.filter(e=>e>Y)]:o([Y,_],{from:0,to:1}).ticks($+1),te={top:12,right:16,bottom:26,left:l(ee.map(F),48)+(E?10:0)},re=te.left,ie=Math.max(re+1,Q-te.right),ne=te.top,oe=k-te.bottom,le=o([Y,_],{from:oe,to:ne}),ae=a(v.length,{from:re,to:ie},w),he=(ie-re)/Math.max(1,v.length),se=he>=48,ce=se?1:Math.max(1,Math.ceil(v.length/Math.max(1,Math.floor(Q/84)))),me=Math.max(2,Math.floor((he-6)/6.6)),de=e=>se&&e.length>me?`${e.slice(0,me-1).trimEnd()}…`:e;/* @__PURE__ */
3
+ return y("div",{className:`relative ${S??""}`,ref:J,children:[
4
+ /* @__PURE__ */y("svg",{width:"100%",height:k,viewBox:`0 0 ${Q} ${k}`,role:"img","aria-label":L,tabIndex:0,className:"rosh-focus-ring focus-visible:ring-2 focus-visible:ring-[color:var(--rosh-focus-ring-deep)]",onMouseLeave:()=>Z(null),onBlur:()=>Z(null),onKeyDown:e=>{if(z&&null!==X&&("Enter"===e.key||" "===e.key))return e.preventDefault(),void z(X);if("ArrowRight"!==e.key&&"ArrowLeft"!==e.key)return;e.preventDefault();const t="ArrowRight"===e.key?1:-1;Z(e=>Math.min(v.length-1,Math.max(0,(e??0)+t)))},style:C?{userSelect:"none",touchAction:"pan-y"}:void 0,children:[
5
+ /* @__PURE__ */x("defs",{children:/* @__PURE__ */x("clipPath",{id:H,children:/* @__PURE__ */x("rect",{x:re,y:ne,width:ie-re,height:oe-ne})})}),ee.map(e=>/* @__PURE__ */x("line",{x1:re,y1:le(e),x2:ie,y2:le(e),stroke:h.grid,strokeWidth:1,shapeRendering:"crispEdges"},`g${e}`)),
6
+ /* @__PURE__ */x("line",{x1:re,y1:le(Math.max(Y,0)),x2:ie,y2:le(Math.max(Y,0)),stroke:h.axis,strokeWidth:1,shapeRendering:"crispEdges"}),ee.map(e=>/* @__PURE__ */x("text",{x:re-8,y:le(e)+4,textAnchor:"end",fontSize:11,fill:h.label,style:{fontVariantNumeric:"tabular-nums"},children:F(e)},`t${e}`)),E&&/* @__PURE__ */x("text",{x:14,y:(ne+oe)/2,transform:`rotate(-90 14 ${(ne+oe)/2})`,textAnchor:"middle",fontSize:11,fill:h.label,children:E}),
7
+ /* @__PURE__ */x("g",{clipPath:`url(#${H})`,children:D({x:ae,y:le,left:re,right:ie,top:ne,bottom:oe,width:Q,height:k,clipId:H,active:X})}),R?.({x:ae,y:le,left:re,right:ie,top:ne,bottom:oe,width:Q,height:k,clipId:H,active:X}),v.map((e,t)=>t%ce===0?/* @__PURE__ */x("text",{x:"start"===P?ae(t):ae.center(t),y:k-8,textAnchor:"middle",fontSize:11,fill:h.label,style:{fontVariantNumeric:"tabular-nums"},children:de(e)},`x${t}`):null),C?.drag&&/* @__PURE__ */x(e,{x0:ae.center(C.drag[0])-(ie-re)/v.length/2,x1:ae.center(C.drag[1])+(ie-re)/v.length/2,top:ne,bottom:oe}),v.map((e,t)=>/* @__PURE__ */x("rect",{x:ae.center(t)-(ie-re)/v.length/2,y:ne,width:(ie-re)/v.length,height:oe-ne,fill:"transparent",onMouseEnter:()=>Z(t),onPointerDown:C?()=>C.press(t):void 0,onPointerEnter:C?()=>C.over(t):void 0,onPointerUp:C?.release,onClick:z?()=>z(t):void 0,style:z?{cursor:"pointer"}:void 0},`h${t}`))]}),U&&null!==X&&
8
+ /* @__PURE__ */x("div",{className:"pointer-events-none absolute top-2 z-10",style:t(ae.center(X),ae.bandwidth,Q),children:U(X)})]})}export{v as CartesianPlot};
@@ -0,0 +1,8 @@
1
+ import{usePlotWidth as e}from"./chunk-MAFUXCPZ.js";import{axisGutter as t,radiusScale as i,niceMax as l,logScale as r,linearScale as o}from"./chunk-2JWPNR2U.js";import{ChartTooltip as n}from"./chunk-WDQI3FV6.js";import{CHART_INK as a,resolveSeriesColorWithin as s}from"./chunk-TZFACUMR.js";import{registerModalEscapeInterceptor as c}from"./chunk-TWVUQUUD.js";import{useShellStrings as m,useShellLocale as h}from"./chunk-TJSJVC6P.js";import{formatPlain as f}from"./chunk-C3QOHMR6.js";import{useRef as u,useId as p,useState as d,useEffect as x}from"react";import{jsx as y,jsxs as g}from"react/jsx-runtime";var b=3;function k({series:b,height:k=260,width:v,xLabel:M,yLabel:A,formatX:z,formatY:$,xDomain:j,yDomain:w,xScale:N="linear",yScale:R="linear",radiusRange:S=[4,22],className:D,emptyLabel:U}){const L=m().charts,P=h(),V=z??(e=>f(e,P)),W=$??(e=>f(e,P)),C=U??L.noObservations,E=u(null),F=e(E),I=v??F,J=p(),[O,Q]=d(null);x(()=>{if(null!==O)return c(e=>"Escape"===e.key&&(Q(null),!0))},[O]);const T=(e,t)=>!t||e>=Math.min(t[0],t[1])&&e<=Math.max(t[0],t[1]),B=b.map((e,t)=>({...e,slot:t})).filter(e=>e.points.length>0),X=j||w?B.map(e=>({...e,points:e.points.filter(e=>T(e.x,j)&&T(e.y,w))})).filter(e=>e.points.length>0):B,Z=B.reduce((e,t)=>e+t.points.length,0)-X.reduce((e,t)=>e+t.points.length,0);if(0===X.length)/* @__PURE__ */
2
+ return y("div",{className:D,ref:E,children:/* @__PURE__ */y("p",{className:"flex items-center justify-center text-sm text-gray-500",style:{height:k},children:C})});const H=X.flatMap(e=>e.points),K=H.some(e=>null!=e.size),Y=14,q=20,G=34,_=52,ee=(e,t,i,n)=>{const a=e.filter(e=>e>0),s="log"===i?a.length>0?Math.min(...a):0:Math.min(0,...e),c=t??[s,l(Math.max(...e))];return"log"===i?r(c,n):o(c,n)},te=ee(H.map(e=>e.y),w,R,{from:k-G,to:Y}),ie=t(te.ticks(5).map(W),_),le=Math.max(ie+1,I-q),re=ee(H.map(e=>e.x),j,N,{from:ie,to:le}),oe=i([0,Math.max(...H.map(e=>e.size??1))],{from:S[0],to:S[1]}),ne=O?X[O.s]:void 0,ae=O&&ne?ne.points[O.i]:void 0,se=X.flatMap((e,t)=>e.points.map((e,i)=>({s:t,i:i})));/* @__PURE__ */
3
+ return g("div",{className:`relative ${D??""}`,ref:E,children:[
4
+ /* @__PURE__ */g("svg",{width:"100%",height:k,viewBox:`0 0 ${I} ${k}`,role:"img","aria-label":L.scatter(X.map(e=>e.label),A??L.yAxis,M??L.xAxis)+(Z>0?`. ${L.outsideRange(Z)}`:""),tabIndex:0,className:"rosh-focus-ring focus-visible:ring-2 focus-visible:ring-[color:var(--rosh-focus-ring-deep)]",onMouseLeave:()=>Q(null),onBlur:()=>Q(null),onKeyDown:e=>{if("ArrowRight"!==e.key&&"ArrowLeft"!==e.key)return;e.preventDefault();const t="ArrowRight"===e.key?1:-1,i=O?se.findIndex(e=>e.s===O.s&&e.i===O.i):0;Q(se[Math.min(se.length-1,Math.max(0,i+t))])},children:[
5
+ /* @__PURE__ */y("defs",{children:/* @__PURE__ */y("clipPath",{id:J,children:/* @__PURE__ */y("rect",{x:ie-S[1],y:Y-S[1],width:le-ie+2*S[1],height:k-G-Y+2*S[1]})})}),te.ticks(5).map(e=>/* @__PURE__ */g("g",{children:[
6
+ /* @__PURE__ */y("line",{x1:ie,y1:te(e),x2:le,y2:te(e),stroke:a.grid,strokeWidth:1,shapeRendering:"crispEdges"}),
7
+ /* @__PURE__ */y("text",{x:ie-8,y:te(e)+4,textAnchor:"end",fontSize:11,fill:a.label,style:{fontVariantNumeric:"tabular-nums"},children:W(e)})]},`y${e}`)),re.ticks(5).map(e=>/* @__PURE__ */y("text",{x:re(e),y:k-12,textAnchor:"middle",fontSize:11,fill:a.label,style:{fontVariantNumeric:"tabular-nums"},children:V(e)},`x${e}`)),M&&/* @__PURE__ */y("text",{x:(ie+le)/2,y:k-.5,textAnchor:"middle",fontSize:11,fill:a.label,children:M}),A&&/* @__PURE__ */y("text",{x:12,y:k/2,transform:`rotate(-90 12 ${k/2})`,textAnchor:"middle",fontSize:11,fill:a.label,children:A}),
8
+ /* @__PURE__ */y("g",{clipPath:`url(#${J})`,children:X.map((e,t)=>{const i=s(e.slot,3,e.color,e.tone);return e.points.map((l,r)=>/* @__PURE__ */y("circle",{cx:re(l.x),cy:te(l.y),r:K?oe(l.size??0):S[0]+1,fill:i,fillOpacity:O&&O.s!==t?.25:.62,stroke:a.surface,strokeWidth:2,onMouseEnter:()=>Q({s:t,i:r})},`${e.key}-${r}`))})})]}),O&&ne&&ae&&/* @__PURE__ */y("div",{className:"pointer-events-none absolute top-2 left-2 z-10",children:/* @__PURE__ */y(n,{title:ae.label??ne.label,rows:[{key:"x",label:M??L.xAxis,color:s(ne.slot,3,ne.color,ne.tone),value:V(ae.x)},{key:"y",label:A??L.yAxis,color:s(ne.slot,3,ne.color,ne.tone),value:W(ae.y)},...null!=ae.size?[{key:"size",label:L.size,color:a.muted,value:f(ae.size,P)}]:[]],footnote:ae.label?ne.label:void 0})})]})}export{b as SCATTER_SERIES_CAP,k as ScatterChart};
@@ -1,4 +1,4 @@
1
- import{CHART_INK as r}from"./chunk-TZFACUMR.js";import{useShellStrings as t}from"./chunk-43MCNASD.js";import{useId as e}from"react";import{jsx as i,jsxs as s}from"react/jsx-runtime";function o({height:o=220,width:a=720,variant:h="area",bars:l=9,label:c,className:n}){const f=t().charts,p=c??f.loading,d=`${e()}-shimmer`,m=48,g=a-16,y=12,u=o-26;/* @__PURE__ */
1
+ import{CHART_INK as r}from"./chunk-TZFACUMR.js";import{useShellStrings as t}from"./chunk-TJSJVC6P.js";import{useId as e}from"react";import{jsx as i,jsxs as s}from"react/jsx-runtime";function o({height:o=220,width:a=720,variant:h="area",bars:l=9,label:c,className:n}){const f=t().charts,p=c??f.loading,d=`${e()}-shimmer`,m=48,g=a-16,y=12,u=o-26;/* @__PURE__ */
2
2
  return i("div",{className:n,children:/* @__PURE__ */s("svg",{width:"100%",height:o,viewBox:`0 0 ${a} ${o}`,role:"img","aria-label":p,"aria-busy":"true",children:[
3
3
  /* @__PURE__ */i("defs",{children:/* @__PURE__ */s("linearGradient",{id:d,x1:"0",y1:"0",x2:"1",y2:"0",children:[
4
4
  /* @__PURE__ */i("stop",{offset:"0%",stopColor:r.surface,stopOpacity:"0"}),
@@ -1,8 +1,8 @@
1
- import{parseFocal as e,formatFocal as t,nudgeFocal as n,focalFromRect as a}from"./chunk-25RR3GQW.js";import{useShellStrings as r}from"./chunk-43MCNASD.js";import{useId as o,useRef as s}from"react";import{jsx as i,jsxs as l}from"react/jsx-runtime";var c={background:"color-mix(in srgb, var(--status-on-solid) 45%, transparent)"},u={borderColor:"var(--status-on-solid)",boxShadow:"0 0 0 1px var(--rosh-media-scrim-button), 0 1px 4px var(--rosh-media-scrim-button)"};function d({value:d,onChange:m,label:f,image:p,hint:h,emptyText:x,actions:b,disabled:g=!1,id:v,className:y=""}){const N=r().imageFocus,w=o(),k=s(null),C=s(!1),{x:j,y:P}=e(d),K=t(j,P),$=e=>{e!==d&&m(e)},D=(e,n)=>{const r=k.current?.getBoundingClientRect();if(!r)return;const o=a(r,e,n);$(t(o.x,o.y))},R=()=>{C.current=!1};if(!p)/* @__PURE__ */
2
- return i("div",{"data-image-focus":"",className:y||void 0,children:/* @__PURE__ */i("p",{className:"text-xs text-ink-faint",children:x??N.noImage})});const S=void 0===h,T=null!==h;/* @__PURE__ */
1
+ import{parseFocal as e,formatFocal as t,nudgeFocal as n,focalFromRect as a}from"./chunk-25RR3GQW.js";import{useShellStrings as r}from"./chunk-TJSJVC6P.js";import{useId as o,useRef as s}from"react";import{jsx as i,jsxs as l}from"react/jsx-runtime";var c={background:"color-mix(in srgb, var(--status-on-solid) 45%, transparent)"},u={borderColor:"var(--status-on-solid)",boxShadow:"0 0 0 1px var(--rosh-media-scrim-button), 0 1px 4px var(--rosh-media-scrim-button)"};function d({value:d,onChange:m,label:f,image:p,hint:h,emptyText:x,actions:b,disabled:g=!1,id:v,className:y=""}){const N=r().imageFocus,w=o(),k=s(null),C=s(!1),{x:P,y:j}=e(d),K=t(P,j),$=e=>{e!==d&&m(e)},T=(e,n)=>{const r=k.current?.getBoundingClientRect();if(!r)return;const o=a(r,e,n);$(t(o.x,o.y))},D=()=>{C.current=!1};if(!p)/* @__PURE__ */
2
+ return i("div",{"data-image-focus":"",className:y||void 0,children:/* @__PURE__ */i("p",{className:"text-xs text-ink-faint",children:x??N.noImage})});const R=void 0===h,S=null!==h;/* @__PURE__ */
3
3
  return l("div",{"data-image-focus":"",className:`flex flex-col gap-2 ${y}`.trim(),children:[
4
- /* @__PURE__ */i("button",{id:v,type:"button","data-image-focus-picture":"",disabled:g,"aria-label":N.picture(f,K),"aria-describedby":w,onKeyDown:e=>{if(g||e.altKey||e.ctrlKey||e.metaKey)return;const t=n(d,e.key,e.shiftKey);null!==t&&(e.preventDefault(),$(t))},onPointerDown:e=>{g||0!==e.button||(e.currentTarget.setPointerCapture?.(e.pointerId),e.currentTarget.focus({preventScroll:!0}),C.current=!0,D(e.clientX,e.clientY))},onPointerMove:e=>{C.current&&!g&&D(e.clientX,e.clientY)},onPointerUp:R,onPointerCancel:R,onLostPointerCapture:R,className:["flex min-h-36 w-full touch-none items-center justify-center overflow-hidden rounded-md border border-line bg-surface-sunken p-0","rosh-focus-ring focus-visible:ring-2 focus-visible:ring-[color:var(--rosh-focus-ring-solid)]",g?"cursor-not-allowed opacity-60":"cursor-crosshair"].join(" "),children:/* @__PURE__ */l("span",{ref:k,"data-image-focus-pane":"",className:"relative block max-w-full",children:[
4
+ /* @__PURE__ */i("button",{id:v,type:"button","data-image-focus-picture":"",disabled:g,"aria-label":N.picture(f,K),"aria-describedby":w,onKeyDown:e=>{if(g||e.altKey||e.ctrlKey||e.metaKey)return;const t=n(d,e.key,e.shiftKey);null!==t&&(e.preventDefault(),$(t))},onPointerDown:e=>{g||0!==e.button||(e.currentTarget.setPointerCapture?.(e.pointerId),e.currentTarget.focus({preventScroll:!0}),C.current=!0,T(e.clientX,e.clientY))},onPointerMove:e=>{C.current&&!g&&T(e.clientX,e.clientY)},onPointerUp:D,onPointerCancel:D,onLostPointerCapture:D,className:["flex min-h-36 w-full touch-none items-center justify-center overflow-hidden rounded-md border border-line bg-surface-sunken p-0","rosh-focus-ring focus-visible:ring-2 focus-visible:ring-[color:var(--rosh-focus-ring-solid)]",g?"cursor-not-allowed opacity-60":"cursor-crosshair"].join(" "),children:/* @__PURE__ */l("span",{ref:k,"data-image-focus-pane":"",className:"relative block max-w-full",children:[
5
5
  /* @__PURE__ */i("img",{src:p,alt:"",draggable:!1,className:"block h-auto max-h-36 w-auto max-w-full select-none object-contain"}),
6
- /* @__PURE__ */i("span",{"aria-hidden":"true","data-image-focus-cross":"h",className:"pointer-events-none absolute inset-x-0 h-px",style:{top:`${P}%`,...c}}),
7
- /* @__PURE__ */i("span",{"aria-hidden":"true","data-image-focus-cross":"v",className:"pointer-events-none absolute inset-y-0 w-px",style:{left:`${j}%`,...c}}),
8
- /* @__PURE__ */i("span",{"aria-hidden":"true","data-image-focus-dot":"",className:"pointer-events-none absolute h-4 w-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2",style:{left:`${j}%`,top:`${P}%`,...u}})]})}),T||b?/* @__PURE__ */l("div",{className:"flex items-center gap-2",children:[/* @__PURE__ */i("span",T?{id:S?w:void 0,className:"min-w-0 flex-1 text-xs text-ink-faint",children:S?N.hint:h}:{className:"min-w-0 flex-1"}),b]}):null,!S&&/* @__PURE__ */i("span",{id:w,className:"sr-only",children:N.hint})]})}export{d as ImageFocusPoint};
6
+ /* @__PURE__ */i("span",{"aria-hidden":"true","data-image-focus-cross":"h",className:"pointer-events-none absolute inset-x-0 h-px",style:{top:`${j}%`,...c}}),
7
+ /* @__PURE__ */i("span",{"aria-hidden":"true","data-image-focus-cross":"v",className:"pointer-events-none absolute inset-y-0 w-px",style:{left:`${P}%`,...c}}),
8
+ /* @__PURE__ */i("span",{"aria-hidden":"true","data-image-focus-dot":"",className:"pointer-events-none absolute h-4 w-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2",style:{left:`${P}%`,top:`${j}%`,...u}})]})}),S||b?/* @__PURE__ */l("div",{className:"flex items-center gap-2",children:[/* @__PURE__ */i("span",S?{id:R?w:void 0,className:"min-w-0 flex-1 text-xs text-ink-faint",children:R?N.hint:h}:{className:"min-w-0 flex-1"}),b]}):null,!R&&/* @__PURE__ */i("span",{id:w,className:"sr-only",children:N.hint})]})}export{d as ImageFocusPoint};
@@ -0,0 +1,4 @@
1
+ import{DropdownMenu as e,TRIGGER_CLASS as r}from"./chunk-KVU5IQOZ.js";import{Tooltip as a}from"./chunk-SOZCWT6I.js";import{jsx as i,jsxs as t}from"react/jsx-runtime";var l=`${r} -ml-1 h-6 px-1 text-xs`;function n({value:r,options:n,onChange:s,label:c,disabled:o}){
2
+ /* @__PURE__ */
3
+ return i(a,{content:c,describe:!1,children:/* @__PURE__ */i(e,{trigger:
4
+ /* @__PURE__ */t("span",{className:"inline-grid justify-items-end",children:[n.includes(r)?null:/* @__PURE__ */i("span",{className:"col-start-1 row-start-1",children:r}),n.map(e=>/* @__PURE__ */i("span",{className:"col-start-1 row-start-1"+(e===r?"":" invisible"),children:e},e))]}),"aria-label":`${c}: ${r}`,align:"end",minWidth:0,disabled:o,triggerClassName:l,items:n.map(e=>({type:"radio",key:e,label:e,checked:e===r,mark:"colour",onSelect:()=>{e!==r&&s(e)}}))})})}export{n as UnitMenu};
@@ -1,31 +1,31 @@
1
- import{useCopyText as e,CopyGlyph as n}from"./chunk-HE767CVB.js";import{ItemCount as t}from"./chunk-N7JX27JE.js";import{PopupMenu as r,PopupMenuItem as i,PopupMenuDivider as l}from"./chunk-IFQXTIMY.js";import{Icon as a}from"./chunk-UIWGVOFH.js";import{useShellStrings as o}from"./chunk-43MCNASD.js";import{useState as s,useMemo as d,useEffect as c,useRef as u,Fragment as m,useLayoutEffect as f}from"react";import{jsxs as p,jsx as y,Fragment as h}from"react/jsx-runtime";function g(e){const n=[];let t=0;for(;t<e.length;){const r=e[t].group;let i=t;for(;void 0!==r&&i+1<e.length&&e[i+1].group===r;)i++;n.push(i>t?{group:r,start:t,end:i}:{start:t,end:t}),t=i+1}return n}function k(e,n){return e.find(e=>n>=e.start&&n<=e.end)}function b(e,n,t,r){const i=e.findIndex(e=>e.key===n.key);let l=e.findIndex(e=>e.key===t);if(i<0||l<0)return null;const a=g(e),o=k(a,i),s="group"===n.kind&&void 0!==o.group?e.slice(o.start,o.end+1).map(e=>e.key):[n.key];if(s.includes(t))return null;const d=k(a,l);if("tab"===n.kind&&void 0!==o.group){if(d!==o)return null}else void 0!==d.group&&(l="before"===r?d.start:d.end);return{key:e[l].key,side:r,moving:s}}function x(e,n,t,r){const i=b(e,n,t,r);if(!i)return null;const l=e.map(e=>e.key).filter(e=>!i.moving.includes(e)),a=l.indexOf(i.key)+("after"===i.side?1:0),o=[...l.slice(0,a),...i.moving,...l.slice(a)];return o.every((n,t)=>n===e[t].key)?null:o}var v="flex-[0_1_15rem] [contain-intrinsic-inline-size:15rem]",N=v,w="outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500",C="pointer-events-none absolute bottom-0 size-2 [background:inherit]";function $(){/* @__PURE__ */
1
+ import{useCopyText as e,CopyGlyph as n}from"./chunk-W5B7UNMJ.js";import{ItemCount as t}from"./chunk-KWTK6TGH.js";import{PopupMenu as r,PopupMenuItem as i,PopupMenuDivider as l}from"./chunk-CRRC72EE.js";import{Icon as a}from"./chunk-T3NLFOLW.js";import{useShellStrings as o}from"./chunk-TJSJVC6P.js";import{useState as s,useMemo as d,useEffect as c,useRef as u,Fragment as m,useLayoutEffect as f}from"react";import{jsxs as p,jsx as y,Fragment as h}from"react/jsx-runtime";function g(e){const n=[];let t=0;for(;t<e.length;){const r=e[t].group;let i=t;for(;void 0!==r&&i+1<e.length&&e[i+1].group===r;)i++;n.push(i>t?{group:r,start:t,end:i}:{start:t,end:t}),t=i+1}return n}function k(e,n){return e.find(e=>n>=e.start&&n<=e.end)}function b(e,n,t,r){const i=e.findIndex(e=>e.key===n.key);let l=e.findIndex(e=>e.key===t);if(i<0||l<0)return null;const a=g(e),o=k(a,i),s="group"===n.kind&&void 0!==o.group?e.slice(o.start,o.end+1).map(e=>e.key):[n.key];if(s.includes(t))return null;const d=k(a,l);if("tab"===n.kind&&void 0!==o.group){if(d!==o)return null}else void 0!==d.group&&(l="before"===r?d.start:d.end);return{key:e[l].key,side:r,moving:s}}function x(e,n,t,r){const i=b(e,n,t,r);if(!i)return null;const l=e.map(e=>e.key).filter(e=>!i.moving.includes(e)),a=l.indexOf(i.key)+("after"===i.side?1:0),o=[...l.slice(0,a),...i.moving,...l.slice(a)];return o.every((n,t)=>n===e[t].key)?null:o}var v="flex-[0_100_15rem] [contain-intrinsic-inline-size:15rem]",N=v,w="outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500",C="pointer-events-none absolute bottom-0 size-2 [background:inherit]";function $(){/* @__PURE__ */
2
2
  return p(h,{children:[
3
3
  /* @__PURE__ */y("span",{"aria-hidden":"true",className:`${C} -left-2 [mask-image:radial-gradient(circle_at_0_0,transparent_0.5rem,#000_calc(0.5rem+0.5px))]`}),
4
- /* @__PURE__ */y("span",{"aria-hidden":"true",className:`${C} -right-2 [mask-image:radial-gradient(circle_at_100%_0,transparent_0.5rem,#000_calc(0.5rem+0.5px))]`})]})}function I(){/* @__PURE__ */
5
- return y(a,{name:"close",look:"mini","aria-hidden":"true",className:"size-3.5"})}function z({text:t,label:r,copiedLabel:i}){const{copied:l,copy:a}=e(t);/* @__PURE__ */
6
- return y("button",{type:"button",tabIndex:-1,"aria-label":l?i:r,title:l?i:r,onClick:a,className:"flex size-5 shrink-0 items-center justify-center rounded text-gray-400 hover:bg-gray-200 hover:text-gray-700 @max-[10rem]:hidden",children:/* @__PURE__ */y(n,{copied:l,className:"size-3.5"})})}function _({node:e}){const n=u(null);return f(()=>{const t=n.current;if(t)return t.appendChild(e),()=>{e.parentNode===t&&t.removeChild(e)}},[e]),/* @__PURE__ */y("span",{ref:n,className:"ml-1 flex shrink-0 items-center"})}function j({tabs:e,activeKey:n,idFor:f,panelMounted:k,onActivate:C,onClose:j,onCloseMany:D,label:T,className:A,activeClassName:E,end:M,afterPinned:B,onIconMenu:S,menuItems:O,sizing:R="even",tall:G=!1,onReorder:K,groupInfo:F}){const L=o().pageTabs,X=o().count,[H,V]=s(null),W=G?"h-[34px]":"h-8",J=d(()=>e.map(e=>({key:e.key,group:F?e.group:void 0})),[e,F]),Y=d(()=>g(J),[J]),[P,Q]=s(()=>/* @__PURE__ */new Set),U=t=>{if(!P.has(t)){const r=Y.find(e=>e.group===t),i=e.findIndex(e=>e.key===n);if(r&&i>=r.start&&i<=r.end){const n=e[r.end+1]??e[r.start-1];n&&C(n.key)}}Q(e=>{const n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n})},q=n?J.find(e=>e.key===n)?.group:void 0;c(()=>{void 0!==q&&Q(e=>{if(!e.has(q))return e;const n=new Set(e);return n.delete(q),n})},[n]);const Z=d(()=>{const n=[];for(const t of Y)for(let r=t.start;r<=t.end;r++)void 0!==t.group&&P.has(t.group)||n.push(e[r]);return n},[Y,P,e]),ee=u(null),[ne,te]=s(null),re=(n,t)=>K?{draggable:!0,onDragStart:t=>{ee.current=n,t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e.find(e=>e.key===n.key)?.title??"")},onDragOver:e=>{const r=ee.current;if(!r)return;const i=e.currentTarget.getBoundingClientRect(),l=t!==n.key||"tab"===n.kind?e.clientX<i.left+i.width/2?"before":"after":"before",a=x(J,r,t,l)?b(J,r,t,l):null;if(!a)return void(ne&&te(null));e.preventDefault(),e.dataTransfer.dropEffect="move";const o=e=>J.find(n=>n.key===e)?.group,s="tab"===r.kind&&void 0!==o(r.key)&&o(r.key)===o(a.key);ne?.key===a.key&&ne.side===a.side&&ne.inGroup===s||te({key:a.key,side:a.side,inGroup:s})},onDrop:e=>{const n=ee.current;if(!n||!ne)return;e.preventDefault();const t=x(J,n,ne.key,ne.side);ee.current=null,te(null),t&&K(t)},onDragEnd:()=>{ee.current=null,te(null)}}:{},ie=d(()=>new Set(Y.filter(e=>void 0!==e.group&&F).map(n=>e[n.start].key)),[Y,e,F]),le=e=>"pointer-events-none absolute inset-y-1 z-[3] w-0.5 rounded-full bg-blue-500 "+("before"===e?"-left-px":"-right-px"),ae=e=>ne?.key===e&&!("before"===ne.side&&ie.has(e)&&!ne.inGroup)&&/* @__PURE__ */y("span",{"aria-hidden":"true",className:le(ne.side)}),oe=e.length;c(()=>{if(!n)return;const e=document.getElementById(f(n,"tab"));e?.scrollIntoView?.({block:"nearest",inline:"nearest"})},[f,n,oe]);const se=B?Z.findIndex(e=>!e.pinned):-1,de=Z.some(e=>e.key===n)?n:Z[0]?.key,ce=e=>{const n=Z[(e+Z.length)%Z.length];n&&document.getElementById(f(n.key,"tab"))?.focus()},ue=(e,n)=>{const t=Z[e+n];if(!K||!t)return;const r=x(J,{kind:"tab",key:Z[e].key},t.key,n<0?"before":"after");r&&(K(r),setTimeout(()=>document.getElementById(f(Z[e].key,"tab"))?.focus(),0))},me=H?e.find(e=>e.key===H.key):void 0,fe=me&&O?O(me.key):[],pe=me?e.indexOf(me):-1,ye=e=>e.some(e=>!e.pinned),he=e=>()=>{V(null),e()},ge=(e,t)=>{const r=e.key===n,i=!!e.dirty,l=e.icon,o=r?E??"z-[1] border-transparent bg-gray-50 text-gray-900":"border-transparent text-gray-600 hover:bg-gray-200/70 hover:text-gray-900",s=!!t&&!r&&t.key!==n,d={type:"button",role:"tab",id:f(e.key,"tab"),"aria-selected":r,"aria-controls":k?.(e.key)?f(e.key,"panel"):void 0,tabIndex:e.key===de?0:-1,title:e.title,onClick:()=>C(e.key)},c={onContextMenu:n=>((e,n)=>{e.preventDefault(),V({x:e.clientX,y:e.clientY,key:n.key})})(n,e),onAuxClick:n=>((e,n)=>{1!==e.button||n.pinned||(e.preventDefault(),j(n.key))})(n,e),onMouseDown:e=>{1===e.button&&e.preventDefault()}},u=l&&
4
+ /* @__PURE__ */y("span",{"aria-hidden":"true",className:`${C} -right-2 [mask-image:radial-gradient(circle_at_100%_0,transparent_0.5rem,#000_calc(0.5rem+0.5px))]`})]})}function z(){/* @__PURE__ */
5
+ return y(a,{name:"close",look:"mini","aria-hidden":"true",className:"size-3.5"})}function I({text:t,label:r,copiedLabel:i}){const{copied:l,copy:a}=e(t);/* @__PURE__ */
6
+ return y("button",{type:"button",tabIndex:-1,"aria-label":l?i:r,title:l?i:r,onClick:a,className:"flex size-5 shrink-0 items-center justify-center rounded text-gray-400 hover:bg-gray-200 hover:text-gray-700 @max-[10rem]:hidden",children:/* @__PURE__ */y(n,{copied:l,className:"size-3.5"})})}function _({node:e}){const n=u(null);return f(()=>{const t=n.current;if(t)return t.appendChild(e),()=>{e.parentNode===t&&t.removeChild(e)}},[e]),/* @__PURE__ */y("span",{ref:n,className:"ml-1 flex shrink-0 items-center"})}function j({tabs:e,activeKey:n,idFor:f,panelMounted:k,onActivate:C,onClose:j,onCloseMany:D,label:T,className:E,activeClassName:M,end:A,afterPinned:R,onIconMenu:B,menuItems:K,sizing:S="even",tall:L=!1,onReorder:O,groupInfo:G}){const W=o().pageTabs,F=o().count,[J,H]=s(null),P=L?"h-[34px]":"h-8",V=d(()=>e.map(e=>({key:e.key,group:G?e.group:void 0})),[e,G]),X=d(()=>g(V),[V]),[U,Y]=s(()=>/* @__PURE__ */new Set),q=t=>{if(!U.has(t)){const r=X.find(e=>e.group===t),i=e.findIndex(e=>e.key===n);if(r&&i>=r.start&&i<=r.end){const n=e[r.end+1]??e[r.start-1];n&&C(n.key)}}Y(e=>{const n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n})},Q=n?V.find(e=>e.key===n)?.group:void 0;c(()=>{void 0!==Q&&Y(e=>{if(!e.has(Q))return e;const n=new Set(e);return n.delete(Q),n})},[n]);const Z=d(()=>{const n=[];for(const t of X)for(let r=t.start;r<=t.end;r++)void 0!==t.group&&U.has(t.group)||n.push(e[r]);return n},[X,U,e]),ee=u(null),[ne,te]=s(null),re=(n,t)=>O?{draggable:!0,onDragStart:t=>{ee.current=n,t.dataTransfer.effectAllowed="move",t.dataTransfer.setData("text/plain",e.find(e=>e.key===n.key)?.title??"")},onDragOver:e=>{const r=ee.current;if(!r)return;const i=e.currentTarget.getBoundingClientRect(),l=t!==n.key||"tab"===n.kind?e.clientX<i.left+i.width/2?"before":"after":"before",a=x(V,r,t,l)?b(V,r,t,l):null;if(!a)return void(ne&&te(null));e.preventDefault(),e.dataTransfer.dropEffect="move";const o=e=>V.find(n=>n.key===e)?.group,s="tab"===r.kind&&void 0!==o(r.key)&&o(r.key)===o(a.key);ne?.key===a.key&&ne.side===a.side&&ne.inGroup===s||te({key:a.key,side:a.side,inGroup:s})},onDrop:e=>{const n=ee.current;if(!n||!ne)return;e.preventDefault();const t=x(V,n,ne.key,ne.side);ee.current=null,te(null),t&&O(t)},onDragEnd:()=>{ee.current=null,te(null)}}:{},ie=d(()=>new Set(X.filter(e=>void 0!==e.group&&G).map(n=>e[n.start].key)),[X,e,G]),le=e=>"pointer-events-none absolute inset-y-1 z-[3] w-0.5 rounded-full bg-blue-500 "+("before"===e?"-left-px":"-right-px"),ae=e=>ne?.key===e&&!("before"===ne.side&&ie.has(e)&&!ne.inGroup)&&/* @__PURE__ */y("span",{"aria-hidden":"true",className:le(ne.side)}),oe=e.length;c(()=>{if(!n)return;const e=document.getElementById(f(n,"tab"));e?.scrollIntoView?.({block:"nearest",inline:"nearest"})},[f,n,oe]);const se=R?Z.findIndex(e=>!e.pinned):-1,de=Z.some(e=>e.key===n)?n:Z[0]?.key,ce=e=>{const n=Z[(e+Z.length)%Z.length];n&&document.getElementById(f(n.key,"tab"))?.focus()},ue=(e,n)=>{const t=Z[e+n];if(!O||!t)return;const r=x(V,{kind:"tab",key:Z[e].key},t.key,n<0?"before":"after");r&&(O(r),setTimeout(()=>document.getElementById(f(Z[e].key,"tab"))?.focus(),0))},me=J?e.find(e=>e.key===J.key):void 0,fe=me&&K?K(me.key):[],pe=me?e.indexOf(me):-1,ye=e=>e.some(e=>!e.pinned),he=e=>()=>{H(null),e()},ge=(e,t)=>!!t&&e.key!==n&&t.key!==n,ke=(e,t)=>{const r=e.key===n,i=e.pinned?"auto":r?"active-full"===S?"15rem":e.copy||B&&e.icon?"minmax(4.25rem,20rem)":"minmax(4.25rem,15rem)":"minmax(4rem,15rem)";return ge(e,t)?["auto",i]:[i]},be=(e,t)=>{const r=e.key===n,i=!!e.dirty,l=e.icon,o=r?M??"z-[1] border-transparent bg-gray-50 text-gray-900":"border-transparent text-gray-600 hover:bg-gray-200/70 hover:text-gray-900",s=ge(e,t),d={type:"button",role:"tab",id:f(e.key,"tab"),"aria-selected":r,"aria-controls":k?.(e.key)?f(e.key,"panel"):void 0,tabIndex:e.key===de?0:-1,title:e.title,onClick:()=>C(e.key)},c={onContextMenu:n=>((e,n)=>{e.preventDefault(),H({x:e.clientX,y:e.clientY,key:n.key})})(n,e),onAuxClick:n=>((e,n)=>{1!==e.button||n.pinned||(e.preventDefault(),j(n.key))})(n,e),onMouseDown:e=>{1===e.button&&e.preventDefault()}},u=l&&
7
7
  /* @__PURE__ */p("span",{className:"relative flex size-4 shrink-0 items-center justify-center text-gray-500 [&>svg]:size-4","aria-hidden":"true",children:[l,i&&!r&&!e.pinned&&
8
- /* @__PURE__ */y("span",{className:"absolute -right-1 -top-1 hidden size-2 rounded-full bg-gray-500 ring-2 ring-gray-100 @max-[6.5rem]:block @max-[6.5rem]:group-hover:hidden"})]}),h=r&&!!S&&!!l;return e.pinned?/* @__PURE__ */p("div",{role:"presentation",className:`group relative flex flex-none items-center justify-center rounded-t-lg border border-b-0 transition-colors ${W} ${l?"w-10":""} ${o}`,...c,...re({kind:"tab",key:e.key},e.key),children:[ae(e.key),r&&/* @__PURE__ */y($,{}),
8
+ /* @__PURE__ */y("span",{className:"absolute -right-1 -top-1 hidden size-2 rounded-full bg-gray-500 ring-2 ring-gray-100 @max-[6.5rem]:block @max-[6.5rem]:group-hover:hidden"})]}),h=r&&!!B&&!!l;return e.pinned?/* @__PURE__ */p("div",{role:"presentation",className:`group relative flex flex-none items-center justify-center rounded-t-lg border border-b-0 transition-colors ${P} ${l?"w-10":""} ${o}`,...c,...re({kind:"tab",key:e.key},e.key),children:[ae(e.key),r&&/* @__PURE__ */y($,{}),
9
9
  /* @__PURE__ */p("button",{...d,className:`flex h-full items-center justify-center rounded-t-lg ${l?"w-full":"px-3"} ${w}`,children:[u,
10
10
  /* @__PURE__ */y("span",{className:l?"sr-only":"whitespace-nowrap text-sm",children:e.title})]})]},e.key):/* @__PURE__ */p(m,{children:[s&&/* @__PURE__ */y("span",{"aria-hidden":"true",className:"mb-3 h-4 w-px shrink-0 self-end border-l border-gray-300"}),
11
- /* @__PURE__ */p("div",{role:"presentation",className:`group relative flex items-center rounded-t-lg border border-b-0 text-sm transition-colors ${W} ${"active-full"===R&&r?"":"@container"} ${"active-full"===R?r?"flex-[0_0_15rem] min-w-0":N:r&&(e.copy||h)?"flex-[0_1_20rem]":v} ${r?"active-full"===R?"":"min-w-[4.25rem]":"min-w-[4rem]"} ${o}`,...c,...re({kind:"tab",key:e.key},e.key),children:[ae(e.key),r&&/* @__PURE__ */y($,{}),h&&
12
- /* @__PURE__ */y("button",{type:"button",tabIndex:-1,"aria-haspopup":"menu","aria-label":L.tabMenu,title:L.tabMenu,onClick:n=>{const t=n.currentTarget.getBoundingClientRect();S?.(e.key,t.left,t.bottom+4)},className:`ml-2 flex size-6 shrink-0 items-center justify-center rounded hover:bg-gray-200 @max-[5rem]:ml-2 ${w}`,children:u}),
11
+ /* @__PURE__ */p("div",{role:"presentation",className:`group relative flex items-center rounded-t-lg border border-b-0 text-sm transition-colors ${P} ${"active-full"===S&&r?"":"@container"} ${"active-full"===S?r?"flex-[0_0_15rem] min-w-0":N:r&&(e.copy||h)?"flex-[0_100_20rem]":v} ${r?"active-full"===S?"":"min-w-[4.25rem]":"min-w-[4rem]"} ${o}`,...c,...re({kind:"tab",key:e.key},e.key),children:[ae(e.key),r&&/* @__PURE__ */y($,{}),h&&
12
+ /* @__PURE__ */y("button",{type:"button",tabIndex:-1,"aria-haspopup":"menu","aria-label":W.tabMenu,title:W.tabMenu,onClick:n=>{const t=n.currentTarget.getBoundingClientRect();B?.(e.key,t.left,t.bottom+4)},className:`ml-2 flex size-6 shrink-0 items-center justify-center rounded hover:bg-gray-200 @max-[5rem]:ml-2 ${w}`,children:u}),
13
13
  /* @__PURE__ */p("button",{...d,className:`flex h-full min-w-0 flex-1 items-center gap-2 rounded-t-lg pr-1 text-left ${h?"pl-2":"pl-3"} ${w} ${r?h?"":"@max-[5rem]:pl-3":"@max-[6.5rem]:pr-3 @max-[4.5rem]:justify-center @max-[4.5rem]:px-0 @max-[4.5rem]:group-hover:pl-2 @max-[4.5rem]:group-hover:pr-3"}`,children:[!h&&u,
14
- /* @__PURE__ */p("span",{className:`min-w-0 flex-1 overflow-hidden whitespace-nowrap [mask-image:linear-gradient(to_right,#000_calc(100%-1rem),transparent)] ${"active-full"===R&&r?"pr-4":""} ${l?r?"@max-[5rem]:sr-only":"@max-[4.5rem]:sr-only":""}`,children:[e.title,e.favorite&&
15
- /* @__PURE__ */y("span",{role:"img","aria-label":L.favorite,title:L.favorite,className:"ml-1 inline-flex align-[-0.125em] text-yellow-500",children:/* @__PURE__ */y(a,{name:"star","aria-hidden":"true",className:"size-3.5",fill:"currentColor",strokeWidth:1.5})})]})]}),r&&e.actions&&/* @__PURE__ */y(_,{node:e.actions}),r&&e.copy&&/* @__PURE__ */y(z,{text:e.copy,label:L.copy(e.copy),copiedLabel:L.copied}),
16
- /* @__PURE__ */p("span",{className:"mr-2 flex size-5 shrink-0 items-center justify-center "+(r?"":"@max-[6.5rem]:hidden @max-[6.5rem]:group-hover:flex"),children:[i&&/* @__PURE__ */y("span",{role:"img","aria-label":L.unsaved,className:"size-2 rounded-full bg-gray-500 group-hover:hidden"}),
17
- /* @__PURE__ */y("button",{type:"button",tabIndex:-1,"aria-label":L.closeTab?.(e.title)??`${L.close} ${e.title}`,onClick:()=>j(e.key),className:"size-5 items-center justify-center rounded text-gray-400 hover:bg-gray-200 hover:text-gray-700 "+(i?"hidden group-hover:flex":r?"flex":"flex opacity-0 group-hover:opacity-100 focus-visible:opacity-100"),children:/* @__PURE__ */y(I,{})})]})]})]},e.key)},ke=[];let be,xe=0,ve=!B;for(const r of Y){const i=Z.filter(n=>{const t=e.indexOf(n);return t>=r.start&&t<=r.end});if(ve||xe!==se||(ve=!0,ke.push(/* @__PURE__ */y(m,{children:B},"rosh-after-pinned")),be=void 0),xe+=i.length,void 0===r.group||!F){for(const e of i)ke.push(ge(e,be)),be=e;continue}be=void 0;const l=r.group,o=F(l),s=r.end-r.start+1,d=!P.has(l),c=e[r.start].key,u=i.some(e=>e.key===n)?"shrink-[0.01]":"shrink";ke.push(
18
- /* @__PURE__ */p("div",{role:"group","aria-label":o.label,"data-tab-group":l,className:`relative mx-1 flex items-end first:ml-0 ${u}`,children:[
19
- /* @__PURE__ */p("button",{type:"button",tabIndex:-1,"aria-expanded":d,title:L.groupToggle(o.label,s),onClick:()=>U(l),...re({kind:"group",key:c},c),className:`relative mb-1 mr-1 flex h-6 shrink-0 items-center gap-1 rounded-full bg-blue-100 px-2 text-xs font-medium text-blue-700 hover:bg-blue-200 ${w}`,children:[
14
+ /* @__PURE__ */p("span",{className:`min-w-0 flex-1 overflow-hidden whitespace-nowrap [mask-image:linear-gradient(to_right,#000_calc(100%-1rem),transparent)] ${"active-full"===S&&r?"pr-4":""} ${l?r?"@max-[5rem]:sr-only":"@max-[4.5rem]:sr-only":""}`,children:[e.title,e.favorite&&
15
+ /* @__PURE__ */y("span",{role:"img","aria-label":W.favorite,title:W.favorite,className:"ml-1 inline-flex align-[-0.125em] text-yellow-500",children:/* @__PURE__ */y(a,{name:"star","aria-hidden":"true",className:"size-3.5",fill:"currentColor",strokeWidth:1.5})})]})]}),r&&e.actions&&/* @__PURE__ */y(_,{node:e.actions}),r&&e.copy&&/* @__PURE__ */y(I,{text:e.copy,label:W.copy(e.copy),copiedLabel:W.copied}),
16
+ /* @__PURE__ */p("span",{className:"mr-2 flex size-5 shrink-0 items-center justify-center "+(r?"":"@max-[6.5rem]:hidden @max-[6.5rem]:group-hover:flex"),children:[i&&/* @__PURE__ */y("span",{role:"img","aria-label":W.unsaved,className:"size-2 rounded-full bg-gray-500 group-hover:hidden"}),
17
+ /* @__PURE__ */y("button",{type:"button",tabIndex:-1,"aria-label":W.closeTab?.(e.title)??`${W.close} ${e.title}`,onClick:()=>j(e.key),className:"size-5 items-center justify-center rounded text-gray-400 hover:bg-gray-200 hover:text-gray-700 "+(i?"hidden group-hover:flex":r?"flex":"flex opacity-0 group-hover:opacity-100 focus-visible:opacity-100"),children:/* @__PURE__ */y(z,{})})]})]})]},e.key)},xe=[];let ve,Ne=0,we=!R;for(const r of X){const i=Z.filter(n=>{const t=e.indexOf(n);return t>=r.start&&t<=r.end});if(we||Ne!==se||(we=!0,xe.push(/* @__PURE__ */y(m,{children:R},"rosh-after-pinned")),ve=void 0),Ne+=i.length,void 0===r.group||!G){for(const e of i)xe.push(be(e,ve)),ve=e;continue}ve=void 0;const l=r.group,o=G(l),s=r.end-r.start+1,d=!U.has(l),c=e[r.start].key,u=i.some(e=>e.key===n)?"shrink":"shrink-[100]",f=["auto",...i.flatMap((e,n)=>ke(e,n>0?i[n-1]:void 0))];xe.push(
18
+ /* @__PURE__ */p("div",{role:"group","aria-label":o.label,"data-tab-group":l,className:`relative mx-1 grid grid-flow-col items-end first:ml-0 ${u}`,style:{gridTemplateColumns:f.join(" ")},children:[
19
+ /* @__PURE__ */p("button",{type:"button",tabIndex:-1,"aria-expanded":d,title:W.groupToggle(o.label,s),onClick:()=>q(l),...re({kind:"group",key:c},c),className:`relative mb-1 mr-1 flex h-6 shrink-0 items-center gap-1 rounded-full bg-blue-100 px-2 text-xs font-medium text-blue-700 hover:bg-blue-200 ${w}`,children:[
20
20
  /* @__PURE__ */y(a,{name:d?"chevron-down":"chevron-right","aria-hidden":"true",className:"size-3",strokeWidth:2}),o.icon&&/* @__PURE__ */y("span",{className:"flex size-3.5 items-center justify-center [&>svg]:size-3.5","aria-hidden":"true",children:o.icon}),
21
21
  /* @__PURE__ */y("span",{className:d?"sr-only":"max-w-[12rem] truncate",children:o.label}),
22
- /* @__PURE__ */y(t,{count:s,label:X.tabs(s),active:!0})]}),ne?.key===c&&"before"===ne.side&&!ne.inGroup&&/* @__PURE__ */y("span",{"aria-hidden":"true",className:le("before")}),i.map((e,n)=>ge(e,n>0?i[n-1]:void 0)),
23
- /* @__PURE__ */y("span",{"aria-hidden":"true",className:"pointer-events-none absolute inset-x-0 bottom-0 z-0 h-0.5 bg-blue-500"})]},`rosh-group-${c}`))}return ve||ke.push(/* @__PURE__ */y(m,{children:B},"rosh-after-pinned")),/* @__PURE__ */p("div",{className:A??"relative flex h-10 shrink-0 items-end gap-3 bg-gray-100 px-3",children:[
22
+ /* @__PURE__ */y(t,{count:s,label:F.tabs(s),active:!0})]}),ne?.key===c&&"before"===ne.side&&!ne.inGroup&&/* @__PURE__ */y("span",{"aria-hidden":"true",className:le("before")}),i.map((e,n)=>be(e,n>0?i[n-1]:void 0)),
23
+ /* @__PURE__ */y("span",{"aria-hidden":"true",className:"pointer-events-none absolute inset-x-0 bottom-0 z-0 h-0.5 bg-blue-500"})]},`rosh-group-${c}`))}return we||xe.push(/* @__PURE__ */y(m,{children:R},"rosh-after-pinned")),/* @__PURE__ */p("div",{className:E??"relative flex h-10 shrink-0 items-end gap-3 bg-gray-100 px-3",children:[
24
24
  /* @__PURE__ */y("div",{"aria-hidden":"true",className:"pointer-events-none absolute inset-x-0 bottom-0 h-px bg-gray-200"}),
25
- /* @__PURE__ */y("div",{role:"tablist","aria-label":T,onKeyDown:e=>{const n=Z.findIndex(n=>document.getElementById(f(n.key,"tab"))===e.target);if(n<0)return;const t=e.shiftKey&&(e.ctrlKey||e.metaKey);if(t&&"ArrowRight"===e.key)ue(n,1);else if(t&&"ArrowLeft"===e.key)ue(n,-1);else if("ArrowRight"===e.key)ce(n+1);else if("ArrowLeft"===e.key)ce(n-1);else if("Home"===e.key)ce(0);else if("End"===e.key)ce(Z.length-1);else{if("Delete"!==e.key||Z[n].pinned)return;j(Z[n].key)}e.preventDefault()},className:"flex min-w-0 flex-1 items-end -mx-2 px-2 scroll-px-2 overflow-x-auto overflow-y-hidden [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",children:ke}),M&&/* @__PURE__ */y("div",{className:"flex shrink-0 items-center gap-2 self-center",children:M}),H&&me&&/* @__PURE__ */p(r,{portal:!0,style:{left:H.x,top:H.y},onClose:()=>V(null),children:[fe.length>0&&/* @__PURE__ */p(h,{children:[fe.map((e,n)=>/* @__PURE__ */p(i,{onClick:he(e.onSelect),children:[e.icon,e.label]},n)),
25
+ /* @__PURE__ */y("div",{role:"tablist","aria-label":T,onKeyDown:e=>{const n=Z.findIndex(n=>document.getElementById(f(n.key,"tab"))===e.target);if(n<0)return;const t=e.shiftKey&&(e.ctrlKey||e.metaKey);if(t&&"ArrowRight"===e.key)ue(n,1);else if(t&&"ArrowLeft"===e.key)ue(n,-1);else if("ArrowRight"===e.key)ce(n+1);else if("ArrowLeft"===e.key)ce(n-1);else if("Home"===e.key)ce(0);else if("End"===e.key)ce(Z.length-1);else{if("Delete"!==e.key||Z[n].pinned)return;j(Z[n].key)}e.preventDefault()},className:"flex min-w-0 flex-1 items-end -mx-2 px-2 scroll-px-2 overflow-x-auto overflow-y-hidden [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",children:xe}),A&&/* @__PURE__ */y("div",{className:"flex shrink-0 items-center gap-2 self-center",children:A}),J&&me&&/* @__PURE__ */p(r,{portal:!0,style:{left:J.x,top:J.y},onClose:()=>H(null),children:[fe.length>0&&/* @__PURE__ */p(h,{children:[fe.map((e,n)=>/* @__PURE__ */p(i,{onClick:he(e.onSelect),children:[e.icon,e.label]},n)),
26
26
  /* @__PURE__ */y(l,{})]}),
27
- /* @__PURE__ */y(i,{disabled:me.pinned,onClick:he(()=>j(me.key)),children:L.close}),
27
+ /* @__PURE__ */y(i,{disabled:me.pinned,onClick:he(()=>j(me.key)),children:W.close}),
28
28
  /* @__PURE__ */y(l,{}),
29
- /* @__PURE__ */y(i,{disabled:!ye(e.filter(e=>e.key!==me.key)),onClick:he(()=>D("others",me.key)),children:L.closeOthers}),
30
- /* @__PURE__ */y(i,{disabled:!ye(e.slice(pe+1)),onClick:he(()=>D("right",me.key)),children:L.closeRight}),
31
- /* @__PURE__ */y(i,{disabled:!ye(e),onClick:he(()=>D("all",null)),children:L.closeAll})]})]})}export{j as TabStrip};
29
+ /* @__PURE__ */y(i,{disabled:!ye(e.filter(e=>e.key!==me.key)),onClick:he(()=>D("others",me.key)),children:W.closeOthers}),
30
+ /* @__PURE__ */y(i,{disabled:!ye(e.slice(pe+1)),onClick:he(()=>D("right",me.key)),children:W.closeRight}),
31
+ /* @__PURE__ */y(i,{disabled:!ye(e),onClick:he(()=>D("all",null)),children:W.closeAll})]})]})}export{j as TabStrip};
@@ -1 +1 @@
1
- import{DEFAULT_SHELL_STRINGS as e,useShellStrings as t}from"./chunk-43MCNASD.js";import{useRef as r,useState as n,useCallback as s}from"react";import{jsx as a}from"react/jsx-runtime";function o(e,t){const r=(t??"").split(",").map(e=>e.trim().toLocaleLowerCase()).filter(Boolean);if(0===r.length||r.includes("*")||r.includes("*/*"))return!0;const n=e.name.toLocaleLowerCase(),s=e.type.toLocaleLowerCase();return r.some(e=>e.startsWith(".")?n.endsWith(e):e.endsWith("/*")?s.startsWith(e.slice(0,-1)):s===e)}var l=(t,r=e.files)=>t<1024?r.bytes(t):t<1048576?r.kilobytes(Math.round(t/1024)):r.megabytes(t/1048576),i=e=>Array.from(e.dataTransfer?.types??[]).includes("Files");function c(e){const t=e.clipboardData;if(!t)return[];if(t.files&&t.files.length>0)return Array.from(t.files);const r=[];for(const e of Array.from(t.items??[]))if("file"===e.kind){const t=e.getAsFile();t&&r.push(t)}return r}function u({onAccept:e,accept:a,maxSizeBytes:u,maxFiles:f,multiple:p=!0,currentCount:m=0,acceptHint:d,disabled:h=!1}){const g=t().files,y=r(null),[x,v]=n(!1),[D,A]=n([]),L=r(0),b="string"==typeof d?d:"",C=s(t=>{if(h||!t)return;const r=Array.from(t);if(0===r.length)return;const n=[],s=[];for(const e of p?r:r.slice(0,1))o(e,a)?null!=u&&e.size>u?s.push({file:e,reason:"size",message:g.tooLarge(e.name,l(e.size,g),l(u,g))}):p&&null!=f&&m+n.length>=f?s.push({file:e,reason:"count",message:g.tooMany(e.name,f)}):n.push(e):s.push({file:e,reason:"type",message:g.notAccepted(e.name,b)});A(s),n.length&&e(n),y.current&&(y.current.value="")},[h,p,a,b,u,f,m,e,g]),j=s(()=>{h||y.current?.click()},[h]),k=s(()=>A([]),[]);return{inputRef:y,inputProps:{ref:y,type:"file",accept:a||void 0,multiple:p,disabled:h,tabIndex:-1,"aria-hidden":!0,className:"hidden",onChange:e=>C(e.target.files)},zoneProps:h?{}:{onDragEnter:e=>{i(e)&&(e.preventDefault(),L.current+=1,v(!0))},onDragOver:e=>{i(e)&&(e.preventDefault(),x||v(!0))},onDragLeave:e=>{i(e)&&(L.current=Math.max(0,L.current-1),0===L.current&&v(!1))},onDrop:e=>{i(e)&&(e.preventDefault(),L.current=0,v(!1),C(e.dataTransfer.files))}},pasteProps:h?{}:{onPaste:e=>{const t=c(e);0!==t.length&&(e.preventDefault(),C(t))}},open:j,take:C,dragOver:x,rejections:D,clearRejections:k}}function f({rejections:e,className:t="mt-2"}){return 0===e.length?null:/* @__PURE__ */a("ul",{role:"alert",className:`${t} flex flex-col gap-0.5`,children:e.map(({file:e,message:t},r)=>/* @__PURE__ */a("li",{className:"text-xs text-red-600",children:t},`${e.name}-${r}`))})}export{f as FileIntakeAlert,o as acceptsFile,l as humanSize,i as isFileDrag,c as pastedFiles,u as useFileIntake};
1
+ import{DEFAULT_SHELL_STRINGS as e,useShellStrings as t}from"./chunk-TJSJVC6P.js";import{useRef as r,useState as n,useCallback as s}from"react";import{jsx as a}from"react/jsx-runtime";function o(e,t){const r=(t??"").split(",").map(e=>e.trim().toLocaleLowerCase()).filter(Boolean);if(0===r.length||r.includes("*")||r.includes("*/*"))return!0;const n=e.name.toLocaleLowerCase(),s=e.type.toLocaleLowerCase();return r.some(e=>e.startsWith(".")?n.endsWith(e):e.endsWith("/*")?s.startsWith(e.slice(0,-1)):s===e)}var l=(t,r=e.files)=>t<1024?r.bytes(t):t<1048576?r.kilobytes(Math.round(t/1024)):r.megabytes(t/1048576),i=e=>Array.from(e.dataTransfer?.types??[]).includes("Files");function c(e){const t=e.clipboardData;if(!t)return[];if(t.files&&t.files.length>0)return Array.from(t.files);const r=[];for(const e of Array.from(t.items??[]))if("file"===e.kind){const t=e.getAsFile();t&&r.push(t)}return r}function u({onAccept:e,accept:a,maxSizeBytes:u,maxFiles:f,multiple:p=!0,currentCount:m=0,acceptHint:d,disabled:h=!1}){const g=t().files,y=r(null),[x,v]=n(!1),[D,L]=n([]),b=r(0),A="string"==typeof d?d:"",C=s(t=>{if(h||!t)return;const r=Array.from(t);if(0===r.length)return;const n=[],s=[];for(const e of p?r:r.slice(0,1))o(e,a)?null!=u&&e.size>u?s.push({file:e,reason:"size",message:g.tooLarge(e.name,l(e.size,g),l(u,g))}):p&&null!=f&&m+n.length>=f?s.push({file:e,reason:"count",message:g.tooMany(e.name,f)}):n.push(e):s.push({file:e,reason:"type",message:g.notAccepted(e.name,A)});L(s),n.length&&e(n),y.current&&(y.current.value="")},[h,p,a,A,u,f,m,e,g]),j=s(()=>{h||y.current?.click()},[h]),k=s(()=>L([]),[]);return{inputRef:y,inputProps:{ref:y,type:"file",accept:a||void 0,multiple:p,disabled:h,tabIndex:-1,"aria-hidden":!0,className:"hidden",onChange:e=>C(e.target.files)},zoneProps:h?{}:{onDragEnter:e=>{i(e)&&(e.preventDefault(),b.current+=1,v(!0))},onDragOver:e=>{i(e)&&(e.preventDefault(),x||v(!0))},onDragLeave:e=>{i(e)&&(b.current=Math.max(0,b.current-1),0===b.current&&v(!1))},onDrop:e=>{i(e)&&(e.preventDefault(),b.current=0,v(!1),C(e.dataTransfer.files))}},pasteProps:h?{}:{onPaste:e=>{const t=c(e);0!==t.length&&(e.preventDefault(),C(t))}},open:j,take:C,dragOver:x,rejections:D,clearRejections:k}}function f({rejections:e,className:t="mt-2"}){return 0===e.length?null:/* @__PURE__ */a("ul",{role:"alert",className:`${t} flex flex-col gap-0.5`,children:e.map(({file:e,message:t},r)=>/* @__PURE__ */a("li",{className:"text-xs text-red-600",children:t},`${e.name}-${r}`))})}export{f as FileIntakeAlert,o as acceptsFile,l as humanSize,i as isFileDrag,c as pastedFiles,u as useFileIntake};