@bmxc/pami-elements 0.1.0-beta.1 → 0.1.0-beta.2

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 (949) hide show
  1. package/README.md +11 -28
  2. package/bin/templates/astro/package.json +2 -2
  3. package/bin/templates/html/index.html +2 -2
  4. package/bin/templates/html/package.json +2 -2
  5. package/bin/templates/next/package.json +3 -3
  6. package/bin/templates/nuxt/package.json +2 -2
  7. package/bin/templates/sveltekit/package.json +2 -2
  8. package/custom-elements.json +1359 -227
  9. package/dist/cjs/{a11y-Ca42WC0-.js → a11y-BkZcUjqf.js} +3 -3
  10. package/dist/cjs/{a11y-Ca42WC0-.js.map → a11y-BkZcUjqf.js.map} +1 -1
  11. package/dist/cjs/{bar-chart-C5fkmmAE.js → bar-chart-H044QgXk.js} +4 -4
  12. package/dist/cjs/{bar-chart-C5fkmmAE.js.map → bar-chart-H044QgXk.js.map} +1 -1
  13. package/dist/cjs/{chart-CHUt-2H0.js → chart-XXwCCL0v.js} +4 -4
  14. package/dist/cjs/{chart-CHUt-2H0.js.map → chart-XXwCCL0v.js.map} +1 -1
  15. package/dist/cjs/{hit-test-ChmAe1Nv.js → hit-test-C-8-_ADP.js} +3 -3
  16. package/dist/cjs/{hit-test-ChmAe1Nv.js.map → hit-test-C-8-_ADP.js.map} +1 -1
  17. package/dist/cjs/isolation-escape-DfVN8s6G.js +92 -0
  18. package/dist/cjs/isolation-escape-DfVN8s6G.js.map +1 -0
  19. package/dist/cjs/loader.cjs.js +1 -1
  20. package/dist/cjs/pami-app-bar.cjs.entry.js +2 -2
  21. package/dist/cjs/pami-app-bar.cjs.entry.js.map +1 -1
  22. package/dist/cjs/pami-area-chart.cjs.entry.js +4 -4
  23. package/dist/cjs/pami-avatar_2.cjs.entry.js +2 -2
  24. package/dist/cjs/pami-avatar_2.cjs.entry.js.map +1 -1
  25. package/dist/cjs/pami-bar-chart.cjs.entry.js +4 -4
  26. package/dist/cjs/pami-bottom-sheet.cjs.entry.js +2 -2
  27. package/dist/cjs/pami-bottom-sheet.cjs.entry.js.map +1 -1
  28. package/dist/cjs/pami-breadcrumb-item.cjs.entry.js +2 -2
  29. package/dist/cjs/pami-breadcrumb-item.cjs.entry.js.map +1 -1
  30. package/dist/cjs/pami-button_7.cjs.entry.js +23 -39
  31. package/dist/cjs/pami-button_7.cjs.entry.js.map +1 -1
  32. package/dist/cjs/pami-callout.cjs.entry.js +30 -0
  33. package/dist/cjs/pami-callout.cjs.entry.js.map +1 -0
  34. package/dist/cjs/pami-checkbox.cjs.entry.js +5 -5
  35. package/dist/cjs/pami-checkbox.cjs.entry.js.map +1 -1
  36. package/dist/cjs/pami-chip.cjs.entry.js +5 -5
  37. package/dist/cjs/pami-chip.cjs.entry.js.map +1 -1
  38. package/dist/cjs/pami-date-picker.cjs.entry.js +4 -5
  39. package/dist/cjs/pami-date-picker.cjs.entry.js.map +1 -1
  40. package/dist/cjs/pami-dialog.cjs.entry.js +4 -4
  41. package/dist/cjs/pami-dialog.cjs.entry.js.map +1 -1
  42. package/dist/cjs/pami-divider.cjs.entry.js +2 -2
  43. package/dist/cjs/pami-fab-menu-item.cjs.entry.js +5 -5
  44. package/dist/cjs/pami-fab-menu-item.cjs.entry.js.map +1 -1
  45. package/dist/cjs/pami-fab-menu.cjs.entry.js +2 -2
  46. package/dist/cjs/pami-fab.cjs.entry.js +5 -5
  47. package/dist/cjs/pami-fab.cjs.entry.js.map +1 -1
  48. package/dist/cjs/pami-line-chart.cjs.entry.js +6 -6
  49. package/dist/cjs/pami-list-item.cjs.entry.js +2 -2
  50. package/dist/cjs/pami-list-item.cjs.entry.js.map +1 -1
  51. package/dist/cjs/pami-menu-item-group.cjs.entry.js +2 -2
  52. package/dist/cjs/pami-menu-item-group.cjs.entry.js.map +1 -1
  53. package/dist/cjs/pami-menu_2.cjs.entry.js +5 -88
  54. package/dist/cjs/pami-menu_2.cjs.entry.js.map +1 -1
  55. package/dist/cjs/pami-meter.cjs.entry.js +2 -2
  56. package/dist/cjs/pami-multi-select.cjs.entry.js +3 -3
  57. package/dist/cjs/pami-multi-select.cjs.entry.js.map +1 -1
  58. package/dist/cjs/pami-navigation-bar.cjs.entry.js +2 -2
  59. package/dist/cjs/pami-navigation-bar.cjs.entry.js.map +1 -1
  60. package/dist/cjs/pami-navigation-group.cjs.entry.js +24 -0
  61. package/dist/cjs/pami-navigation-group.cjs.entry.js.map +1 -0
  62. package/dist/cjs/pami-navigation-rail-tab.cjs.entry.js +156 -9
  63. package/dist/cjs/pami-navigation-rail-tab.cjs.entry.js.map +1 -1
  64. package/dist/cjs/pami-navigation-rail.cjs.entry.js +211 -29
  65. package/dist/cjs/pami-navigation-rail.cjs.entry.js.map +1 -1
  66. package/dist/cjs/pami-navigation-tab.cjs.entry.js +3 -3
  67. package/dist/cjs/pami-navigation-tab.cjs.entry.js.map +1 -1
  68. package/dist/cjs/pami-organization-chart.cjs.entry.js +1 -1
  69. package/dist/cjs/pami-organization-chart.cjs.entry.js.map +1 -1
  70. package/dist/cjs/{pami-painter-CEq_kp4Z.js → pami-painter-WpO-HKN2.js} +260 -57
  71. package/dist/cjs/pami-painter-WpO-HKN2.js.map +1 -0
  72. package/dist/cjs/pami-pie-chart.cjs.entry.js +4 -4
  73. package/dist/cjs/pami-progress-indicator.cjs.entry.js +1 -1
  74. package/dist/cjs/pami-rating.cjs.entry.js +3 -3
  75. package/dist/cjs/pami-rating.cjs.entry.js.map +1 -1
  76. package/dist/cjs/pami-search.cjs.entry.js +1 -1
  77. package/dist/cjs/pami-search.cjs.entry.js.map +1 -1
  78. package/dist/cjs/pami-segmented-button-set.cjs.entry.js +2 -2
  79. package/dist/cjs/pami-segmented-button.cjs.entry.js +6 -6
  80. package/dist/cjs/pami-segmented-button.cjs.entry.js.map +1 -1
  81. package/dist/cjs/pami-select.cjs.entry.js +2 -2
  82. package/dist/cjs/pami-side-sheet.cjs.entry.js +49 -22
  83. package/dist/cjs/pami-side-sheet.cjs.entry.js.map +1 -1
  84. package/dist/cjs/pami-skeleton.cjs.entry.js +1 -1
  85. package/dist/cjs/pami-slider.cjs.entry.js +2 -2
  86. package/dist/cjs/pami-slider.cjs.entry.js.map +1 -1
  87. package/dist/cjs/pami-sparkline.cjs.entry.js +4 -4
  88. package/dist/cjs/pami-split-button.cjs.entry.js +6 -6
  89. package/dist/cjs/pami-split-button.cjs.entry.js.map +1 -1
  90. package/dist/cjs/pami-step.cjs.entry.js +7 -7
  91. package/dist/cjs/pami-stepper.cjs.entry.js +3 -3
  92. package/dist/cjs/pami-sub-menu-item.cjs.entry.js +4 -4
  93. package/dist/cjs/pami-sub-menu-item.cjs.entry.js.map +1 -1
  94. package/dist/cjs/pami-switch.cjs.entry.js +4 -4
  95. package/dist/cjs/pami-switch.cjs.entry.js.map +1 -1
  96. package/dist/cjs/pami-tab-panel.cjs.entry.js +1 -1
  97. package/dist/cjs/pami-tab-panels.cjs.entry.js +1 -1
  98. package/dist/cjs/pami-tab.cjs.entry.js +5 -5
  99. package/dist/cjs/pami-table-body.cjs.entry.js +1 -1
  100. package/dist/cjs/pami-table-cell.cjs.entry.js +2 -2
  101. package/dist/cjs/pami-table-container.cjs.entry.js +2 -2
  102. package/dist/cjs/pami-table-expand-toggle.cjs.entry.js +2 -2
  103. package/dist/cjs/pami-table-foot.cjs.entry.js +1 -1
  104. package/dist/cjs/pami-table-head.cjs.entry.js +1 -1
  105. package/dist/cjs/pami-table-pagination.cjs.entry.js +2 -2
  106. package/dist/cjs/pami-table-row.cjs.entry.js +4 -4
  107. package/dist/cjs/pami-table-sort-label.cjs.entry.js +2 -2
  108. package/dist/cjs/pami-table-toolbar.cjs.entry.js +2 -2
  109. package/dist/cjs/pami-tabs.cjs.entry.js +2 -2
  110. package/dist/cjs/pami-tag.cjs.entry.js +27 -0
  111. package/dist/cjs/pami-tag.cjs.entry.js.map +1 -0
  112. package/dist/cjs/pami-text-field.cjs.entry.js +2 -2
  113. package/dist/cjs/pami-text-field.cjs.entry.js.map +1 -1
  114. package/dist/cjs/pami-toolbar.cjs.entry.js +3 -3
  115. package/dist/cjs/pami-transfer-list.cjs.entry.js +1 -1
  116. package/dist/cjs/pami-transfer-list.cjs.entry.js.map +1 -1
  117. package/dist/cjs/pami.cjs.js +1 -1
  118. package/dist/cjs/{ripple-CiICEyeg.js → ripple-xSbG6X8P.js} +7 -2
  119. package/dist/cjs/ripple-xSbG6X8P.js.map +1 -0
  120. package/dist/cjs/{rtl-D4GO_8Co.js → rtl-Dof3JElE.js} +27 -5
  121. package/dist/cjs/rtl-Dof3JElE.js.map +1 -0
  122. package/dist/cjs/status-surface-BWKxIZPo.js +13 -0
  123. package/dist/cjs/status-surface-BWKxIZPo.js.map +1 -0
  124. package/dist/cjs/virtual-select-controller-BwjMiADh.js.map +1 -1
  125. package/dist/collection/collection-manifest.json +3 -0
  126. package/dist/collection/components/pami-app-bar/pami-app-bar.css +85 -86
  127. package/dist/collection/components/pami-bottom-sheet/pami-bottom-sheet.css +85 -86
  128. package/dist/collection/components/pami-breadcrumb-item/pami-breadcrumb-item.css +85 -86
  129. package/dist/collection/components/pami-button/pami-button.css +85 -86
  130. package/dist/collection/components/pami-callout/pami-callout.css +298 -0
  131. package/dist/collection/components/pami-callout/pami-callout.js +94 -0
  132. package/dist/collection/components/pami-callout/pami-callout.js.map +1 -0
  133. package/dist/collection/components/pami-card/pami-card.css +85 -86
  134. package/dist/collection/components/pami-checkbox/pami-checkbox.css +85 -86
  135. package/dist/collection/components/pami-checkbox/pami-checkbox.js +2 -2
  136. package/dist/collection/components/pami-chip/pami-chip.css +85 -86
  137. package/dist/collection/components/pami-chip/pami-chip.js +2 -2
  138. package/dist/collection/components/pami-date-picker/pami-date-picker.js +3 -4
  139. package/dist/collection/components/pami-date-picker/pami-date-picker.js.map +1 -1
  140. package/dist/collection/components/pami-dialog/pami-dialog.css +85 -86
  141. package/dist/collection/components/pami-dialog/pami-dialog.js +2 -2
  142. package/dist/collection/components/pami-divider/pami-divider.js +2 -2
  143. package/dist/collection/components/pami-fab/pami-fab.css +85 -86
  144. package/dist/collection/components/pami-fab/pami-fab.js +2 -2
  145. package/dist/collection/components/pami-fab-menu/pami-fab-menu.js +2 -2
  146. package/dist/collection/components/pami-fab-menu-item/pami-fab-menu-item.css +85 -86
  147. package/dist/collection/components/pami-fab-menu-item/pami-fab-menu-item.js +2 -2
  148. package/dist/collection/components/pami-icon/pami-icon.js +1 -1
  149. package/dist/collection/components/pami-icon-button/pami-icon-button.css +85 -86
  150. package/dist/collection/components/pami-line-chart/pami-line-chart.js +2 -2
  151. package/dist/collection/components/pami-list-item/pami-list-item.css +1597 -1599
  152. package/dist/collection/components/pami-menu/pami-menu.css +1 -1
  153. package/dist/collection/components/pami-menu-item/pami-menu-item.css +5 -5
  154. package/dist/collection/components/pami-menu-item-group/pami-menu-item-group.css +2 -2
  155. package/dist/collection/components/pami-menu-item-group/pami-menu-item-group.js +1 -1
  156. package/dist/collection/components/pami-meter/pami-meter.js +2 -2
  157. package/dist/collection/components/pami-multi-select/pami-multi-select.css +4 -4
  158. package/dist/collection/components/pami-multi-select/pami-multi-select.js +2 -2
  159. package/dist/collection/components/pami-navigation-bar/pami-navigation-bar.css +85 -86
  160. package/dist/collection/components/pami-navigation-group/pami-navigation-group.css +30 -0
  161. package/dist/collection/components/pami-navigation-group/pami-navigation-group.js +76 -0
  162. package/dist/collection/components/pami-navigation-group/pami-navigation-group.js.map +1 -0
  163. package/dist/collection/components/pami-navigation-rail/pami-navigation-rail.css +70 -1
  164. package/dist/collection/components/pami-navigation-rail/pami-navigation-rail.js +452 -42
  165. package/dist/collection/components/pami-navigation-rail/pami-navigation-rail.js.map +1 -1
  166. package/dist/collection/components/pami-navigation-rail-tab/pami-navigation-rail-tab.css +186 -98
  167. package/dist/collection/components/pami-navigation-rail-tab/pami-navigation-rail-tab.js +282 -6
  168. package/dist/collection/components/pami-navigation-rail-tab/pami-navigation-rail-tab.js.map +1 -1
  169. package/dist/collection/components/pami-navigation-tab/pami-navigation-tab.css +85 -86
  170. package/dist/collection/components/pami-organization-chart/pami-organization-chart.css +1 -1
  171. package/dist/collection/components/pami-pie-chart/pami-pie-chart.js +2 -2
  172. package/dist/collection/components/pami-progress-indicator/pami-progress-indicator.js +1 -1
  173. package/dist/collection/components/pami-radio/pami-radio.css +85 -86
  174. package/dist/collection/components/pami-radio/pami-radio.js +2 -2
  175. package/dist/collection/components/pami-rating/pami-rating.css +3 -3
  176. package/dist/collection/components/pami-rating/pami-rating.js +2 -2
  177. package/dist/collection/components/pami-ripple/pami-ripple.css +6 -5
  178. package/dist/collection/components/pami-ripple/pami-ripple.js +2 -9
  179. package/dist/collection/components/pami-ripple/pami-ripple.js.map +1 -1
  180. package/dist/collection/components/pami-search/pami-search.css +3 -3
  181. package/dist/collection/components/pami-segmented-button/pami-segmented-button.css +85 -86
  182. package/dist/collection/components/pami-segmented-button/pami-segmented-button.js +3 -3
  183. package/dist/collection/components/pami-segmented-button-set/pami-segmented-button-set.js +2 -2
  184. package/dist/collection/components/pami-select/pami-select.js +2 -2
  185. package/dist/collection/components/pami-side-sheet/pami-side-sheet.css +85 -86
  186. package/dist/collection/components/pami-side-sheet/pami-side-sheet.js +10 -20
  187. package/dist/collection/components/pami-side-sheet/pami-side-sheet.js.map +1 -1
  188. package/dist/collection/components/pami-skeleton/pami-skeleton.js +1 -1
  189. package/dist/collection/components/pami-slider/pami-slider.css +87 -88
  190. package/dist/collection/components/pami-snackbar/pami-snackbar.css +93 -92
  191. package/dist/collection/components/pami-snackbar/pami-snackbar.js +2 -2
  192. package/dist/collection/components/pami-split-button/pami-split-button.css +85 -86
  193. package/dist/collection/components/pami-split-button/pami-split-button.js +3 -3
  194. package/dist/collection/components/pami-step/pami-step.js +6 -6
  195. package/dist/collection/components/pami-stepper/pami-stepper.js +3 -3
  196. package/dist/collection/components/pami-sub-menu-item/pami-sub-menu-item.css +4 -4
  197. package/dist/collection/components/pami-sub-menu-item/pami-sub-menu-item.js +2 -2
  198. package/dist/collection/components/pami-switch/pami-switch.css +85 -86
  199. package/dist/collection/components/pami-switch/pami-switch.js +2 -2
  200. package/dist/collection/components/pami-tab/pami-tab.js +4 -4
  201. package/dist/collection/components/pami-tab-panel/pami-tab-panel.js +1 -1
  202. package/dist/collection/components/pami-tab-panels/pami-tab-panels.js +1 -1
  203. package/dist/collection/components/pami-table-body/pami-table-body.js +1 -1
  204. package/dist/collection/components/pami-table-cell/pami-table-cell.js +2 -2
  205. package/dist/collection/components/pami-table-container/pami-table-container.js +2 -2
  206. package/dist/collection/components/pami-table-expand-toggle/pami-table-expand-toggle.js +2 -2
  207. package/dist/collection/components/pami-table-foot/pami-table-foot.js +1 -1
  208. package/dist/collection/components/pami-table-head/pami-table-head.js +1 -1
  209. package/dist/collection/components/pami-table-pagination/pami-table-pagination.js +2 -2
  210. package/dist/collection/components/pami-table-row/pami-table-row.js +4 -4
  211. package/dist/collection/components/pami-table-sort-label/pami-table-sort-label.js +2 -2
  212. package/dist/collection/components/pami-table-toolbar/pami-table-toolbar.js +2 -2
  213. package/dist/collection/components/pami-tabs/pami-tabs.js +2 -2
  214. package/dist/collection/components/pami-tag/pami-tag.css +298 -0
  215. package/dist/collection/components/pami-tag/pami-tag.js +68 -0
  216. package/dist/collection/components/pami-tag/pami-tag.js.map +1 -0
  217. package/dist/collection/components/pami-text-field/pami-text-field.css +87 -88
  218. package/dist/collection/components/pami-toolbar/pami-toolbar.js +3 -3
  219. package/dist/collection/components/pami-tooltip/pami-tooltip.css +92 -93
  220. package/dist/collection/components/pami-transfer-list/pami-transfer-list.css +2 -2
  221. package/dist/collection/utils/charts/theme.js +25 -3
  222. package/dist/collection/utils/charts/theme.js.map +1 -1
  223. package/dist/collection/utils/focusable.js +38 -0
  224. package/dist/collection/utils/focusable.js.map +1 -0
  225. package/dist/collection/utils/pami-dots.js.map +1 -1
  226. package/dist/collection/utils/pami-material-defaults.js +194 -0
  227. package/dist/collection/utils/pami-material-defaults.js.map +1 -0
  228. package/dist/collection/utils/pami-material.js +58 -49
  229. package/dist/collection/utils/pami-material.js.map +1 -1
  230. package/dist/collection/utils/pami-motion-defaults.js +9 -0
  231. package/dist/collection/utils/pami-motion-defaults.js.map +1 -0
  232. package/dist/collection/utils/pami-painter.js +9 -7
  233. package/dist/collection/utils/pami-painter.js.map +1 -1
  234. package/dist/collection/utils/ripple.js +5 -0
  235. package/dist/collection/utils/ripple.js.map +1 -1
  236. package/dist/collection/utils/status-surface.js +7 -0
  237. package/dist/collection/utils/status-surface.js.map +1 -0
  238. package/dist/collection/wasm/engine-abi.js.map +1 -1
  239. package/dist/components/p-8OtaKJiC.js +2 -0
  240. package/dist/components/{p-DWSD26x3.js.map → p-8OtaKJiC.js.map} +1 -1
  241. package/dist/components/{p-DkVOc0wm.js → p-8v8oq2Gq.js} +2 -2
  242. package/dist/{pami/p-BFrljlvu.js → components/p-AeIwPqCK.js} +2 -2
  243. package/dist/components/p-BG--_h1M.js +2 -0
  244. package/dist/{components-csr/p-CKh3uxJF.js.map → components/p-BG--_h1M.js.map} +1 -1
  245. package/dist/components/{p-C3VyQE8n.js → p-BHjV4ckR.js} +2 -2
  246. package/dist/components/p-BHqq4sFe.js.map +1 -1
  247. package/dist/components/p-BOfpnjA1.js +2 -0
  248. package/dist/components/p-BOfpnjA1.js.map +1 -0
  249. package/dist/components/p-BcrEx_cg.js +2 -0
  250. package/dist/components/p-BcrEx_cg.js.map +1 -0
  251. package/dist/components/p-BhHms8Pb.js +2 -0
  252. package/dist/components/p-BhHms8Pb.js.map +1 -0
  253. package/dist/components/p-CKqNm_Q4.js +2 -0
  254. package/dist/components/p-CKqNm_Q4.js.map +1 -0
  255. package/dist/components/p-CMZVEmTF.js +2 -0
  256. package/dist/components/p-CMZVEmTF.js.map +1 -0
  257. package/dist/components/p-CaX5Betz.js +2 -0
  258. package/dist/components/p-CaX5Betz.js.map +1 -0
  259. package/dist/components/{p-Dh4RKEYp.js → p-Cf7x7Pbw.js} +2 -2
  260. package/dist/components/{p-BKlel-AP.js → p-CsGff_Ta.js} +2 -2
  261. package/dist/components/p-D-9rjUCJ.js +2 -0
  262. package/dist/components/p-D-9rjUCJ.js.map +1 -0
  263. package/dist/components/p-D5YKcPYj.js +2 -0
  264. package/dist/components/p-D5YKcPYj.js.map +1 -0
  265. package/dist/components/p-DDCz_UhF.js +2 -0
  266. package/dist/components/{p-BT8CI4i3.js.map → p-DDCz_UhF.js.map} +1 -1
  267. package/dist/components/p-DFOfsObx.js +2 -0
  268. package/dist/{components-csr/p-PG3r1Ywi.js.map → components/p-DFOfsObx.js.map} +1 -1
  269. package/dist/components/{p-CFpk8pnq.js → p-DKXYFRHy.js} +2 -2
  270. package/dist/components/{p-BnCqDe23.js → p-DKhFTr-2.js} +2 -2
  271. package/dist/components/{p-BnCqDe23.js.map → p-DKhFTr-2.js.map} +1 -1
  272. package/dist/components/p-DYYnx9b0.js +2 -0
  273. package/dist/components/{p-CKrq0VhQ.js.map → p-DYYnx9b0.js.map} +1 -1
  274. package/dist/components/p-DcS5GdsQ.js +2 -0
  275. package/dist/components/{p-DD2A_AfS.js.map → p-DcS5GdsQ.js.map} +1 -1
  276. package/dist/components/{p-Bf1Bx-JV.js → p-DuoeMUTq.js} +2 -2
  277. package/dist/{components-csr/p-g4sA3hAp.js → components/p-DzxH9m7D.js} +2 -2
  278. package/dist/components/pami-accordion-item.js +1 -1
  279. package/dist/components/pami-app-bar.js +1 -1
  280. package/dist/components/pami-app-bar.js.map +1 -1
  281. package/dist/components/pami-area-chart.js +1 -1
  282. package/dist/components/pami-autocomplete.js +1 -1
  283. package/dist/components/pami-avatar.js +1 -1
  284. package/dist/components/pami-badge.js +1 -1
  285. package/dist/components/pami-bar-chart.js +1 -1
  286. package/dist/components/pami-bottom-sheet.js +1 -1
  287. package/dist/components/pami-bottom-sheet.js.map +1 -1
  288. package/dist/components/pami-breadcrumb-item.js +1 -1
  289. package/dist/components/pami-breadcrumb-item.js.map +1 -1
  290. package/dist/components/pami-button.js +1 -1
  291. package/dist/components/pami-callout.d.ts +11 -0
  292. package/dist/components/pami-callout.js +2 -0
  293. package/dist/components/pami-callout.js.map +1 -0
  294. package/dist/components/pami-card.js +1 -1
  295. package/dist/components/pami-card.js.map +1 -1
  296. package/dist/components/pami-checkbox.js +1 -1
  297. package/dist/components/pami-chip.js +1 -1
  298. package/dist/components/pami-date-picker.js +1 -1
  299. package/dist/components/pami-date-picker.js.map +1 -1
  300. package/dist/components/pami-dialog.js +1 -1
  301. package/dist/components/pami-dialog.js.map +1 -1
  302. package/dist/components/pami-divider.js +1 -1
  303. package/dist/components/pami-fab-menu-item.js +1 -1
  304. package/dist/components/pami-fab-menu-item.js.map +1 -1
  305. package/dist/components/pami-fab-menu.js +1 -1
  306. package/dist/components/pami-fab.js +1 -1
  307. package/dist/components/pami-fab.js.map +1 -1
  308. package/dist/components/pami-icon-button.js +1 -1
  309. package/dist/components/pami-icon.js +1 -1
  310. package/dist/components/pami-line-chart.js +1 -1
  311. package/dist/components/pami-list-item.js +1 -1
  312. package/dist/components/pami-list-item.js.map +1 -1
  313. package/dist/components/pami-menu-item-group.js +1 -1
  314. package/dist/components/pami-menu-item-group.js.map +1 -1
  315. package/dist/components/pami-menu-item.js +1 -1
  316. package/dist/components/pami-menu.js +1 -1
  317. package/dist/components/pami-meter.js +1 -1
  318. package/dist/components/pami-multi-select.js +1 -1
  319. package/dist/components/pami-multi-select.js.map +1 -1
  320. package/dist/components/pami-navigation-bar.js +1 -1
  321. package/dist/components/pami-navigation-bar.js.map +1 -1
  322. package/dist/components/pami-navigation-group.d.ts +11 -0
  323. package/dist/components/pami-navigation-group.js +2 -0
  324. package/dist/components/pami-navigation-group.js.map +1 -0
  325. package/dist/components/pami-navigation-rail-tab.js +1 -1
  326. package/dist/components/pami-navigation-rail-tab.js.map +1 -1
  327. package/dist/components/pami-navigation-rail.js +1 -1
  328. package/dist/components/pami-navigation-rail.js.map +1 -1
  329. package/dist/components/pami-navigation-tab.js +1 -1
  330. package/dist/components/pami-navigation-tab.js.map +1 -1
  331. package/dist/components/pami-number-field.js +1 -1
  332. package/dist/components/pami-organization-chart.js +1 -1
  333. package/dist/components/pami-organization-chart.js.map +1 -1
  334. package/dist/components/pami-pie-chart.js +1 -1
  335. package/dist/components/pami-progress-indicator.js +1 -1
  336. package/dist/components/pami-radio.js +1 -1
  337. package/dist/components/pami-radio.js.map +1 -1
  338. package/dist/components/pami-rating.js +1 -1
  339. package/dist/components/pami-rating.js.map +1 -1
  340. package/dist/components/pami-ripple.js +1 -1
  341. package/dist/components/pami-search.js +1 -1
  342. package/dist/components/pami-search.js.map +1 -1
  343. package/dist/components/pami-segmented-button-set.js +1 -1
  344. package/dist/components/pami-segmented-button.js +1 -1
  345. package/dist/components/pami-segmented-button.js.map +1 -1
  346. package/dist/components/pami-select.js +1 -1
  347. package/dist/components/pami-side-sheet.js +1 -1
  348. package/dist/components/pami-side-sheet.js.map +1 -1
  349. package/dist/components/pami-skeleton.js +1 -1
  350. package/dist/components/pami-slider.js +1 -1
  351. package/dist/components/pami-snackbar.js +1 -1
  352. package/dist/components/pami-snackbar.js.map +1 -1
  353. package/dist/components/pami-sparkline.js +1 -1
  354. package/dist/components/pami-split-button.js +1 -1
  355. package/dist/components/pami-split-button.js.map +1 -1
  356. package/dist/components/pami-step.js +1 -1
  357. package/dist/components/pami-stepper.js +1 -1
  358. package/dist/components/pami-sub-menu-item.js +1 -1
  359. package/dist/components/pami-sub-menu-item.js.map +1 -1
  360. package/dist/components/pami-switch.js +1 -1
  361. package/dist/components/pami-switch.js.map +1 -1
  362. package/dist/components/pami-tab-panel.js +1 -1
  363. package/dist/components/pami-tab-panels.js +1 -1
  364. package/dist/components/pami-tab.js +1 -1
  365. package/dist/components/pami-table-body.js +1 -1
  366. package/dist/components/pami-table-cell.js +1 -1
  367. package/dist/components/pami-table-container.js +1 -1
  368. package/dist/components/pami-table-expand-toggle.js +1 -1
  369. package/dist/components/pami-table-foot.js +1 -1
  370. package/dist/components/pami-table-head.js +1 -1
  371. package/dist/components/pami-table-pagination.js +1 -1
  372. package/dist/components/pami-table-row.js +1 -1
  373. package/dist/components/pami-table-sort-label.js +1 -1
  374. package/dist/components/pami-table-toolbar.js +1 -1
  375. package/dist/components/pami-table.js +1 -1
  376. package/dist/components/pami-tabs.js +1 -1
  377. package/dist/components/pami-tag.d.ts +11 -0
  378. package/dist/components/pami-tag.js +2 -0
  379. package/dist/components/pami-tag.js.map +1 -0
  380. package/dist/components/pami-text-field.js +1 -1
  381. package/dist/components/pami-time-picker.js +1 -1
  382. package/dist/components/pami-toolbar.js +1 -1
  383. package/dist/components/pami-tooltip.js +1 -1
  384. package/dist/components/pami-transfer-list.js +1 -1
  385. package/dist/components/pami-transfer-list.js.map +1 -1
  386. package/dist/{components/p-DneLEiFl.js → components-csr/p-AeIwPqCK.js} +2 -2
  387. package/dist/components-csr/p-BHqq4sFe.js.map +1 -1
  388. package/dist/components-csr/p-B_b8a4Fl.js +2 -0
  389. package/dist/components-csr/p-B_b8a4Fl.js.map +1 -0
  390. package/dist/components-csr/p-BhHms8Pb.js +2 -0
  391. package/dist/components-csr/p-BhHms8Pb.js.map +1 -0
  392. package/dist/components-csr/{p-Dq_XLtjQ.js → p-BubrJNco.js} +2 -2
  393. package/dist/components-csr/{p-Iozt_nIr.js → p-C1ChEady.js} +2 -2
  394. package/dist/components-csr/p-C7-2STYZ.js +2 -0
  395. package/dist/components-csr/{p-BN5fTT2p.js.map → p-C7-2STYZ.js.map} +1 -1
  396. package/dist/components-csr/{p-DYa7FJrs.js → p-CC0KCIVL.js} +2 -2
  397. package/dist/components-csr/{p-C2f3W2Bc.js → p-CCLyUnYm.js} +2 -2
  398. package/dist/components-csr/{p-C2f3W2Bc.js.map → p-CCLyUnYm.js.map} +1 -1
  399. package/dist/components-csr/p-CCjSxvVk.js +2 -0
  400. package/dist/{components/p-DQG2QiqW.js.map → components-csr/p-CCjSxvVk.js.map} +1 -1
  401. package/dist/components-csr/p-CEXhFms9.js +2 -0
  402. package/dist/components-csr/{p-BeWJtYZz.js.map → p-CEXhFms9.js.map} +1 -1
  403. package/dist/components-csr/{p-wjnroiZn.js → p-CYTOzIlz.js} +2 -2
  404. package/dist/components-csr/{p-BKlel-AP.js → p-CsGff_Ta.js} +2 -2
  405. package/dist/components-csr/p-D-9rjUCJ.js +2 -0
  406. package/dist/components-csr/p-D-9rjUCJ.js.map +1 -0
  407. package/dist/components-csr/p-D5YKcPYj.js +2 -0
  408. package/dist/components-csr/p-D5YKcPYj.js.map +1 -0
  409. package/dist/components-csr/{p-CFpk8pnq.js → p-DKXYFRHy.js} +2 -2
  410. package/dist/components-csr/p-DTQ249Fz.js +2 -0
  411. package/dist/components-csr/p-DTQ249Fz.js.map +1 -0
  412. package/dist/components-csr/p-DbpI0Jma.js +2 -0
  413. package/dist/components-csr/p-DbpI0Jma.js.map +1 -0
  414. package/dist/components-csr/p-DqlfsJFI.js +2 -0
  415. package/dist/components-csr/p-DqlfsJFI.js.map +1 -0
  416. package/dist/components-csr/p-DvPstOrO.js +2 -0
  417. package/dist/components-csr/{p-dksxS2yM.js.map → p-DvPstOrO.js.map} +1 -1
  418. package/dist/components-csr/p-DxiLsbpD.js +2 -0
  419. package/dist/components-csr/p-DxiLsbpD.js.map +1 -0
  420. package/dist/{components/p-g4sA3hAp.js → components-csr/p-DzxH9m7D.js} +2 -2
  421. package/dist/components-csr/p-F3cB-9hU.js +2 -0
  422. package/dist/{components/p-BZcBbRYY.js.map → components-csr/p-F3cB-9hU.js.map} +1 -1
  423. package/dist/components-csr/p-sSc4gYQy.js +2 -0
  424. package/dist/components-csr/{p-D4njrR9m.js.map → p-sSc4gYQy.js.map} +1 -1
  425. package/dist/components-csr/pami-accordion-item.js +1 -1
  426. package/dist/components-csr/pami-app-bar.js +1 -1
  427. package/dist/components-csr/pami-app-bar.js.map +1 -1
  428. package/dist/components-csr/pami-area-chart.js +1 -1
  429. package/dist/components-csr/pami-autocomplete.js +1 -1
  430. package/dist/components-csr/pami-avatar.js +1 -1
  431. package/dist/components-csr/pami-badge.js +1 -1
  432. package/dist/components-csr/pami-bar-chart.js +1 -1
  433. package/dist/components-csr/pami-bottom-sheet.js +1 -1
  434. package/dist/components-csr/pami-bottom-sheet.js.map +1 -1
  435. package/dist/components-csr/pami-breadcrumb-item.js +1 -1
  436. package/dist/components-csr/pami-breadcrumb-item.js.map +1 -1
  437. package/dist/components-csr/pami-button.js +1 -1
  438. package/dist/components-csr/pami-callout.js +2 -0
  439. package/dist/components-csr/pami-callout.js.map +1 -0
  440. package/dist/components-csr/pami-card.js +1 -1
  441. package/dist/components-csr/pami-card.js.map +1 -1
  442. package/dist/components-csr/pami-checkbox.js +1 -1
  443. package/dist/components-csr/pami-chip.js +1 -1
  444. package/dist/components-csr/pami-date-picker.js +1 -1
  445. package/dist/components-csr/pami-date-picker.js.map +1 -1
  446. package/dist/components-csr/pami-dialog.js +1 -1
  447. package/dist/components-csr/pami-dialog.js.map +1 -1
  448. package/dist/components-csr/pami-divider.js +1 -1
  449. package/dist/components-csr/pami-fab-menu-item.js +1 -1
  450. package/dist/components-csr/pami-fab-menu-item.js.map +1 -1
  451. package/dist/components-csr/pami-fab-menu.js +1 -1
  452. package/dist/components-csr/pami-fab.js +1 -1
  453. package/dist/components-csr/pami-fab.js.map +1 -1
  454. package/dist/components-csr/pami-icon-button.js +1 -1
  455. package/dist/components-csr/pami-icon.js +1 -1
  456. package/dist/components-csr/pami-line-chart.js +1 -1
  457. package/dist/components-csr/pami-list-item.js +1 -1
  458. package/dist/components-csr/pami-list-item.js.map +1 -1
  459. package/dist/components-csr/pami-menu-item-group.js +1 -1
  460. package/dist/components-csr/pami-menu-item-group.js.map +1 -1
  461. package/dist/components-csr/pami-menu-item.js +1 -1
  462. package/dist/components-csr/pami-menu.js +1 -1
  463. package/dist/components-csr/pami-meter.js +1 -1
  464. package/dist/components-csr/pami-multi-select.js +1 -1
  465. package/dist/components-csr/pami-multi-select.js.map +1 -1
  466. package/dist/components-csr/pami-navigation-bar.js +1 -1
  467. package/dist/components-csr/pami-navigation-bar.js.map +1 -1
  468. package/dist/components-csr/pami-navigation-group.js +2 -0
  469. package/dist/components-csr/pami-navigation-group.js.map +1 -0
  470. package/dist/components-csr/pami-navigation-rail-tab.js +1 -1
  471. package/dist/components-csr/pami-navigation-rail-tab.js.map +1 -1
  472. package/dist/components-csr/pami-navigation-rail.js +1 -1
  473. package/dist/components-csr/pami-navigation-rail.js.map +1 -1
  474. package/dist/components-csr/pami-navigation-tab.js +1 -1
  475. package/dist/components-csr/pami-navigation-tab.js.map +1 -1
  476. package/dist/components-csr/pami-number-field.js +1 -1
  477. package/dist/components-csr/pami-organization-chart.js +1 -1
  478. package/dist/components-csr/pami-organization-chart.js.map +1 -1
  479. package/dist/components-csr/pami-pie-chart.js +1 -1
  480. package/dist/components-csr/pami-progress-indicator.js +1 -1
  481. package/dist/components-csr/pami-radio.js +1 -1
  482. package/dist/components-csr/pami-radio.js.map +1 -1
  483. package/dist/components-csr/pami-rating.js +1 -1
  484. package/dist/components-csr/pami-rating.js.map +1 -1
  485. package/dist/components-csr/pami-ripple.js +1 -1
  486. package/dist/components-csr/pami-search.js +1 -1
  487. package/dist/components-csr/pami-search.js.map +1 -1
  488. package/dist/components-csr/pami-segmented-button-set.js +1 -1
  489. package/dist/components-csr/pami-segmented-button.js +1 -1
  490. package/dist/components-csr/pami-segmented-button.js.map +1 -1
  491. package/dist/components-csr/pami-select.js +1 -1
  492. package/dist/components-csr/pami-side-sheet.js +1 -1
  493. package/dist/components-csr/pami-side-sheet.js.map +1 -1
  494. package/dist/components-csr/pami-skeleton.js +1 -1
  495. package/dist/components-csr/pami-slider.js +1 -1
  496. package/dist/components-csr/pami-snackbar.js +1 -1
  497. package/dist/components-csr/pami-snackbar.js.map +1 -1
  498. package/dist/components-csr/pami-sparkline.js +1 -1
  499. package/dist/components-csr/pami-split-button.js +1 -1
  500. package/dist/components-csr/pami-split-button.js.map +1 -1
  501. package/dist/components-csr/pami-step.js +1 -1
  502. package/dist/components-csr/pami-stepper.js +1 -1
  503. package/dist/components-csr/pami-sub-menu-item.js +1 -1
  504. package/dist/components-csr/pami-sub-menu-item.js.map +1 -1
  505. package/dist/components-csr/pami-switch.js +1 -1
  506. package/dist/components-csr/pami-switch.js.map +1 -1
  507. package/dist/components-csr/pami-tab-panel.js +1 -1
  508. package/dist/components-csr/pami-tab-panels.js +1 -1
  509. package/dist/components-csr/pami-tab.js +1 -1
  510. package/dist/components-csr/pami-table-body.js +1 -1
  511. package/dist/components-csr/pami-table-cell.js +1 -1
  512. package/dist/components-csr/pami-table-container.js +1 -1
  513. package/dist/components-csr/pami-table-expand-toggle.js +1 -1
  514. package/dist/components-csr/pami-table-foot.js +1 -1
  515. package/dist/components-csr/pami-table-head.js +1 -1
  516. package/dist/components-csr/pami-table-pagination.js +1 -1
  517. package/dist/components-csr/pami-table-row.js +1 -1
  518. package/dist/components-csr/pami-table-sort-label.js +1 -1
  519. package/dist/components-csr/pami-table-toolbar.js +1 -1
  520. package/dist/components-csr/pami-table.js +1 -1
  521. package/dist/components-csr/pami-tabs.js +1 -1
  522. package/dist/components-csr/pami-tag.js +2 -0
  523. package/dist/components-csr/pami-tag.js.map +1 -0
  524. package/dist/components-csr/pami-text-field.js +1 -1
  525. package/dist/components-csr/pami-time-picker.js +1 -1
  526. package/dist/components-csr/pami-toolbar.js +1 -1
  527. package/dist/components-csr/pami-tooltip.js +1 -1
  528. package/dist/components-csr/pami-transfer-list.js +1 -1
  529. package/dist/components-csr/pami-transfer-list.js.map +1 -1
  530. package/dist/esm/{a11y-DF7yzz7s.js → a11y-CFk62WKO.js} +3 -3
  531. package/dist/esm/{a11y-DF7yzz7s.js.map → a11y-CFk62WKO.js.map} +1 -1
  532. package/dist/esm/{bar-chart-BNtUGWrj.js → bar-chart-lQiYsj4t.js} +4 -4
  533. package/dist/esm/{bar-chart-BNtUGWrj.js.map → bar-chart-lQiYsj4t.js.map} +1 -1
  534. package/dist/esm/{chart-C1fPeEiw.js → chart-DGgh0ehg.js} +4 -4
  535. package/dist/esm/{chart-C1fPeEiw.js.map → chart-DGgh0ehg.js.map} +1 -1
  536. package/dist/esm/{hit-test-VKGhXvU8.js → hit-test-CwC3GJmi.js} +3 -3
  537. package/dist/esm/{hit-test-VKGhXvU8.js.map → hit-test-CwC3GJmi.js.map} +1 -1
  538. package/dist/esm/isolation-escape-D19ZgNkU.js +90 -0
  539. package/dist/esm/isolation-escape-D19ZgNkU.js.map +1 -0
  540. package/dist/esm/loader.js +1 -1
  541. package/dist/esm/pami-app-bar.entry.js +2 -2
  542. package/dist/esm/pami-app-bar.entry.js.map +1 -1
  543. package/dist/esm/pami-area-chart.entry.js +4 -4
  544. package/dist/esm/pami-avatar_2.entry.js +2 -2
  545. package/dist/esm/pami-avatar_2.entry.js.map +1 -1
  546. package/dist/esm/pami-bar-chart.entry.js +4 -4
  547. package/dist/esm/pami-bottom-sheet.entry.js +2 -2
  548. package/dist/esm/pami-bottom-sheet.entry.js.map +1 -1
  549. package/dist/esm/pami-breadcrumb-item.entry.js +2 -2
  550. package/dist/esm/pami-breadcrumb-item.entry.js.map +1 -1
  551. package/dist/esm/pami-button_7.entry.js +23 -39
  552. package/dist/esm/pami-button_7.entry.js.map +1 -1
  553. package/dist/esm/pami-callout.entry.js +28 -0
  554. package/dist/esm/pami-callout.entry.js.map +1 -0
  555. package/dist/esm/pami-checkbox.entry.js +5 -5
  556. package/dist/esm/pami-checkbox.entry.js.map +1 -1
  557. package/dist/esm/pami-chip.entry.js +5 -5
  558. package/dist/esm/pami-chip.entry.js.map +1 -1
  559. package/dist/esm/pami-date-picker.entry.js +4 -5
  560. package/dist/esm/pami-date-picker.entry.js.map +1 -1
  561. package/dist/esm/pami-dialog.entry.js +4 -4
  562. package/dist/esm/pami-dialog.entry.js.map +1 -1
  563. package/dist/esm/pami-divider.entry.js +2 -2
  564. package/dist/esm/pami-fab-menu-item.entry.js +5 -5
  565. package/dist/esm/pami-fab-menu-item.entry.js.map +1 -1
  566. package/dist/esm/pami-fab-menu.entry.js +2 -2
  567. package/dist/esm/pami-fab.entry.js +5 -5
  568. package/dist/esm/pami-fab.entry.js.map +1 -1
  569. package/dist/esm/pami-line-chart.entry.js +6 -6
  570. package/dist/esm/pami-list-item.entry.js +2 -2
  571. package/dist/esm/pami-list-item.entry.js.map +1 -1
  572. package/dist/esm/pami-menu-item-group.entry.js +2 -2
  573. package/dist/esm/pami-menu-item-group.entry.js.map +1 -1
  574. package/dist/esm/pami-menu_2.entry.js +4 -87
  575. package/dist/esm/pami-menu_2.entry.js.map +1 -1
  576. package/dist/esm/pami-meter.entry.js +2 -2
  577. package/dist/esm/pami-multi-select.entry.js +3 -3
  578. package/dist/esm/pami-multi-select.entry.js.map +1 -1
  579. package/dist/esm/pami-navigation-bar.entry.js +2 -2
  580. package/dist/esm/pami-navigation-bar.entry.js.map +1 -1
  581. package/dist/esm/pami-navigation-group.entry.js +22 -0
  582. package/dist/esm/pami-navigation-group.entry.js.map +1 -0
  583. package/dist/esm/pami-navigation-rail-tab.entry.js +157 -10
  584. package/dist/esm/pami-navigation-rail-tab.entry.js.map +1 -1
  585. package/dist/esm/pami-navigation-rail.entry.js +211 -29
  586. package/dist/esm/pami-navigation-rail.entry.js.map +1 -1
  587. package/dist/esm/pami-navigation-tab.entry.js +3 -3
  588. package/dist/esm/pami-navigation-tab.entry.js.map +1 -1
  589. package/dist/esm/pami-organization-chart.entry.js +1 -1
  590. package/dist/esm/pami-organization-chart.entry.js.map +1 -1
  591. package/dist/esm/{pami-painter-BWqbBPaI.js → pami-painter-DOkewauC.js} +260 -57
  592. package/dist/esm/pami-painter-DOkewauC.js.map +1 -0
  593. package/dist/esm/pami-pie-chart.entry.js +4 -4
  594. package/dist/esm/pami-progress-indicator.entry.js +1 -1
  595. package/dist/esm/pami-rating.entry.js +3 -3
  596. package/dist/esm/pami-rating.entry.js.map +1 -1
  597. package/dist/esm/pami-search.entry.js +1 -1
  598. package/dist/esm/pami-search.entry.js.map +1 -1
  599. package/dist/esm/pami-segmented-button-set.entry.js +2 -2
  600. package/dist/esm/pami-segmented-button.entry.js +6 -6
  601. package/dist/esm/pami-segmented-button.entry.js.map +1 -1
  602. package/dist/esm/pami-select.entry.js +2 -2
  603. package/dist/esm/pami-side-sheet.entry.js +49 -22
  604. package/dist/esm/pami-side-sheet.entry.js.map +1 -1
  605. package/dist/esm/pami-skeleton.entry.js +1 -1
  606. package/dist/esm/pami-slider.entry.js +2 -2
  607. package/dist/esm/pami-slider.entry.js.map +1 -1
  608. package/dist/esm/pami-sparkline.entry.js +4 -4
  609. package/dist/esm/pami-split-button.entry.js +6 -6
  610. package/dist/esm/pami-split-button.entry.js.map +1 -1
  611. package/dist/esm/pami-step.entry.js +7 -7
  612. package/dist/esm/pami-stepper.entry.js +3 -3
  613. package/dist/esm/pami-sub-menu-item.entry.js +4 -4
  614. package/dist/esm/pami-sub-menu-item.entry.js.map +1 -1
  615. package/dist/esm/pami-switch.entry.js +4 -4
  616. package/dist/esm/pami-switch.entry.js.map +1 -1
  617. package/dist/esm/pami-tab-panel.entry.js +1 -1
  618. package/dist/esm/pami-tab-panels.entry.js +1 -1
  619. package/dist/esm/pami-tab.entry.js +5 -5
  620. package/dist/esm/pami-table-body.entry.js +1 -1
  621. package/dist/esm/pami-table-cell.entry.js +2 -2
  622. package/dist/esm/pami-table-container.entry.js +2 -2
  623. package/dist/esm/pami-table-expand-toggle.entry.js +2 -2
  624. package/dist/esm/pami-table-foot.entry.js +1 -1
  625. package/dist/esm/pami-table-head.entry.js +1 -1
  626. package/dist/esm/pami-table-pagination.entry.js +2 -2
  627. package/dist/esm/pami-table-row.entry.js +4 -4
  628. package/dist/esm/pami-table-sort-label.entry.js +2 -2
  629. package/dist/esm/pami-table-toolbar.entry.js +2 -2
  630. package/dist/esm/pami-tabs.entry.js +2 -2
  631. package/dist/esm/pami-tag.entry.js +25 -0
  632. package/dist/esm/pami-tag.entry.js.map +1 -0
  633. package/dist/esm/pami-text-field.entry.js +2 -2
  634. package/dist/esm/pami-text-field.entry.js.map +1 -1
  635. package/dist/esm/pami-toolbar.entry.js +3 -3
  636. package/dist/esm/pami-transfer-list.entry.js +1 -1
  637. package/dist/esm/pami-transfer-list.entry.js.map +1 -1
  638. package/dist/esm/pami.js +1 -1
  639. package/dist/esm/{ripple-DT5RL9GH.js → ripple-BcReJziW.js} +7 -2
  640. package/dist/esm/ripple-BcReJziW.js.map +1 -0
  641. package/dist/esm/{rtl-CC7FhM00.js → rtl-Cd87AK5r.js} +27 -5
  642. package/dist/esm/rtl-Cd87AK5r.js.map +1 -0
  643. package/dist/esm/status-surface-D5YKcPYj.js +11 -0
  644. package/dist/esm/status-surface-D5YKcPYj.js.map +1 -0
  645. package/dist/esm/virtual-select-controller-Dr_fPcoz.js.map +1 -1
  646. package/dist/pami/p-056cbfbc.entry.js +2 -0
  647. package/dist/pami/{p-2067b15d.entry.js.map → p-056cbfbc.entry.js.map} +1 -1
  648. package/dist/pami/p-0bf56063.entry.js +2 -0
  649. package/dist/pami/{p-f33d5f4a.entry.js.map → p-0bf56063.entry.js.map} +1 -1
  650. package/dist/pami/p-0e965950.entry.js +2 -0
  651. package/dist/pami/{p-0fcc82b3.entry.js.map → p-0e965950.entry.js.map} +1 -1
  652. package/dist/pami/p-105fff09.entry.js +2 -0
  653. package/dist/pami/{p-ec67197c.entry.js.map → p-105fff09.entry.js.map} +1 -1
  654. package/dist/pami/{p-bc63e548.entry.js → p-14668a82.entry.js} +2 -2
  655. package/dist/pami/{p-cdd36757.entry.js → p-1468d5c4.entry.js} +2 -2
  656. package/dist/pami/p-1cafa0bb.entry.js +2 -0
  657. package/dist/pami/p-1cafa0bb.entry.js.map +1 -0
  658. package/dist/pami/p-20fb765c.entry.js +2 -0
  659. package/dist/pami/{p-309b4e6d.entry.js.map → p-20fb765c.entry.js.map} +1 -1
  660. package/dist/pami/{p-a4a2f7e2.entry.js → p-230b51cc.entry.js} +2 -2
  661. package/dist/pami/{p-f6d50fc7.entry.js → p-253bb306.entry.js} +2 -2
  662. package/dist/pami/{p-c087aa2d.entry.js → p-27ba3c65.entry.js} +2 -2
  663. package/dist/pami/{p-3577517b.entry.js → p-2c9fef75.entry.js} +2 -2
  664. package/dist/pami/{p-2fa9e712.entry.js → p-3031787d.entry.js} +2 -2
  665. package/dist/pami/p-35c2a89b.entry.js +2 -0
  666. package/dist/pami/{p-688017eb.entry.js.map → p-35c2a89b.entry.js.map} +1 -1
  667. package/dist/pami/{p-27208b60.entry.js → p-39a6add3.entry.js} +2 -2
  668. package/dist/pami/{p-ed0554c3.entry.js → p-3fc31b91.entry.js} +2 -2
  669. package/dist/pami/p-475ee072.entry.js +2 -0
  670. package/dist/pami/{p-6753c7a1.entry.js.map → p-475ee072.entry.js.map} +1 -1
  671. package/dist/pami/p-511a1ee2.entry.js +2 -0
  672. package/dist/pami/{p-7415982c.entry.js.map → p-511a1ee2.entry.js.map} +1 -1
  673. package/dist/pami/{p-91d25664.entry.js → p-513685d7.entry.js} +2 -2
  674. package/dist/pami/p-59ddac87.entry.js +2 -0
  675. package/dist/pami/p-59ddac87.entry.js.map +1 -0
  676. package/dist/pami/p-5baf125c.entry.js +2 -0
  677. package/dist/pami/{p-bd2fb99f.entry.js.map → p-5baf125c.entry.js.map} +1 -1
  678. package/dist/pami/p-636faa29.entry.js +2 -0
  679. package/dist/pami/p-6bae2a7c.entry.js +2 -0
  680. package/dist/pami/{p-b2704345.entry.js.map → p-6bae2a7c.entry.js.map} +1 -1
  681. package/dist/pami/p-70dbf9e1.entry.js +2 -0
  682. package/dist/pami/{p-6cd18c0d.entry.js.map → p-70dbf9e1.entry.js.map} +1 -1
  683. package/dist/pami/{p-b193dd1d.entry.js → p-71d62a04.entry.js} +2 -2
  684. package/dist/pami/{p-3b859d3c.entry.js → p-72d9ed2c.entry.js} +2 -2
  685. package/dist/pami/{p-5202ded3.entry.js → p-74673292.entry.js} +2 -2
  686. package/dist/pami/p-76869b29.entry.js +2 -0
  687. package/dist/pami/p-80a613c4.entry.js +2 -0
  688. package/dist/pami/{p-dd4d87c2.entry.js.map → p-80a613c4.entry.js.map} +1 -1
  689. package/dist/pami/p-820ec742.entry.js +2 -0
  690. package/dist/pami/{p-6a29a776.entry.js.map → p-820ec742.entry.js.map} +1 -1
  691. package/dist/pami/p-837a6389.entry.js +2 -0
  692. package/dist/pami/{p-d7504084.entry.js.map → p-837a6389.entry.js.map} +1 -1
  693. package/dist/pami/p-8381c008.entry.js +2 -0
  694. package/dist/pami/{p-7788c931.entry.js → p-86b07f8c.entry.js} +2 -2
  695. package/dist/pami/p-9178ea2e.entry.js +2 -0
  696. package/dist/pami/{p-a304bc4f.entry.js.map → p-9178ea2e.entry.js.map} +1 -1
  697. package/dist/pami/p-98683da9.entry.js +2 -0
  698. package/dist/pami/p-98683da9.entry.js.map +1 -0
  699. package/dist/pami/p-9a353a79.entry.js +2 -0
  700. package/dist/pami/{p-19669ac1.entry.js.map → p-9a353a79.entry.js.map} +1 -1
  701. package/dist/pami/p-9be87f6a.entry.js +2 -0
  702. package/dist/pami/p-9be87f6a.entry.js.map +1 -0
  703. package/dist/pami/{p-B2g1f_O7.js → p-BBBPC79O.js} +2 -2
  704. package/dist/pami/{p-B2g1f_O7.js.map → p-BBBPC79O.js.map} +1 -1
  705. package/dist/pami/p-BHqq4sFe.js.map +1 -1
  706. package/dist/pami/p-BcReJziW.js +2 -0
  707. package/dist/pami/p-BcReJziW.js.map +1 -0
  708. package/dist/pami/{p-C9EuleXc.js → p-C0lgexyr.js} +2 -2
  709. package/dist/pami/{p-C9EuleXc.js.map → p-C0lgexyr.js.map} +1 -1
  710. package/dist/{components-csr/p-DneLEiFl.js → pami/p-CAbSnOPc.js} +2 -2
  711. package/dist/pami/{p-BFrljlvu.js.map → p-CAbSnOPc.js.map} +1 -1
  712. package/dist/pami/p-CO-2MY9L.js +2 -0
  713. package/dist/pami/p-CO-2MY9L.js.map +1 -0
  714. package/dist/pami/p-Cd87AK5r.js +2 -0
  715. package/dist/pami/p-Cd87AK5r.js.map +1 -0
  716. package/dist/pami/{p-BH7SGm-U.js → p-Cln3qKA1.js} +2 -2
  717. package/dist/pami/{p-BH7SGm-U.js.map → p-Cln3qKA1.js.map} +1 -1
  718. package/dist/pami/p-D-9rjUCJ.js +2 -0
  719. package/dist/pami/p-D-9rjUCJ.js.map +1 -0
  720. package/dist/pami/p-D5YKcPYj.js +2 -0
  721. package/dist/pami/p-D5YKcPYj.js.map +1 -0
  722. package/dist/pami/{p-a516fb19.entry.js → p-a019a982.entry.js} +2 -2
  723. package/dist/pami/{p-0435815b.entry.js → p-aa031eb5.entry.js} +2 -2
  724. package/dist/pami/p-b361c9df.entry.js +2 -0
  725. package/dist/pami/{p-4ba67b88.entry.js.map → p-b361c9df.entry.js.map} +1 -1
  726. package/dist/pami/p-b5ad00c7.entry.js +2 -0
  727. package/dist/pami/{p-3b5862ac.entry.js.map → p-b5ad00c7.entry.js.map} +1 -1
  728. package/dist/pami/{p-dcd9abf8.entry.js → p-b928a212.entry.js} +2 -2
  729. package/dist/pami/{p-dcd9abf8.entry.js.map → p-b928a212.entry.js.map} +1 -1
  730. package/dist/pami/p-bac3fd4b.entry.js +2 -0
  731. package/dist/pami/{p-542e81de.entry.js.map → p-bac3fd4b.entry.js.map} +1 -1
  732. package/dist/pami/{p-42cda324.entry.js → p-be632c39.entry.js} +2 -2
  733. package/dist/pami/p-bf2e4ee5.entry.js +2 -0
  734. package/dist/pami/p-bf2e4ee5.entry.js.map +1 -0
  735. package/dist/pami/{p-ea6e514b.entry.js → p-c02334c0.entry.js} +2 -2
  736. package/dist/pami/p-c2d67784.entry.js +2 -0
  737. package/dist/pami/{p-c0fe2248.entry.js.map → p-c2d67784.entry.js.map} +1 -1
  738. package/dist/pami/{p-2391ef6b.entry.js → p-c717cd31.entry.js} +2 -2
  739. package/dist/pami/{p-d3ad1da1.entry.js → p-cd63ef03.entry.js} +2 -2
  740. package/dist/pami/{p-0f29f2bd.entry.js → p-cfc88755.entry.js} +2 -2
  741. package/dist/pami/p-d4e1fa44.entry.js +2 -0
  742. package/dist/pami/{p-b6b7092b.entry.js.map → p-d4e1fa44.entry.js.map} +1 -1
  743. package/dist/pami/p-d540f586.entry.js +2 -0
  744. package/dist/pami/p-d540f586.entry.js.map +1 -0
  745. package/dist/pami/p-d6de57b2.entry.js +2 -0
  746. package/dist/pami/{p-f3798dc6.entry.js.map → p-d6de57b2.entry.js.map} +1 -1
  747. package/dist/pami/{p-14497ccf.entry.js → p-daf42aec.entry.js} +2 -2
  748. package/dist/pami/{p-b8234190.entry.js → p-db1ee1b9.entry.js} +2 -2
  749. package/dist/pami/p-db30e449.entry.js +2 -0
  750. package/dist/pami/{p-60beacc5.entry.js.map → p-db30e449.entry.js.map} +1 -1
  751. package/dist/pami/{p-836652ad.entry.js → p-df18bacb.entry.js} +2 -2
  752. package/dist/pami/p-e08729f9.entry.js +2 -0
  753. package/dist/pami/p-e08729f9.entry.js.map +1 -0
  754. package/dist/pami/p-e65964e6.entry.js +2 -0
  755. package/dist/pami/p-e65964e6.entry.js.map +1 -0
  756. package/dist/pami/{p-81c06d88.entry.js → p-eb41f4e0.entry.js} +2 -2
  757. package/dist/pami/{p-4c023e51.entry.js → p-f29f90b0.entry.js} +2 -2
  758. package/dist/pami/p-fdee2733.entry.js +2 -0
  759. package/dist/pami/p-fdee2733.entry.js.map +1 -0
  760. package/dist/pami/pami.css +1 -1
  761. package/dist/pami/pami.esm.js +1 -1
  762. package/dist/sources/0278a6f5523ac1971fe0eadaee435bb3fd1dab609b7ec764bb3ba27e6aa8fb9f/pami-tag.tsx +30 -0
  763. package/dist/sources/{2ca06a25aa09d16ee580ce4db2554dafa516510b11f32021ef8f6fb04f823f74 → 13a6bd84ea4ee85906df60baa09ea92c604bf646ce3185706eb1c0266895d4ed}/pami-dots.tsx +1 -1
  764. package/dist/sources/{3df1210c7755e2386ccdc6e29e251b9678dc7c26acc9889678e769f5d1e5fd42 → 1ca4bc0c0956feb952356552e336ba66adf3965c09f29c3789fec9cefa0c3544}/pami-tooltip.css_tag_pami-tooltip_encapsulation_shadow +7 -7
  765. package/dist/sources/{bab5cb1d4daef5470d47d7ab2d6a75eaccfea977da04caf9c3a95ba2faa3f44e → 22a900318c9e4ddcd6f822b3d01aef0ea4c8ff892de0523df9e150f102ac6e5c}/pami-navigation-rail.css_tag_pami-navigation-rail_encapsulation_shadow +70 -1
  766. package/dist/sources/23a624b39d421b326032df3fec7a6eb8efe63812913db4f295c846a801bcc2df/focusable.ts +30 -0
  767. package/dist/sources/{ad8dae24c0940d3d78e73c208a2174be0f44c17ad88d5c14bc2a8b63fc919a17 → 24aa796cdc2df026b1d4e1a916907dd4e7c027698a43fa800d853d6f21b753cb}/pami-organization-chart.css_tag_pami-organization-chart_encapsulation_shadow +1 -1
  768. package/dist/sources/282c6204b17cf224fa1c29c70b7eeca1f5026f4ca7d81056eef97db0249e4415/pami-callout.css_tag_pami-callout_encapsulation_shadow +21 -0
  769. package/dist/sources/31bcc0fc5bd4de92e30b1fd5d74fa98dc0049dfc15c6a020e71906684f155025/pami-callout.tsx +42 -0
  770. package/dist/sources/35e1ffdb7ade27d0dcc5f5a0b602351b4356ad348211a54bf9cdfb7ebef83787/pami-navigation-group.css_tag_pami-navigation-group_encapsulation_shadow +30 -0
  771. package/dist/sources/3a78d70fc3ef5cd9c2b84b578e8aa4375e3512fe678f067f38b2eeec94cfade4/status-surface.ts +7 -0
  772. package/dist/sources/{6c163582408b4d7bc04a9c1a1f80b01e5861719f85f7e9f35667a619e50f9a0d → 4e65fa3e48826997c92b075221b722d889fbb59033628dc409191a69bb0ef1e0}/pami-menu.css_tag_pami-menu_encapsulation_shadow +1 -1
  773. package/dist/sources/527cfd468257c872834df7758243d5de17f075578964fb4b2d854046eebf0b2e/pami-motion-defaults.ts +8 -0
  774. package/dist/sources/{f057ec9cc9b2bc271fc6cafb5a9e886c1f2f88b76678d917b60de199571abccd → 541eb7b972849c16a3b860f7ea1c30751a98f8fc521a6ca03791ce5d0fe9426e}/pami-menu-item-group.css_tag_pami-menu-item-group_encapsulation_shadow +2 -2
  775. package/dist/sources/{ae8a116d7a4ea11a820767e5165db1e532a538eb8ba9ed5f4dc5a47e806ae4e6 → 59e0809dd478584dd6e8662e903cd5a0186609577db7b77a0479bd247f0d0735}/pami-side-sheet.tsx +13 -27
  776. package/dist/sources/{23e3c0a6f1c4ed86fe96ca5d8788e5cf6464e2be07031fd644120ea4efc313bf → 655cbc888435fe150257bfbd2fe21a572779617ba76cd567ac7d78e06a1ae431}/ripple.ts +6 -2
  777. package/dist/sources/{fc66575830503cd73ba7d3bedde73217b0f304d317ca851afd9e791ddad97fb5 → 6562889930d75426b2d8c57a2a68e8cb5a1540c9cc7fc5ae289092574ae223d0}/pami-navigation-rail-tab.tsx +200 -15
  778. package/dist/sources/{dd8e7de0b6aeaafd88a8d13123e5d07588ab74d8773cd80f70de293e28041436 → 6bab0e0b67c3b4abbb85cf631ad2af114271f98b795e2f2644810bffe75d1522}/pami-sub-menu-item.css_tag_pami-sub-menu-item_encapsulation_shadow +4 -4
  779. package/dist/sources/7a4b29a22f5e14ab4f0918effe1b91ad9ae6076553b826cc90edf6e43879cba0/pami-material-defaults.ts +193 -0
  780. package/dist/sources/7e8a1b22f1a1cb54b4b7cdad4bbfad9606419cf010636f6174da980089144636/pami-navigation-group.tsx +26 -0
  781. package/dist/sources/{0d91fa3bea6a6c8c693b8dca19946aef1b86d6f793f181210e5863de09b4aebb → 89368cfde7ecd06ee05b5493ce0f0503fd48fd12c4d8f2cb47610eb38157fe71}/pami-material.ts +63 -59
  782. package/dist/sources/9259130eb26707816d2f73de6a6b83ded1d342166d4bee8d7c5799f47e0ce776/pami-tag.css_tag_pami-tag_encapsulation_shadow +21 -0
  783. package/dist/sources/{7b02ffe2929f3ab24d21441af70c419cc2a0ca0c729de1ab51220ae5dc096f43 → 99e17d776c986eca5093163516c22279037bdf5d42f009db8f128413ae5cdeb2}/pami-search.css_tag_pami-search_encapsulation_shadow +3 -3
  784. package/dist/sources/{9a58a561a902b8eb3fa212160fb365c303f6ea7d5687af2abbd199d33c031650 → a430938d1fedf6a7b604b1dc070760d52bd2733dd0ff8aed7a704d2b28374333}/pami-navigation-rail-tab.css_tag_pami-navigation-rail-tab_encapsulation_shadow +101 -12
  785. package/dist/sources/{d80b6e4787aedf6628772d776d5d57b77be707a870bb78623a294a319b40bb3e → b05e116ff2b2e46fa76f8b32a21147a5275ac6550d59caafe834aad82bb2eed0}/pami-text-field.css_tag_pami-text-field_encapsulation_shadow +2 -2
  786. package/dist/sources/{f6fe21d8ade03a04388b25dd1e4a67e8ac84e5266632336311b9baf5e3e84d69 → b9bac20e73b763e4fd71ade205acf3179f48016689659d32fc5e9f723ec85c0a}/pami-menu-item.css_tag_pami-menu-item_encapsulation_shadow +5 -5
  787. package/dist/sources/{5fe0a66f80f0c4e661475395d7877a25335c605cf4fb02649bd887ab73564259 → bd61b0a219bfab84d1e6663df7c8df2dcf7395ad6110036c14874aa788023c15}/pami-slider.css_tag_pami-slider_encapsulation_shadow +2 -2
  788. package/dist/sources/{4dfc9c9d5e8fa39922a949409e66b9109463b97f0216334358921d4359cb61d6 → c176f6ce79521b5b70160c1a13b338d00bb4a90ee56911e0e043d4357dcd7e2a}/pami-multi-select.css_tag_pami-multi-select_encapsulation_shadow +4 -4
  789. package/dist/sources/{401e8c4f1d9d32aa7fb3d874c070d5e22bec9ef7a8300826a07b4df525e3e8a8 → c519dd6bf9591ea0961eb52e22d71ceabf68824f19be3bc1320cd3b7d0d06a78}/engine-abi.ts +1 -1
  790. package/dist/sources/{9230de3e79e81a5d82c53463873054c838e407aaaa6b4d83adba3e6420e1b668 → cafd0118f482317824eba435efde10692a0127e2c8104a754ac33b2e7607ef96}/pami-snackbar.css_tag_pami-snackbar_encapsulation_shadow +8 -6
  791. package/dist/sources/{8889443144c58e5dc85b288bf6f749a4142b4193f110787d5c2daddd1bd83700 → d72b349c2c336f88909a4c9e1f34cfaa824d2ccecad96b73da0ab6749bc810dd}/pami-ripple.tsx +1 -8
  792. package/dist/sources/{11e2d73298037a1e448521a045b253837dc5dfbb94e72a1c8afdb506a4759743 → dafd4f816d3de4b66b9eb2595187284bdb6a77e48afdc32d7a5166a2616d38bd}/pami-painter.ts +17 -11
  793. package/dist/sources/{3f7b937a1eddf96604fddc1dc0d30b4772f761c6f8fbacf7fa7a8532d8b2481e → de0d8bdaad31567edd750b4698e1eb5fd8122dc20b6ace6785570a380c2423d4}/pami-date-picker.tsx +5 -6
  794. package/dist/sources/{7e5e96f6428bb444fa618169230fcdc578c80766ecab3eba809e4c32ba9a17f7 → ded76ce1309e48970e51b17c73d2644d34ea22e45bc1b28b88a1ad20868e6cb9}/pami-rating.css_tag_pami-rating_encapsulation_shadow +3 -3
  795. package/dist/sources/{c274c1a827c9a70c44cfd4799d9d6254dfc6c5bcc0ba7f6d8e1ddd8d353271e0 → e73037cc274dab6b17d817adbfa3e69990da7d34758566725e634d080a8f1b53}/pami-ripple.css_tag_pami-ripple_encapsulation_shadow +6 -5
  796. package/dist/sources/{641359b47e4118436db06f645b766217d40ae15f1c1a8d1f978bdb04be56ced5 → eb9bf841ae4f9b06494c9b3edb130c9813e19f74f6f62490d9211914f616629b}/pami-list-item.css_tag_pami-list-item_encapsulation_shadow +1597 -1599
  797. package/dist/sources/{1c5da4122976a320028f326a3d21ba0f34a7bef5a8b3c0876912f32fe88c73a9 → f72676b12f85fff0999352413beba9ff1088fdbb4f64d593d1bf1936cd773cc6}/theme.ts +24 -5
  798. package/dist/sources/{95750dc74c5c9bce73cb26819375b45bd7b0462d6d52509ed918081dce4f1a0a → fdf252d43e9d2be51be81717c61f5215924906cbd31c969ef9a064d0d53c0aaf}/pami-navigation-rail.tsx +970 -766
  799. package/dist/sources/{3dfe9c1f569325c20a35778ec0dcb5ade6a20004645962282432aa2a85782276 → fff81d2a74c0586d69a65f9a8fe1954f6e853cc8f98c6cdea75a07a9737061b3}/pami-transfer-list.css_tag_pami-transfer-list_encapsulation_shadow +2 -2
  800. package/dist/types/components/pami-callout/pami-callout.d.ts +22 -0
  801. package/dist/types/components/pami-date-picker/pami-date-picker.d.ts +1 -2
  802. package/dist/types/components/pami-navigation-group/pami-navigation-group.d.ts +14 -0
  803. package/dist/types/components/pami-navigation-rail/pami-navigation-rail.d.ts +38 -0
  804. package/dist/types/components/pami-navigation-rail-tab/pami-navigation-rail-tab.d.ts +39 -0
  805. package/dist/types/components/pami-tag/pami-tag.d.ts +17 -0
  806. package/dist/types/components.d.ts +336 -14
  807. package/dist/types/utils/charts/theme.d.ts +2 -0
  808. package/dist/types/utils/focusable.d.ts +4 -0
  809. package/dist/types/utils/pami-dots.d.ts +1 -1
  810. package/dist/types/utils/pami-material-defaults.d.ts +108 -0
  811. package/dist/types/utils/pami-material.d.ts +12 -11
  812. package/dist/types/utils/pami-motion-defaults.d.ts +7 -0
  813. package/dist/types/utils/status-surface.d.ts +2 -0
  814. package/hydrate/index.js +983 -267
  815. package/hydrate/index.mjs +983 -267
  816. package/main-llm.md +14 -13
  817. package/package.json +2 -2
  818. package/src/components/pami-callout/readme.md +48 -0
  819. package/src/components/pami-navigation-group/readme.md +53 -0
  820. package/src/components/pami-navigation-rail/readme.md +91 -3
  821. package/src/components/pami-navigation-rail-tab/readme.md +30 -1
  822. package/src/components/pami-tag/readme.md +38 -0
  823. package/dist/cjs/pami-painter-CEq_kp4Z.js.map +0 -1
  824. package/dist/cjs/ripple-CiICEyeg.js.map +0 -1
  825. package/dist/cjs/rtl-D4GO_8Co.js.map +0 -1
  826. package/dist/components/p-29VlWbeT.js +0 -2
  827. package/dist/components/p-29VlWbeT.js.map +0 -1
  828. package/dist/components/p-BT8CI4i3.js +0 -2
  829. package/dist/components/p-BZcBbRYY.js +0 -2
  830. package/dist/components/p-C1b-wwIb.js +0 -2
  831. package/dist/components/p-C1b-wwIb.js.map +0 -1
  832. package/dist/components/p-CKrq0VhQ.js +0 -2
  833. package/dist/components/p-DD2A_AfS.js +0 -2
  834. package/dist/components/p-DFhQRL_q.js +0 -2
  835. package/dist/components/p-DFhQRL_q.js.map +0 -1
  836. package/dist/components/p-DO-HSPrg.js +0 -2
  837. package/dist/components/p-DO-HSPrg.js.map +0 -1
  838. package/dist/components/p-DQG2QiqW.js +0 -2
  839. package/dist/components/p-DWSD26x3.js +0 -2
  840. package/dist/components/p-NaJ3tJav.js +0 -2
  841. package/dist/components/p-NaJ3tJav.js.map +0 -1
  842. package/dist/components-csr/p-BN5fTT2p.js +0 -2
  843. package/dist/components-csr/p-BeWJtYZz.js +0 -2
  844. package/dist/components-csr/p-C1b-wwIb.js +0 -2
  845. package/dist/components-csr/p-C1b-wwIb.js.map +0 -1
  846. package/dist/components-csr/p-CGmQZ1oO.js +0 -2
  847. package/dist/components-csr/p-CGmQZ1oO.js.map +0 -1
  848. package/dist/components-csr/p-CKh3uxJF.js +0 -2
  849. package/dist/components-csr/p-CwgbF4Z5.js +0 -2
  850. package/dist/components-csr/p-CwgbF4Z5.js.map +0 -1
  851. package/dist/components-csr/p-D4njrR9m.js +0 -2
  852. package/dist/components-csr/p-D8TTB-lO.js +0 -2
  853. package/dist/components-csr/p-D8TTB-lO.js.map +0 -1
  854. package/dist/components-csr/p-DVtt3xax.js +0 -2
  855. package/dist/components-csr/p-DVtt3xax.js.map +0 -1
  856. package/dist/components-csr/p-PG3r1Ywi.js +0 -2
  857. package/dist/components-csr/p-dksxS2yM.js +0 -2
  858. package/dist/esm/pami-painter-BWqbBPaI.js.map +0 -1
  859. package/dist/esm/ripple-DT5RL9GH.js.map +0 -1
  860. package/dist/esm/rtl-CC7FhM00.js.map +0 -1
  861. package/dist/pami/p-041d2685.entry.js +0 -2
  862. package/dist/pami/p-041d2685.entry.js.map +0 -1
  863. package/dist/pami/p-0fcc82b3.entry.js +0 -2
  864. package/dist/pami/p-19669ac1.entry.js +0 -2
  865. package/dist/pami/p-1hwLIlBx.js +0 -2
  866. package/dist/pami/p-1hwLIlBx.js.map +0 -1
  867. package/dist/pami/p-2067b15d.entry.js +0 -2
  868. package/dist/pami/p-309b4e6d.entry.js +0 -2
  869. package/dist/pami/p-37d827d8.entry.js +0 -2
  870. package/dist/pami/p-3b5862ac.entry.js +0 -2
  871. package/dist/pami/p-4ba67b88.entry.js +0 -2
  872. package/dist/pami/p-542e81de.entry.js +0 -2
  873. package/dist/pami/p-5c02cc99.entry.js +0 -2
  874. package/dist/pami/p-5c02cc99.entry.js.map +0 -1
  875. package/dist/pami/p-60beacc5.entry.js +0 -2
  876. package/dist/pami/p-6753c7a1.entry.js +0 -2
  877. package/dist/pami/p-688017eb.entry.js +0 -2
  878. package/dist/pami/p-6a29a776.entry.js +0 -2
  879. package/dist/pami/p-6cd18c0d.entry.js +0 -2
  880. package/dist/pami/p-7415982c.entry.js +0 -2
  881. package/dist/pami/p-CC7FhM00.js +0 -2
  882. package/dist/pami/p-CC7FhM00.js.map +0 -1
  883. package/dist/pami/p-DT5RL9GH.js +0 -2
  884. package/dist/pami/p-DT5RL9GH.js.map +0 -1
  885. package/dist/pami/p-a304bc4f.entry.js +0 -2
  886. package/dist/pami/p-b2704345.entry.js +0 -2
  887. package/dist/pami/p-b6b7092b.entry.js +0 -2
  888. package/dist/pami/p-bac4f96e.entry.js +0 -2
  889. package/dist/pami/p-bac4f96e.entry.js.map +0 -1
  890. package/dist/pami/p-bd2fb99f.entry.js +0 -2
  891. package/dist/pami/p-c0fe2248.entry.js +0 -2
  892. package/dist/pami/p-c1409913.entry.js +0 -2
  893. package/dist/pami/p-cd922613.entry.js +0 -2
  894. package/dist/pami/p-cd922613.entry.js.map +0 -1
  895. package/dist/pami/p-cf4fa448.entry.js +0 -2
  896. package/dist/pami/p-cf4fa448.entry.js.map +0 -1
  897. package/dist/pami/p-d6600bc9.entry.js +0 -2
  898. package/dist/pami/p-d6600bc9.entry.js.map +0 -1
  899. package/dist/pami/p-d7504084.entry.js +0 -2
  900. package/dist/pami/p-dd4d87c2.entry.js +0 -2
  901. package/dist/pami/p-ec67197c.entry.js +0 -2
  902. package/dist/pami/p-ef41fef7.entry.js +0 -2
  903. package/dist/pami/p-f33d5f4a.entry.js +0 -2
  904. package/dist/pami/p-f3798dc6.entry.js +0 -2
  905. /package/dist/components/{p-DkVOc0wm.js.map → p-8v8oq2Gq.js.map} +0 -0
  906. /package/dist/components/{p-DneLEiFl.js.map → p-AeIwPqCK.js.map} +0 -0
  907. /package/dist/components/{p-C3VyQE8n.js.map → p-BHjV4ckR.js.map} +0 -0
  908. /package/dist/components/{p-Dh4RKEYp.js.map → p-Cf7x7Pbw.js.map} +0 -0
  909. /package/dist/components/{p-BKlel-AP.js.map → p-CsGff_Ta.js.map} +0 -0
  910. /package/dist/components/{p-CFpk8pnq.js.map → p-DKXYFRHy.js.map} +0 -0
  911. /package/dist/components/{p-Bf1Bx-JV.js.map → p-DuoeMUTq.js.map} +0 -0
  912. /package/dist/components/{p-g4sA3hAp.js.map → p-DzxH9m7D.js.map} +0 -0
  913. /package/dist/components-csr/{p-DneLEiFl.js.map → p-AeIwPqCK.js.map} +0 -0
  914. /package/dist/components-csr/{p-Dq_XLtjQ.js.map → p-BubrJNco.js.map} +0 -0
  915. /package/dist/components-csr/{p-Iozt_nIr.js.map → p-C1ChEady.js.map} +0 -0
  916. /package/dist/components-csr/{p-DYa7FJrs.js.map → p-CC0KCIVL.js.map} +0 -0
  917. /package/dist/components-csr/{p-wjnroiZn.js.map → p-CYTOzIlz.js.map} +0 -0
  918. /package/dist/components-csr/{p-BKlel-AP.js.map → p-CsGff_Ta.js.map} +0 -0
  919. /package/dist/components-csr/{p-CFpk8pnq.js.map → p-DKXYFRHy.js.map} +0 -0
  920. /package/dist/components-csr/{p-g4sA3hAp.js.map → p-DzxH9m7D.js.map} +0 -0
  921. /package/dist/pami/{p-bc63e548.entry.js.map → p-14668a82.entry.js.map} +0 -0
  922. /package/dist/pami/{p-cdd36757.entry.js.map → p-1468d5c4.entry.js.map} +0 -0
  923. /package/dist/pami/{p-a4a2f7e2.entry.js.map → p-230b51cc.entry.js.map} +0 -0
  924. /package/dist/pami/{p-f6d50fc7.entry.js.map → p-253bb306.entry.js.map} +0 -0
  925. /package/dist/pami/{p-c087aa2d.entry.js.map → p-27ba3c65.entry.js.map} +0 -0
  926. /package/dist/pami/{p-3577517b.entry.js.map → p-2c9fef75.entry.js.map} +0 -0
  927. /package/dist/pami/{p-2fa9e712.entry.js.map → p-3031787d.entry.js.map} +0 -0
  928. /package/dist/pami/{p-27208b60.entry.js.map → p-39a6add3.entry.js.map} +0 -0
  929. /package/dist/pami/{p-ed0554c3.entry.js.map → p-3fc31b91.entry.js.map} +0 -0
  930. /package/dist/pami/{p-91d25664.entry.js.map → p-513685d7.entry.js.map} +0 -0
  931. /package/dist/pami/{p-c1409913.entry.js.map → p-636faa29.entry.js.map} +0 -0
  932. /package/dist/pami/{p-b193dd1d.entry.js.map → p-71d62a04.entry.js.map} +0 -0
  933. /package/dist/pami/{p-3b859d3c.entry.js.map → p-72d9ed2c.entry.js.map} +0 -0
  934. /package/dist/pami/{p-5202ded3.entry.js.map → p-74673292.entry.js.map} +0 -0
  935. /package/dist/pami/{p-37d827d8.entry.js.map → p-76869b29.entry.js.map} +0 -0
  936. /package/dist/pami/{p-ef41fef7.entry.js.map → p-8381c008.entry.js.map} +0 -0
  937. /package/dist/pami/{p-7788c931.entry.js.map → p-86b07f8c.entry.js.map} +0 -0
  938. /package/dist/pami/{p-a516fb19.entry.js.map → p-a019a982.entry.js.map} +0 -0
  939. /package/dist/pami/{p-0435815b.entry.js.map → p-aa031eb5.entry.js.map} +0 -0
  940. /package/dist/pami/{p-42cda324.entry.js.map → p-be632c39.entry.js.map} +0 -0
  941. /package/dist/pami/{p-ea6e514b.entry.js.map → p-c02334c0.entry.js.map} +0 -0
  942. /package/dist/pami/{p-2391ef6b.entry.js.map → p-c717cd31.entry.js.map} +0 -0
  943. /package/dist/pami/{p-d3ad1da1.entry.js.map → p-cd63ef03.entry.js.map} +0 -0
  944. /package/dist/pami/{p-0f29f2bd.entry.js.map → p-cfc88755.entry.js.map} +0 -0
  945. /package/dist/pami/{p-14497ccf.entry.js.map → p-daf42aec.entry.js.map} +0 -0
  946. /package/dist/pami/{p-b8234190.entry.js.map → p-db1ee1b9.entry.js.map} +0 -0
  947. /package/dist/pami/{p-836652ad.entry.js.map → p-df18bacb.entry.js.map} +0 -0
  948. /package/dist/pami/{p-81c06d88.entry.js.map → p-eb41f4e0.entry.js.map} +0 -0
  949. /package/dist/pami/{p-4c023e51.entry.js.map → p-f29f90b0.entry.js.map} +0 -0
@@ -1,1599 +1,1597 @@
1
- /* ==========================================================
2
- pami-list-item — Material Design 3 List Item
3
- Spec: https://m3.material.io/components/lists/specs
4
-
5
- PUBLIC CSS CUSTOM PROPERTIES (override per-instance):
6
- --pami-list-item-container-color Container background (M3 default: surface = #FEF7FF light)
7
- --pami-list-item-container-shape Border-radius shorthand (all four corners)
8
- --pami-list-item-container-shape-start-start Top-start corner (used by pami-list grouped style)
9
- --pami-list-item-container-shape-start-end Top-end corner (used by pami-list grouped style)
10
- --pami-list-item-container-shape-end-start Bottom-start corner
11
- --pami-list-item-container-shape-end-end Bottom-end corner
12
- --pami-list-item-active-container-shape Meta-override applied to every active state
13
- (hover / focus / pressed / selected / dragged)
14
- --pami-list-item-hover-container-shape Border-radius on hover (default 0 — no morph; opt-in)
15
- --pami-list-item-focus-container-shape Border-radius on focus (default 16px / corner-large)
16
- --pami-list-item-pressed-container-shape Border-radius on press (default 16px / corner-large)
17
- --pami-list-item-selected-container-shape Border-radius on selected (default 16px / corner-large)
18
- --pami-list-item-active-container-shape Shared default for all four states above
19
- --pami-list-item-dragged-container-shape Border-radius on dragged (default 16px / corner-large)
20
- --pami-list-item-hover-state-layer-opacity State-layer opacity on hover (M3: 0.08)
21
- --pami-list-item-focus-state-layer-opacity State-layer opacity on focus (M3: 0.10)
22
- --pami-list-item-pressed-state-layer-opacity State-layer opacity on press (M3: 0.10)
23
- --pami-list-item-dragged-state-layer-opacity State-layer opacity when dragged (M3: 0.16)
24
- --pami-list-item-disabled-state-layer-opacity State-layer opacity when disabled (default 0)
25
- --pami-list-item-label-text-color Headline text color
26
- --pami-list-item-label-text-font Headline font family
27
- --pami-list-item-supporting-text-color Supporting text color
28
- --pami-list-item-supporting-text-font Supporting text font family
29
- --pami-list-item-overline-color Overline text color
30
- --pami-list-item-trailing-supporting-text-color Trailing supporting text color
31
- --pami-list-item-trailing-supporting-text-font Trailing supporting text font family
32
- --pami-list-item-leading-icon-color Leading icon color
33
- --pami-list-item-leading-icon-size Leading icon size, default (M3: 24px)
34
- --pami-list-item-leading-icon-expressive-size Leading icon size, Expressive list-style (M3: 20px).
35
- Auto-applied when the row sits inside an
36
- pami-list[list-style="standard"|"segmented"].
37
- --pami-list-item-trailing-icon-color Trailing icon color
38
- --pami-list-item-unselected-trailing-icon-color Trailing icon color when row is in selection
39
- mode but NOT selected (M3: on-surface)
40
- --pami-list-item-trailing-icon-size Trailing icon size, default (M3: 24px)
41
- --pami-list-item-trailing-icon-expressive-size Trailing icon size, Expressive list-style (M3: 20px)
42
- --pami-list-item-leading-space Inline-start padding (M3: 16px)
43
- --pami-list-item-trailing-space Inline-end padding (M3: 16px)
44
- --pami-list-item-top-space Block-start padding (M3: 8px)
45
- --pami-list-item-bottom-space Block-end padding (M3: 10px)
46
- --pami-list-item-between-space Gap between leading / content / trailing (M3: 12px)
47
- --pami-list-item-three-line-top-space Block-start padding when 3-line / 88px+ (M3: 12px)
48
- --pami-list-item-three-line-bottom-space Block-end padding when 3-line / 88px+ (M3: 12px)
49
- --pami-list-item-dragged-container-elevation Box-shadow applied when host carries
50
- .pami-list-item--dragged (M3: level 4 lift)
51
- --pami-list-item-leading-video-width Width of <video slot="leading"> thumbnail (M3: 100px)
52
- --pami-list-item-leading-video-height Height of <video slot="leading"> thumbnail (M3: 56px)
53
- --pami-list-item-leading-video-shape Border-radius of <video slot="leading"> (M3: corner-small)
54
- --pami-list-item-leading-video-top-space Block-start padding bumped when the row carries
55
- a <video slot="leading"> (M3: 12px). Bottom padding
56
- is unaffected — the asymmetry visually anchors the
57
- wider 100×56px video thumbnail.
58
- --pami-list-item-leading-avatar-color Avatar circle color (label avatar)
59
- --pami-list-item-leading-avatar-label-color Avatar label text color
60
- --pami-list-item-leading-avatar-size Avatar dimensions (default 40px)
61
- --pami-list-item-leading-avatar-shape Avatar border-radius (default full)
62
- --pami-list-item-leading-image-width Image thumbnail width (default 56px)
63
- --pami-list-item-leading-image-height Image thumbnail height (default 56px)
64
- --pami-list-item-leading-image-shape Image thumbnail radius, default (M3: 0)
65
- --pami-list-item-leading-image-expressive-shape Image thumbnail radius, Expressive list-style
66
- (M3: corner-small / 8px). Auto-applied on
67
- pami-list[list-style="standard"|"segmented"].
68
- --pami-list-item-leading-image-selection-scrim-color Full-thumbnail scrim when selected (M3: scrim @ 32%)
69
- --pami-list-item-leading-image-selection-circle-color Checkmark circle fill when selected (M3: on-surface @ 60%)
70
- --pami-list-item-leading-image-selection-icon-color Checkmark glyph color (M3: surface / white)
71
- --pami-list-item-leading-image-selection-icon-size Checkmark circle diameter (M3: 24px)
72
- --pami-list-item-selected-container-color Selected container background (M3: secondary-container)
73
- --pami-list-item-selected-label-text-color Selected headline color (M3: on-secondary-container)
74
- --pami-list-item-selected-active-icon-color Leading/trailing icon color when row is BOTH
75
- selected AND in an active state (hover / focus /
76
- pressed / dragged). M3: on-surface (#1D1B20).
77
- --pami-list-item-selected-disabled-container-color Container fill when row is BOTH selected AND
78
- disabled (M3: on-surface @ 12%)
79
- --pami-list-item-expand-chevron-color Caret icon color when collapsed (forwarded to the
80
- trailing pami-icon-button's icon color). Expanded pill
81
- uses `--md-sys-color-primary` /
82
- `--md-sys-color-on-primary`.
83
- --pami-list-item-expand-duration Expanded-panel open duration (M3: medium3 / 350ms)
84
- --pami-list-item-collapse-duration Expanded-panel close duration (M3: short4 / 200ms)
85
- --pami-list-item-expanded-panel-padding-block Expanded panel vertical padding
86
- --pami-list-item-expanded-panel-padding-inline Expanded panel horizontal padding (both sides)
87
- --pami-list-item-expanded-panel-padding-inline-start Expanded panel start padding —
88
- takes precedence over the symmetric value
89
- above. Default 0 — child rows align with the
90
- parent row in a flat connected expansion list.
91
- --pami-list-item-expanded-panel-background Expanded panel background
92
-
93
- CSS PARTS:
94
- row Row chassis (leading + content + trailing)
95
- state-layer State-layer overlay (interactive rows only)
96
- leading Leading slot container
97
- content Content slot container (overline + headline + supporting)
98
- headline Headline text element
99
- headline-tooltip-popup Popup of the headline overflow tooltip (forwarded)
100
- overline Overline text element
101
- supporting-text Supporting text element
102
- supporting-tooltip-popup Popup of the supporting-text overflow tooltip (forwarded)
103
- trailing Trailing slot container
104
- trailing-supporting-text Trailing supporting text element
105
- leading-icon Leading Lucide icon
106
- trailing-icon Trailing Lucide icon
107
- avatar Leading avatar (image or label)
108
- image Leading image thumbnail
109
- image-wrap Wrapper around prop-based leading image + selection overlay
110
- image-selection-indicator Selected-state scrim overlay on image thumbnail
111
- image-selection-circle Checkmark circle fill centered on thumbnail
112
- image-selection-check Lucide check glyph inside the circle
113
- expand-button Trailing caret pami-icon-button on expandable rows
114
- expand-button-state-layer State-layer of the caret button (forwarded)
115
- expand-button-icon Icon glyph wrapper of the caret button (forwarded;
116
- rotates 180° when expanded)
117
- drag-handle Trailing drag grip on reorderable rows
118
- expanded-panel Wrapper revealed when `expanded` is true
119
- expanded-panel-inner Inner wrapper that holds the slot
120
-
121
- SLOTS:
122
- (default) Headline content (fallback for `headline` prop)
123
- headline Rich headline (overrides `headline` prop)
124
- overline Rich overline (overrides `overline` prop)
125
- supporting-text Rich supporting text
126
- trailing-supporting-text Rich trailing supporting text
127
- leading Custom leading content (icon / avatar / image)
128
- trailing Custom trailing content (icon button, switch, etc.)
129
- expanded-content Content revealed when an expandable row is expanded
130
- ========================================================== */
131
-
132
- /* ==========================================================
133
- 1. HOST — token mapping + base block layout
134
- The host is the "container" — it owns the rounded chassis,
135
- background, divider position, and (when expandable) stacks
136
- a row above an expanded panel via display: block. The actual
137
- row chrome lives on .pami-list-item__row.
138
- ========================================================== */
139
- :host {
140
- /* PUBLIC → INTERNAL */
141
- /* Per the M3 Lists token spec the resting container color is `surface`
142
- (#FEF7FF on the light tonal palette). pami-list wrappers stay
143
- transparent so the items provide the visible fill. */
144
- --_container-color: var(--pami-list-item-container-color, var(--md-sys-color-surface, #fef7ff));
145
- --_container-shape: var(--pami-list-item-container-shape, 0px);
146
-
147
- /* Per-corner shapes — fall through to the shorthand by default but
148
- pami-list[list-style="grouped"] overrides start-start/start-end on
149
- the first row and end-start/end-end on the last to give a shared
150
- rounded chassis. Threading them as custom properties means the
151
- parent list can paint shape via `::slotted()` without crossing the
152
- shadow boundary directly. */
153
- --_container-shape-start-start: var(--pami-list-item-container-shape-start-start, var(--_container-shape));
154
- --_container-shape-start-end: var(--pami-list-item-container-shape-start-end, var(--_container-shape));
155
- --_container-shape-end-start: var(--pami-list-item-container-shape-end-start, var(--_container-shape));
156
- --_container-shape-end-end: var(--pami-list-item-container-shape-end-end, var(--_container-shape));
157
-
158
- /* Per-state container shape morph per the M3 Lists spec:
159
- Hover → no default morph (state layer only)
160
- Focus → 16px (corner-large)
161
- Pressed → 16px (corner-large)
162
- Selected → 16px (corner-large)
163
- Dragged → 16px (corner-large)
164
- `--pami-list-item-active-container-shape` acts as a meta-override —
165
- set it once to apply the same shape across focus / pressed / selected /
166
- dragged. Hover is excluded unless `--pami-list-item-hover-container-shape`
167
- is set explicitly. */
168
- /* Active-state corner radii — focus / pressed / selected / dragged default
169
- to corner-large (16px). Hover defaults to 0 so flat middle rows keep
170
- sharp corners during pointer-over; only the state layer signals hover. */
171
- /* Hover defaults to 0 so flat / middle rows keep their resting corners.
172
- Hover feedback is the state layer only — rounding on hover made
173
- hover-out snap from rounded → sharp even without a radius transition.
174
- Authors can still opt in via --pami-list-item-hover-container-shape or
175
- the shared --pami-list-item-active-container-shape meta-override. */
176
- --_hover-container-shape: var(--pami-list-item-hover-container-shape, var(--pami-list-item-active-container-shape, 0px));
177
- /* These three are the MORPHED corner radii for focus / press / selection.
178
- They are consumed as `max(<resting corner>, <this>)`, so multiplying by
179
- --md-sys-shape-morph-enabled collapses them to 0 when shape morphing is
180
- switched off — and max(rest, 0) is exactly the resting corner. That freezes
181
- all 50+ per-corner morph rules below from three declarations, with no
182
- change at all while the flag is its default 1.
183
-
184
- Global `data-shape-morph="off"` or per-component `shape-morph="off"`; see
185
- §13 in tokens.css. */
186
- --_focus-container-shape: calc(var(--pami-list-item-focus-container-shape, var(--pami-list-item-active-container-shape, var(--md-sys-shape-corner-large, 16px))) * var(--md-sys-shape-morph-enabled, 1));
187
- --_pressed-container-shape: calc(var(--pami-list-item-pressed-container-shape, var(--pami-list-item-active-container-shape, var(--md-sys-shape-corner-large, 16px))) * var(--md-sys-shape-morph-enabled, 1));
188
- --_selected-container-shape: calc(var(--pami-list-item-selected-container-shape, var(--pami-list-item-active-container-shape, var(--md-sys-shape-corner-large, 16px))) * var(--md-sys-shape-morph-enabled, 1));
189
- --_dragged-container-shape: var(--pami-list-item-dragged-container-shape, var(--pami-list-item-active-container-shape, var(--md-sys-shape-corner-large, 16px)));
190
-
191
- --_label-text-color: var(--pami-list-item-label-text-color, var(--md-sys-color-on-surface, #1c1b1f));
192
- --_label-text-font: var(--pami-list-item-label-text-font, var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif));
193
-
194
- --_supporting-text-color: var(--pami-list-item-supporting-text-color, var(--md-sys-color-on-surface-variant, #49454f));
195
- --_supporting-text-font: var(--pami-list-item-supporting-text-font, var(--md-sys-typescale-body-medium-font-family, Roboto, sans-serif));
196
-
197
- --_overline-color: var(--pami-list-item-overline-color, var(--md-sys-color-on-surface-variant, #49454f));
198
-
199
- --_trailing-supporting-text-color: var(--pami-list-item-trailing-supporting-text-color, var(--md-sys-color-on-surface-variant, #49454f));
200
- --_trailing-supporting-text-font: var(--pami-list-item-trailing-supporting-text-font, var(--md-sys-typescale-label-small-font-family, Roboto, sans-serif));
201
-
202
- --_leading-icon-color: var(--pami-list-item-leading-icon-color, var(--md-sys-color-on-surface-variant, #49454f));
203
- /* M3 token spec: list-item leading icon = 24px (default).
204
- The Expressive list-styles (`standard`, `segmented`) tighten this to
205
- 20px via the `--_leading-icon-expressive-size` override below. */
206
- --_leading-icon-size: var(--pami-list-item-leading-icon-size, max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px)));
207
- --_leading-icon-expressive-size: var(--pami-list-item-leading-icon-expressive-size, max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px)));
208
- --_trailing-icon-color: var(--pami-list-item-trailing-icon-color, var(--md-sys-color-on-surface-variant, #49454f));
209
- /* When the row is in selection mode but NOT selected, the M3 token spec
210
- calls for the trailing icon (typically a checkmark or radio glyph) to
211
- use on-surface instead of on-surface-variant — slightly higher contrast
212
- so the affordance reads as "tap to select" rather than ambient meta. */
213
- --_unselected-trailing-icon-color: var(--pami-list-item-unselected-trailing-icon-color, var(--md-sys-color-on-surface, #1d1b20));
214
- --_trailing-icon-size: var(--pami-list-item-trailing-icon-size, max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px)));
215
- --_trailing-icon-expressive-size: var(--pami-list-item-trailing-icon-expressive-size, max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px)));
216
-
217
- --_leading-avatar-color: var(--pami-list-item-leading-avatar-color, var(--md-sys-color-primary-container, #eaddff));
218
- --_leading-avatar-label-color: var(--pami-list-item-leading-avatar-label-color, var(--md-sys-color-on-primary-container, #21005d));
219
- --_leading-avatar-size: var(--pami-list-item-leading-avatar-size, 40px);
220
- --_leading-avatar-shape: var(--pami-list-item-leading-avatar-shape, var(--md-sys-shape-corner-full, 9999px));
221
-
222
- --_leading-image-width: var(--pami-list-item-leading-image-width, 56px);
223
- --_leading-image-height: var(--pami-list-item-leading-image-height, 56px);
224
- /* M3: default image is square (corner-none); Expressive image rounds
225
- to corner-small (8px). The expressive value is applied by the
226
- `:host-context(.pami-list--standard|.pami-list--segmented)` rule
227
- down in Section 3. */
228
- --_leading-image-shape: var(--pami-list-item-leading-image-shape, var(--md-sys-shape-corner-none, 0px));
229
- --_leading-image-expressive-shape: var(--pami-list-item-leading-image-expressive-shape, var(--md-sys-shape-corner-small, 8px));
230
- --_leading-image-selection-scrim-color: var(
231
- --pami-list-item-leading-image-selection-scrim-color,
232
- color-mix(in srgb, var(--md-sys-color-scrim, #000000) 32%, transparent)
233
- );
234
- --_leading-image-selection-circle-color: var(
235
- --pami-list-item-leading-image-selection-circle-color,
236
- color-mix(in srgb, var(--md-sys-color-on-surface, #1d1b20) 60%, transparent)
237
- );
238
- --_leading-image-selection-icon-color: var(
239
- --pami-list-item-leading-image-selection-icon-color,
240
- var(--md-sys-color-surface, #fef7ff)
241
- );
242
- --_leading-image-selection-icon-size: var(--pami-list-item-leading-image-selection-icon-size, 24px);
243
-
244
- /* Per the M3 spec the leading slot may also hold a <video> thumbnail.
245
- Default size is 100×56px (small video token). Authors slot a
246
- `<video slot="leading">` and these props size it automatically. */
247
- --_leading-video-width: var(--pami-list-item-leading-video-width, 100px);
248
- --_leading-video-height: var(--pami-list-item-leading-video-height, 56px);
249
- --_leading-video-shape: var(--pami-list-item-leading-video-shape, var(--md-sys-shape-corner-small, 8px));
250
-
251
- /* Per the M3 Lists token spec the selected palette uses
252
- secondary-container (#E8DEF8) and on-secondary-container (#4A4458),
253
- NOT primary-container. */
254
- --_selected-container-color: var(--pami-list-item-selected-container-color, var(--md-sys-color-secondary-container, #e8def8));
255
- --_selected-label-text-color: var(--pami-list-item-selected-label-text-color, var(--md-sys-color-on-secondary-container, #4a4458));
256
- /* Selected + interactive states: per the M3 spec, when a selected
257
- row is hovered / focused / pressed / dragged its leading + trailing
258
- icons jump from on-secondary-container (#4A4458) to on-surface
259
- (#1D1B20) for the duration of the interaction. */
260
- --_selected-active-icon-color: var(--pami-list-item-selected-active-icon-color, var(--md-sys-color-on-surface, #1d1b20));
261
- /* Selected + disabled: container fades to on-surface @ 12% per spec. */
262
- --_selected-disabled-container-color: var(
263
- --pami-list-item-selected-disabled-container-color,
264
- color-mix(in srgb, var(--md-sys-color-on-surface, #1d1b20) 12%, transparent)
265
- );
266
-
267
- --_state-layer-color: var(--md-sys-color-on-surface, #1c1b1f);
268
-
269
- /* Per-state state-layer opacities from the M3 Lists spec — these
270
- override the generic system tokens (which default to 0.12 for
271
- focus/press and don't define a dragged opacity). */
272
- --_hover-state-layer-opacity: var(--pami-list-item-hover-state-layer-opacity, var(--md-sys-state-hover-state-layer-opacity, 0.08));
273
- --_focus-state-layer-opacity: var(--pami-list-item-focus-state-layer-opacity, 0.1);
274
- --_pressed-state-layer-opacity: var(--pami-list-item-pressed-state-layer-opacity, 0.1);
275
- --_dragged-state-layer-opacity: var(--pami-list-item-dragged-state-layer-opacity, 0.16);
276
- --_disabled-state-layer-opacity: var(--pami-list-item-disabled-state-layer-opacity, 0);
277
-
278
- /* Row spacing tokens — defaults track the M3 Lists token spec
279
- (leading 16px, trailing 16px, top 8px, bottom 10px, between 12px).
280
- When the row sits inside a 88px+ chassis (lines=3) the top/bottom
281
- flips to 12px per the spec. When the leading slot hosts a <video>
282
- thumbnail, the top padding is bumped to 12px (see the `:has()`
283
- override below) so the 100×56px tile reads as anchored rather than
284
- hugged-tight against the chassis edge. */
285
- --_leading-space: var(--pami-list-item-leading-space, var(--md-sys-spacing-inset-lg, 16px));
286
- --_trailing-space: var(--pami-list-item-trailing-space, var(--md-sys-spacing-inset-lg, 16px));
287
- /* Vertical padding rides inset-sm (8px at density 0, so the M3 8px/10px
288
- defaults are unchanged) so multi-line rows keep tightening past the point
289
- where min-block-size alone floors on the text height. */
290
- /* Vertical padding tightens with global density down to 2px (8/10px at
291
- density 0), so multi-line rows reach a genuinely compact height at -3/-4. */
292
- --_top-space: var(--pami-list-item-top-space, max(2px, calc(8px + var(--md-sys-density-scale, 0) * 1.5px)));
293
- --_bottom-space: var(--pami-list-item-bottom-space, max(2px, calc(8px + var(--md-sys-density-scale, 0) * 1.5px)));
294
- --_between-space: var(--pami-list-item-between-space, max(8px, var(--md-sys-spacing-gap-md, 12px)));
295
- --_three-line-top-space: var(--pami-list-item-three-line-top-space, max(2px, calc(12px + var(--md-sys-density-scale, 0) * 2.5px)));
296
- --_three-line-bottom-space: var(--pami-list-item-three-line-bottom-space, max(2px, calc(12px + var(--md-sys-density-scale, 0) * 2.5px)));
297
-
298
- /* Global density lever: each rung of `data-density` (0…-4) trims the row
299
- height. density-scale is 0 by default, so the default heights below are
300
- unchanged. Single-line uses 4px/rung; multi-line uses 6px/rung so 2/3-line
301
- rows tighten toward their content instead of flooring ~16px above it.
302
- See packages/tokens/src/tokens.css §10-12. */
303
- --_density-delta: calc(var(--md-sys-density-scale, 0) * 4px);
304
- --_density-delta-multi: calc(var(--md-sys-density-scale, 0) * 6px);
305
-
306
- /* Per the M3 Lists spec a dragged tile lifts to level 4 elevation so
307
- it visually detaches from its neighbours. */
308
- --_dragged-container-elevation: var(--pami-list-item-dragged-container-elevation, inset 0 0 0 1px var(--pami-material-crumb-edge-side, var(--pami-component-glass-light-bottom, rgba(80, 69, 54, 0.16))));
309
-
310
- --_expand-chevron-color: var(--pami-list-item-expand-chevron-color, var(--md-sys-color-on-surface-variant, #49454f));
311
-
312
- /* MD3 expressive disclosure motion — the panel "arches" open with
313
- emphasized-decelerate (content settles into place on the way down) and
314
- "retracts" on close with emphasized-accelerate (content gets out of the
315
- way quickly). Asymmetric duration + easing is the M3 Expressive
316
- open/close vocabulary, mirroring pami-accordion-item. */
317
- --_expand-duration: var(--pami-list-item-expand-duration, var(--md-sys-motion-duration-medium3, 350ms));
318
- --_collapse-duration: var(--pami-list-item-collapse-duration, var(--md-sys-motion-duration-short4, 200ms));
319
- --_expand-easing: var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1));
320
- --_collapse-easing: var(--md-sys-motion-easing-emphasized-accelerate, cubic-bezier(0.3, 0, 0.8, 0.15));
321
-
322
- --_expanded-panel-padding-block: var(--pami-list-item-expanded-panel-padding-block, 0px);
323
- --_expanded-panel-padding-inline: var(--pami-list-item-expanded-panel-padding-inline, 0px);
324
- /* Flat expansion list — child rows sit at the same inline alignment as the
325
- parent row (no nested sub-box indent). Authors can opt into nesting via
326
- `--pami-list-item-expanded-panel-padding-inline-start`. */
327
- --_expanded-panel-padding-inline-start: var(
328
- --pami-list-item-expanded-panel-padding-inline-start,
329
- var(--pami-list-item-expanded-panel-padding-inline, 0px)
330
- );
331
- --_expanded-panel-background: var(--pami-list-item-expanded-panel-background, transparent);
332
-
333
- display: block;
334
- position: relative;
335
- background-color: var(--_container-color);
336
- color: var(--_label-text-color);
337
- /* The longhand corner radii are set so pami-list[list-style="grouped"]
338
- can override individual corners. The shorthand stays as a fallback
339
- for the standard / segmented paths. */
340
- border-start-start-radius: var(--_container-shape-start-start);
341
- border-start-end-radius: var(--_container-shape-start-end);
342
- border-end-start-radius: var(--_container-shape-end-start);
343
- border-end-end-radius: var(--_container-shape-end-end);
344
- box-sizing: border-box;
345
- -webkit-tap-highlight-color: transparent;
346
- outline: none;
347
- /* The chassis owns rounding so a non-zero border-radius clips both
348
- the row's state layer AND the expanded panel without bleeding past
349
- the corners. `clip` (not `hidden`) avoids creating a stacking
350
- context that would clip outward popups. */
351
- overflow: clip;
352
- /* Animate chassis shape + elevation only — not color/background. Transitions
353
- on color during continuous resize reflow read as text flicker even when
354
- the token value is unchanged. Selection / disabled tints snap via custom
355
- properties on child text nodes instead. */
356
- transition:
357
- box-shadow var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
358
- border-start-start-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
359
- border-start-end-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
360
- border-end-start-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
361
- border-end-end-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1));
362
- }
363
-
364
- /* ==========================================================
365
- 1b. ROW — flex chrome (leading | content | trailing)
366
- All spacing flows through public custom properties so apps can
367
- re-tune individual edges without rewriting padding shorthands. The
368
- defaults track the M3 Lists token spec:
369
- - Leading space 16px (--pami-list-item-leading-space)
370
- - Trailing space 16px (--pami-list-item-trailing-space)
371
- - Top space 10px (--pami-list-item-top-space)
372
- - Bottom space 10px (--pami-list-item-bottom-space)
373
- - Between space 12px (--pami-list-item-between-space) — gap
374
- - 3-line top/bottom 12px (--pami-list-item-three-line-{top,bottom}-space)
375
- - Minimum touch 48px → min-block-size 56px (≥48px)
376
- To revert to the older 24px trailing / 16px between (M3 baseline
377
- pre-Expressive), set:
378
- pami-list-item {
379
- --pami-list-item-trailing-space: 24px;
380
- --pami-list-item-between-space: 16px;
381
- }
382
- ========================================================== */
383
- .pami-list-item__row {
384
- display: flex;
385
- align-items: center;
386
- position: relative;
387
- min-block-size: calc(56px + var(--_density-delta));
388
- padding-block-start: var(--_top-space);
389
- padding-block-end: var(--_bottom-space);
390
- padding-inline-start: var(--_leading-space);
391
- padding-inline-end: var(--_trailing-space);
392
- gap: var(--_between-space);
393
- box-sizing: border-box;
394
- /* Keep ripple + state-layer inside the row when the host has 0px radius. */
395
- overflow: hidden;
396
- transition:
397
- border-start-start-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
398
- border-start-end-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
399
- border-end-start-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
400
- border-end-end-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1));
401
- }
402
-
403
- /* Interactive rows show pointer cursor */
404
- :host(.pami-list-item--interactive) .pami-list-item__row {
405
- cursor: pointer;
406
- user-select: none;
407
- }
408
-
409
- /* Non-interactive plain rows (default `type="text"`) */
410
- :host(.pami-list-item--type-text:not(.pami-list-item--selection-mode):not(.pami-list-item--expandable)) .pami-list-item__row {
411
- cursor: default;
412
- }
413
-
414
- /* ==========================================================
415
- 1c. PRIMARY ACTION (non-selection interactive rows)
416
- For `type="button"` / `type="link"` rows the interactive widget is an inner
417
- element (`role="button"` / `menuitem` span, or a real `<a href>`), NOT the
418
- host — so the host stays a structural role (`listitem`, or `none` in a menu)
419
- and any trailing controls remain its focusable SIBLINGS (never nested → no
420
- axe `nested-interactive`). It wraps only the leading + content clusters and
421
- takes the primary flex bay of the row; the ripple, state layer and focus ring
422
- stay row/host-level so their visuals are byte-for-byte unchanged. The leading↔
423
- content gap lives here; the content↔trailing gap stays on the row.
424
- ========================================================== */
425
- .pami-list-item__primary {
426
- display: flex;
427
- align-items: center;
428
- flex: 1 1 auto;
429
- min-inline-size: 0;
430
- gap: var(--_between-space);
431
- /* Neutralize the intrinsic chrome of <button> / <a> so layout + typography
432
- are identical to when leading/content sat directly in the row. */
433
- appearance: none;
434
- margin: 0;
435
- padding: 0;
436
- border: 0;
437
- background: transparent;
438
- color: inherit;
439
- font: inherit;
440
- text-align: inherit;
441
- text-decoration: none;
442
- cursor: inherit;
443
- outline: none;
444
- -webkit-tap-highlight-color: transparent;
445
- }
446
-
447
- /* 3-line rows top-align the leading cluster; mirror that inside the primary
448
- wrapper, which is now the flex parent of leading + content. */
449
- :host(.pami-list-item--3-line) .pami-list-item__primary {
450
- align-items: flex-start;
451
- /* Stretch to the row's full content box. Without this the primary is only as
452
- tall as its text (60px in a 64px box) and sits at the top, so anything
453
- centred INSIDE it — the avatar below — centres on the text rather than on
454
- the row, landing 2px high. The trailing cluster already stretches for the
455
- same reason. `align-items: flex-start` above is untouched, so the text
456
- itself stays top-aligned and the trailing timestamp keeps lining up with
457
- the overline. */
458
- align-self: stretch;
459
- }
460
-
461
- /* ==========================================================
462
- 2. LINE HEIGHT VARIANTS
463
- 1-line: 56px | 2-line: 72px | 3-line: 88px+
464
- At 88px+ the spec says elements top-align; we apply that
465
- to both leading and trailing so an avatar/icon sits at
466
- the top of a multi-line row like the M3 reference image.
467
- ========================================================== */
468
- /* 1 / 2-line rows: keep the host's --_top-space / --_bottom-space
469
- defaults (8px / 10px). Only the row height changes per the M3 spec. */
470
- :host(.pami-list-item--1-line) .pami-list-item__row {
471
- min-block-size: calc(56px + var(--_density-delta));
472
- }
473
-
474
- :host(.pami-list-item--2-line) .pami-list-item__row {
475
- min-block-size: calc(72px + var(--_density-delta-multi));
476
- }
477
-
478
- /* 3-line rows (88px+): the M3 spec bumps top / bottom padding to 12px
479
- and top-aligns the leading + trailing wrappers so the leading icon
480
- sits flush to the spec's 12px leading-icon-top-padding mark. */
481
- :host(.pami-list-item--3-line) .pami-list-item__row {
482
- min-block-size: calc(88px + var(--_density-delta-multi));
483
- padding-block-start: var(--_three-line-top-space);
484
- padding-block-end: var(--_three-line-bottom-space);
485
- align-items: flex-start;
486
- }
487
-
488
- /* When the leading slot hosts a <video> thumbnail (100×56px), the M3
489
- spec asks for a 12px top inset instead of the 8px default so the
490
- wider thumbnail reads as anchored to the row, not crammed against
491
- the chassis edge. We override --_top-space at the host level so the
492
- `.pami-list-item__row` rule above keeps the single source of truth.
493
- The 3-line override above still wins by source order for 3-line +
494
- video (both ask for 12px anyway).
495
-
496
- Detection is done via the `pami-list-item--with-video` host class set
497
- from TSX (see `detectSlottedFromLightDom` in pami-list-item.tsx). We
498
- can't use `:host(:has(> video[slot="leading"]))` here because
499
- Chromium doesn't let `:host()`'s relational pseudo-class arguments
500
- cross the shadow boundary into the host's light-DOM descendants. */
501
- :host(.pami-list-item--with-video) {
502
- --_top-space: var(--pami-list-item-leading-video-top-space, max(4px, calc(12px + var(--md-sys-density-scale, 0) * 2px)));
503
- --_bottom-space: max(4px, calc(12px + var(--md-sys-density-scale, 0) * 2px));
504
- }
505
-
506
- :host(.pami-list-item--3-line) .pami-list-item__leading {
507
- align-self: flex-start;
508
- /* Leading icon top padding = 12px on ≥88px rows per the M3 spec.
509
- The row already provides padding-block: 12px when 3-line, so the
510
- leading wrapper doesn't add anything on top — it just pins to
511
- flex-start so the row's padding is the only offset. */
512
- }
513
-
514
- /* …but an AVATAR centres instead. The flex-start above is the spec rule for a
515
- 24px leading ICON, which reads as aligned to the first text line. A 40px
516
- avatar is a much heavier object and pinning it to the top of an 88px row
517
- leaves it visibly high — measured 12px above the row's centre. Icons keep the
518
- spec behaviour; only avatars change.
519
-
520
- Keyed off the existing `--with-avatar` host class rather than `:has()`, which
521
- the host already sets for the `leading-avatar*` props. */
522
- :host(.pami-list-item--3-line.pami-list-item--with-avatar) .pami-list-item__leading {
523
- align-self: center;
524
- }
525
-
526
- /* Same, for an avatar the consumer SLOTS rather than passing as a prop — that
527
- one lives in the light tree, so it has to be tested on the host. Kept as its
528
- own rule on purpose: `:has()` inside `:host()` is not universally parsed, and
529
- in a shared selector list one unparsable selector invalidates the whole rule,
530
- which would silently take the prop-driven case above down with it. */
531
- :host(.pami-list-item--3-line:has(pami-avatar[slot='leading'])) .pami-list-item__leading {
532
- align-self: center;
533
- }
534
-
535
- /* 3-line rows: stack the trailing cluster vertically, full row height,
536
- pinned to the inline-end edge (fully right). The trailing supporting
537
- text (e.g. a timestamp) sits at the top while the trailing icon/action
538
- (e.g. a star) is vertically centred in the remaining space via auto
539
- block margins — so the star reads as middle-right of the row. */
540
- :host(.pami-list-item--3-line) .pami-list-item__trailing {
541
- align-self: stretch;
542
- flex-direction: column;
543
- align-items: flex-end;
544
- justify-content: flex-start;
545
- gap: 0;
546
- }
547
-
548
- :host(.pami-list-item--3-line) .pami-list-item__trailing-icon {
549
- margin-block: auto;
550
- }
551
-
552
- /* ==========================================================
553
- 3. EXPRESSIVE LIST-STYLES — inherited from
554
- pami-list[list-style="standard"] and pami-list[list-style="segmented"].
555
-
556
- Both Expressive variants tighten the leading + trailing icons from
557
- 24px (baseline token) to 20px (Expressive token) and round the
558
- leading image thumbnail from sharp corners to corner-small (8px).
559
- The `--pami-list-item-*-expressive-*` props are the user-overrideable
560
- inputs; the rule simply re-binds the internal slots so the rest of
561
- the CSS keeps referring to the canonical
562
- `--_leading-icon-size` / `--_trailing-icon-size` / `--_leading-image-shape`
563
- without per-style branching.
564
- ========================================================== */
565
- :host-context(.pami-list--standard),
566
- :host-context(.pami-list--segmented) {
567
- --_leading-icon-size: var(--pami-list-item-leading-icon-size, var(--_leading-icon-expressive-size));
568
- --_trailing-icon-size: var(--pami-list-item-trailing-icon-size, var(--_trailing-icon-expressive-size));
569
- --_leading-image-shape: var(--pami-list-item-leading-image-shape, var(--_leading-image-expressive-shape));
570
- }
571
-
572
- /* Standard connected list — first / last row corner rounding at rest.
573
- pami-list also threads per-corner custom properties via ::slotted(); we
574
- mirror the same radii here with :host(:first-of-type|:last-of-type)
575
- so resting corners paint reliably from inside the shadow boundary.
576
- Uses .pami-list--standard (always on the host class map) rather than
577
- the list-style attribute, which is not reflected. Middle rows keep
578
- 0px on internal edges via the --_container-shape default. */
579
- :host-context(.pami-list--standard):host(:first-of-type) {
580
- --pami-list-item-container-shape-start-start: var(--md-sys-shape-corner-large, 16px);
581
- --pami-list-item-container-shape-start-end: var(--md-sys-shape-corner-large, 16px);
582
- }
583
-
584
- :host-context(.pami-list--standard):host(:last-of-type) {
585
- --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
586
- --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
587
- }
588
-
589
- :host-context(.pami-list--standard):host(:only-of-type) {
590
- --pami-list-item-container-shape-start-start: var(--md-sys-shape-corner-large, 16px);
591
- --pami-list-item-container-shape-start-end: var(--md-sys-shape-corner-large, 16px);
592
- --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
593
- --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
594
- }
595
-
596
- /* Expandable rows that are open hand their bottom corners to the last child
597
- row in the panel so the connected chassis continues as one flat stack. */
598
- :host(.pami-list-item--expandable.pami-list-item--expanded) {
599
- --pami-list-item-container-shape-end-start: 0px;
600
- --pami-list-item-container-shape-end-end: 0px;
601
- }
602
-
603
- /* Segmented adds the rounded-tile container shape on top of the
604
- shared Expressive icon/image overrides above. The container colour
605
- already falls through to the `:host` default (surface = the M3
606
- `list-item-segmented-container-color` token), so re-declaring it
607
- here would lift the cascade specificity of `:host-context()` above
608
- `:host(.pami-list-item--selected)` and stop the selected-state tint
609
- from painting. Authors can still re-tint the bay via
610
- `--pami-list-item-container-color` on the row or list. */
611
- :host-context(.pami-list--segmented) {
612
- --_container-shape: var(--pami-list-item-container-shape, var(--md-sys-shape-corner-extra-small, 4px));
613
- }
614
-
615
- /* Segmented connected stack — first / last row corner emphasis at rest.
616
- Tiles keep corner-extra-small (4px) on internal edges; the first row
617
- lifts its top corners and the last row lifts its bottom corners to
618
- corner-large (16px) so the separated stack reads as one grouped chassis
619
- (mirrors standard list first/last treatment). Middle rows stay 4px
620
- on all four corners. */
621
- :host-context(.pami-list--segmented):host(:first-of-type) {
622
- --pami-list-item-container-shape-start-start: var(--md-sys-shape-corner-large, 16px);
623
- --pami-list-item-container-shape-start-end: var(--md-sys-shape-corner-large, 16px);
624
- }
625
-
626
- :host-context(.pami-list--segmented):host(:last-of-type) {
627
- --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
628
- --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
629
- }
630
-
631
- :host-context(.pami-list--segmented):host(:only-of-type) {
632
- --pami-list-item-container-shape-start-start: var(--md-sys-shape-corner-large, 16px);
633
- --pami-list-item-container-shape-start-end: var(--md-sys-shape-corner-large, 16px);
634
- --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
635
- --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
636
- }
637
-
638
- /* ==========================================================
639
- 4. STATE LAYER (interactive rows only)
640
- ========================================================== */
641
- .pami-list-item__state-layer {
642
- position: absolute;
643
- inset: 0;
644
- /* Match the row's (possibly morphed) corner radius so the overlay clips to
645
- the rounded chassis even if a consumer lifts the row out of flow during a
646
- drag and an ancestor's overflow no longer does the clipping for us. */
647
- border-radius: inherit;
648
- background: var(--md-sys-pari-glow);
649
- opacity: 0;
650
- transition: opacity var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
651
- pointer-events: none;
652
- }
653
-
654
- :host(.pami-list-item--interactive) .pami-list-item__row:hover .pami-list-item__state-layer {
655
- opacity: var(--_hover-state-layer-opacity);
656
- }
657
-
658
- :host(.pami-list-item--interactive:focus-visible) .pami-list-item__state-layer,
659
- :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)) .pami-list-item__state-layer {
660
- opacity: var(--_focus-state-layer-opacity);
661
- }
662
-
663
- /* Inner-primary keyboard focus. The row uses no delegatesFocus (that broke
664
- focusable option-row hosts), so keyboard focus lands on the inner primary and
665
- the host does NOT match :focus-visible — :has() drives the chassis focus
666
- feedback for button / link / menuitem rows instead. */
667
- :host(.pami-list-item--interactive:has(.pami-list-item__primary:focus-visible)) .pami-list-item__state-layer {
668
- opacity: var(--_focus-state-layer-opacity);
669
- }
670
-
671
- :host(.pami-list-item--interactive) .pami-list-item__row:active .pami-list-item__state-layer,
672
- :host(.pami-list-item--pressed) .pami-list-item__state-layer {
673
- opacity: var(--_pressed-state-layer-opacity);
674
- }
675
-
676
- /* Dragged is an app-driven state — toggle `.pami-list-item--dragged` on the
677
- host (e.g. from a reorderable drag wrapper) to get the spec's 16% state
678
- layer, corner-large morph, and a level-4 elevation lift so the tile
679
- visually detaches from its neighbours. z-index keeps the shadow above
680
- sibling rows that haven't scrolled past. */
681
- :host(.pami-list-item--dragged) .pami-list-item__state-layer {
682
- opacity: var(--_dragged-state-layer-opacity);
683
- }
684
-
685
- /* While dragged, the M3 affordance is the steady 16 % state layer (above) plus
686
- the elevation lift — NOT an active press ripple. Suppress the ripple wave so
687
- it can't sit as an oversized circle near the press point (e.g. the trailing
688
- drag handle the user grabbed) for the whole drag, which previously read as a
689
- large blob overlapping the handle. */
690
- :host(.pami-list-item--dragged) pami-ripple {
691
- display: none;
692
- }
693
-
694
- :host(.pami-list-item--dragged) {
695
- box-shadow: var(--_dragged-container-elevation);
696
- z-index: 1;
697
- }
698
-
699
- /* ==========================================================
700
- 5. FOCUS RING
701
- Inset box-shadow on :host — paints inside the border-box so
702
- parent overflow (pami-list overflow:clip, story wrappers with
703
- overflow:hidden, stacked connected rows) cannot clip the ring.
704
- Outward host outlines + outline-offset extended past the chassis
705
- and lost pixels at the top edge of first rows. Row-level inset
706
- rings were still clipped by :host { overflow: clip } and
707
- .pami-list-item__row { overflow: hidden }. z-index keeps dragged
708
- elevation shadows above neighbours when both apply.
709
- ========================================================== */
710
- :host(.pami-list-item--interactive:focus-visible),
711
- :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)) {
712
- box-shadow: inset 0 0 0 var(--md-sys-state-focus-ring-width, 2px) var(--md-sys-color-focus-ring, var(--md-sys-color-secondary));
713
- outline: none;
714
- z-index: 1;
715
- }
716
-
717
- /* Chassis focus ring when the inner primary holds keyboard focus (the host
718
- itself isn't focused for button / link / menuitem rows — see the state-layer
719
- note above). Kept on the host so the ring hugs the chassis edge, not the
720
- padding-inset primary. */
721
- :host(.pami-list-item--interactive:has(.pami-list-item__primary:focus-visible)) {
722
- box-shadow: inset 0 0 0 var(--md-sys-state-focus-ring-width, 2px) var(--md-sys-color-focus-ring, var(--md-sys-color-secondary));
723
- outline: none;
724
- z-index: 1;
725
- }
726
-
727
- :host(.pami-list-item--dragged:focus-visible) {
728
- box-shadow:
729
- var(--_dragged-container-elevation),
730
- inset 0 0 0 3px var(--md-sys-color-focus-ring, #513018);
731
- }
732
-
733
- /* ==========================================================
734
- 5b. ACTIVE-STATE SHAPE MORPH (M3 Lists spec)
735
- Per https://m3.material.io/components/lists/specs, the list-item
736
- morphs from its resting shape into a state-specific corner radius:
737
-
738
- Hover → no default morph (state layer only)
739
- Focus → 16px (corner-large)
740
- Pressed → 16px (corner-large)
741
- Selected → 16px (corner-large)
742
- Dragged → 16px (corner-large)
743
-
744
- Applied on focus / selected / pressed / dragged — NOT hover. Hover
745
- uses the state layer only; morphing corners on hover made flat middle
746
- rows round to 16px then snap back to sharp on mouse-out. Even with
747
- border-radius transitions removed, the fading state layer made that
748
- snap read as an animated corner morph.
749
-
750
- Coverage:
751
- - focus / selected / pressed / dragged on standard rows
752
- - standard first / last edge corners — focus would otherwise SHRINK
753
- below resting 16px; clamped via max()
754
- - segmented tiles (resting 4px) — focus morphs up to corner-large;
755
- clamped via max()
756
- - grouped first / middle / last rows — morph that lifts out of the
757
- shared chassis
758
-
759
- Each corner is computed as `max(resting, active)` so an interaction
760
- can only ever round a corner further — never sharpen one.
761
-
762
- Border-radius animates on shape-morph states only (focus / selected /
763
- pressed / dragged) via the logical-corner transitions on :host and
764
- .pami-list-item__row. Hover does not change border-radius, so pointer-
765
- over stays state-layer-only with no corner morph on hover-out. The
766
- focus ring (Section 5 inset box-shadow) follows the morphed host
767
- border-radius on :host.
768
-
769
- Asymmetric M3 Expressive timing (mirrors pami-button / pami-icon-button):
770
- Enter / settle : medium4 (400ms) + emphasized-decelerate — base :host
771
- Exit / release : short4 (200ms) + standard — active states
772
-
773
- Rule order matters: when multiple states are simultaneously true
774
- (e.g. selected + focused, pressed + selected), the LATER rule in
775
- source order wins on equal specificity. Priority climbs
776
- focus → selected → pressed/dragged.
777
-
778
- Authors can override per-state (--pami-list-item-{state}-container-shape)
779
- or globally (--pami-list-item-active-container-shape). To restore hover
780
- rounding, set --pami-list-item-hover-container-shape and add a :hover
781
- rule in app CSS.
782
- ========================================================== */
783
- /* Shape morph exit timing — applied on active states so release snaps
784
- back with short4 + standard while press-in uses the base medium4 +
785
- emphasized-decelerate curve (CSS uses the pre-change transition). */
786
- :host(.pami-list-item--interactive:focus-visible),
787
- :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)),
788
- :host(.pami-list-item--selected),
789
- :host(.pami-list-item--interactive:active),
790
- :host(.pami-list-item--pressed),
791
- :host(.pami-list-item--dragged) {
792
- transition:
793
- box-shadow var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
794
- border-start-start-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
795
- border-start-end-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
796
- border-end-start-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
797
- border-end-end-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
798
- }
799
-
800
- :host(.pami-list-item--interactive:focus-visible) .pami-list-item__row,
801
- :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)) .pami-list-item__row,
802
- :host(.pami-list-item--selected) .pami-list-item__row,
803
- :host(.pami-list-item--interactive:active) .pami-list-item__row,
804
- :host(.pami-list-item--pressed) .pami-list-item__row,
805
- :host(.pami-list-item--dragged) .pami-list-item__row {
806
- transition:
807
- border-start-start-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
808
- border-start-end-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
809
- border-end-start-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
810
- border-end-end-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
811
- }
812
-
813
- :host(.pami-list-item--interactive:focus-visible),
814
- :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)),
815
- :host(.pami-list-item--interactive:focus-visible) .pami-list-item__row,
816
- :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)) .pami-list-item__row {
817
- border-start-start-radius: max(var(--_container-shape-start-start), var(--_focus-container-shape));
818
- border-start-end-radius: max(var(--_container-shape-start-end), var(--_focus-container-shape));
819
- border-end-start-radius: max(var(--_container-shape-end-start), var(--_focus-container-shape));
820
- border-end-end-radius: max(var(--_container-shape-end-end), var(--_focus-container-shape));
821
- }
822
-
823
- :host(.pami-list-item--selected),
824
- :host(.pami-list-item--selected) .pami-list-item__row {
825
- border-start-start-radius: max(var(--_container-shape-start-start), var(--_selected-container-shape));
826
- border-start-end-radius: max(var(--_container-shape-start-end), var(--_selected-container-shape));
827
- border-end-start-radius: max(var(--_container-shape-end-start), var(--_selected-container-shape));
828
- border-end-end-radius: max(var(--_container-shape-end-end), var(--_selected-container-shape));
829
- }
830
-
831
- :host(.pami-list-item--interactive:active),
832
- :host(.pami-list-item--pressed),
833
- :host(.pami-list-item--dragged),
834
- :host(.pami-list-item--interactive:active) .pami-list-item__row,
835
- :host(.pami-list-item--pressed) .pami-list-item__row,
836
- :host(.pami-list-item--dragged) .pami-list-item__row {
837
- border-start-start-radius: max(var(--_container-shape-start-start), var(--_pressed-container-shape));
838
- border-start-end-radius: max(var(--_container-shape-start-end), var(--_pressed-container-shape));
839
- border-end-start-radius: max(var(--_container-shape-end-start), var(--_pressed-container-shape));
840
- border-end-end-radius: max(var(--_container-shape-end-end), var(--_pressed-container-shape));
841
- }
842
-
843
- /* Dragged supersedes its own pressed default but inherits visually. */
844
- :host(.pami-list-item--dragged),
845
- :host(.pami-list-item--dragged) .pami-list-item__row {
846
- border-start-start-radius: max(var(--_container-shape-start-start), var(--_dragged-container-shape));
847
- border-start-end-radius: max(var(--_container-shape-start-end), var(--_dragged-container-shape));
848
- border-end-start-radius: max(var(--_container-shape-end-start), var(--_dragged-container-shape));
849
- border-end-end-radius: max(var(--_container-shape-end-end), var(--_dragged-container-shape));
850
- }
851
-
852
- /* ==========================================================
853
- 6. SELECTED STATE
854
- When a row is selected we tint the container and remap the
855
- text/icon colors onto the selection palette (secondary-container /
856
- on-secondary-container per the M3 Lists token spec).
857
- ========================================================== */
858
- :host(.pami-list-item--selected) {
859
- --_container-color: var(--_selected-container-color);
860
- --_label-text-color: var(--_selected-label-text-color);
861
- --_supporting-text-color: var(--_selected-label-text-color);
862
- --_overline-color: var(--_selected-label-text-color);
863
- --_leading-icon-color: var(--_selected-label-text-color);
864
- --_trailing-icon-color: var(--_selected-label-text-color);
865
- --_trailing-supporting-text-color: var(--_selected-label-text-color);
866
- --_state-layer-color: var(--_selected-label-text-color);
867
- --_expand-chevron-color: var(--_selected-label-text-color);
868
- }
869
-
870
- /* ==========================================================
871
- 6b. SELECTION-MODE UNSELECTED TRAILING ICON
872
- Per the M3 token spec a row in a `selection-mode` list that is NOT
873
- selected swaps its trailing icon to on-surface (#1D1B20) so the
874
- tap-to-select affordance (checkbox/radio glyph) reads at full
875
- contrast. The leading icon stays on-surface-variant.
876
- ========================================================== */
877
- :host(.pami-list-item--selection-mode:not(.pami-list-item--selected)) {
878
- --_trailing-icon-color: var(--_unselected-trailing-icon-color);
879
- }
880
-
881
- /* ==========================================================
882
- 6c. SELECTED + ACTIVE-STATE ICON SHIFT
883
- Per the M3 Lists spec, a selected row in an active interaction
884
- (hover / focus / pressed / dragged) shifts its leading + trailing
885
- icons from on-secondary-container (#4A4458) up to on-surface
886
- (#1D1B20) for the duration of the interaction so the affordance
887
- reads slightly louder under the cursor. The selected resting label
888
- colour stays on-secondary-container.
889
- ========================================================== */
890
- :host(.pami-list-item--selected.pami-list-item--interactive:hover),
891
- :host(.pami-list-item--selected.pami-list-item--interactive:focus-visible),
892
- :host(.pami-list-item--selected.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)),
893
- :host(.pami-list-item--selected.pami-list-item--interactive:active),
894
- :host(.pami-list-item--selected.pami-list-item--pressed),
895
- :host(.pami-list-item--selected.pami-list-item--dragged) {
896
- --_leading-icon-color: var(--_selected-active-icon-color);
897
- --_trailing-icon-color: var(--_selected-active-icon-color);
898
- }
899
-
900
- /* 6d. EXPANDABLE DISCLOSURE TRIGGERS — never list-selection targets.
901
- Only flat child rows in `expanded-content` may carry selection tint.
902
- Wins over §6 / §6c when a stale handler sets `selected` on the parent. */
903
- :host(.pami-list-item--expandable),
904
- :host(.pami-list-item--expandable[selected]),
905
- :host(.pami-list-item--expandable.pami-list-item--selected),
906
- :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--interactive:hover),
907
- :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--interactive:focus-visible),
908
- :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--interactive:active),
909
- :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--pressed),
910
- :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--dragged) {
911
- --_container-color: var(--pami-list-item-container-color, var(--md-sys-color-surface, #fef7ff));
912
- --_label-text-color: var(--pami-list-item-label-text-color, var(--md-sys-color-on-surface, #1c1b1f));
913
- --_supporting-text-color: var(--pami-list-item-supporting-text-color, var(--md-sys-color-on-surface-variant, #49454f));
914
- --_overline-color: var(--pami-list-item-overline-color, var(--md-sys-color-on-surface-variant, #49454f));
915
- --_leading-icon-color: var(--pami-list-item-leading-icon-color, var(--md-sys-color-on-surface-variant, #49454f));
916
- --_trailing-icon-color: var(--pami-list-item-trailing-icon-color, var(--md-sys-color-on-surface-variant, #49454f));
917
- --_trailing-supporting-text-color: var(
918
- --pami-list-item-trailing-supporting-text-color,
919
- var(--md-sys-color-on-surface-variant, #49454f)
920
- );
921
- --_state-layer-color: var(--md-sys-color-on-surface, #1c1b1f);
922
- --_expand-chevron-color: var(--pami-list-item-expand-chevron-color, var(--md-sys-color-on-surface-variant, #49454f));
923
- }
924
-
925
- :host(.pami-list-item--expandable.pami-list-item--selected),
926
- :host(.pami-list-item--expandable.pami-list-item--selected) .pami-list-item__row {
927
- border-start-start-radius: var(--_container-shape-start-start);
928
- border-start-end-radius: var(--_container-shape-start-end);
929
- border-end-start-radius: var(--_container-shape-end-start);
930
- border-end-end-radius: var(--_container-shape-end-end);
931
- }
932
-
933
- /* ==========================================================
934
- 7. DISABLED STATE
935
- ========================================================== */
936
- :host(.pami-list-item--disabled) {
937
- cursor: default;
938
- pointer-events: none;
939
- --_label-text-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
940
- --_supporting-text-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
941
- --_overline-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
942
- --_leading-icon-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
943
- --_trailing-icon-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
944
- --_trailing-supporting-text-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
945
- --_expand-chevron-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
946
- }
947
-
948
- :host(.pami-list-item--disabled) .pami-list-item__state-layer {
949
- opacity: var(--_disabled-state-layer-opacity);
950
- }
951
-
952
- /* When a row is BOTH selected AND disabled, the M3 spec collapses the
953
- secondary-container fill to a faint on-surface @ 12% wash and lets the
954
- disabled content opacity (0.38) carry the "frozen" cue. Authors can
955
- override via --pami-list-item-selected-disabled-container-color. */
956
- :host(.pami-list-item--selected.pami-list-item--disabled) {
957
- --_container-color: var(--_selected-disabled-container-color);
958
- }
959
-
960
- /* Soft-disabled: same disabled visuals but remains focusable.
961
- Overrides the hard-disabled pointer-events:none so keyboard users
962
- can still discover the row and hear aria-disabled="true". */
963
- :host([soft-disabled]) {
964
- pointer-events: auto;
965
- }
966
-
967
- :host([soft-disabled]) .pami-list-item__row {
968
- cursor: default;
969
- }
970
-
971
- :host([soft-disabled]) .pami-list-item__state-layer {
972
- display: none;
973
- }
974
-
975
- /* ==========================================================
976
- 8. LEADING SLOT — icon (18px), avatar (40px), image (56px)
977
- ========================================================== */
978
- .pami-list-item__leading {
979
- display: flex;
980
- align-items: center;
981
- justify-content: center;
982
- flex-shrink: 0;
983
- min-inline-size: 24px;
984
- color: var(--_leading-icon-color);
985
- }
986
-
987
- /* Hide empty wrappers for slots that ARE always rendered (so the
988
- * slot elements stay queryable + slotchange listeners always wire).
989
- * `.pami-list-item__trailing` is intentionally NOT in this list — the
990
- * trailing wrapper is omitted from the DOM entirely when empty (see
991
- * `renderTrailing` + `detectSlottedFromLightDom` in pami-list-item.tsx). */
992
- .pami-list-item__leading--empty,
993
- .pami-list-item__overline--empty,
994
- .pami-list-item__supporting-text--empty,
995
- .pami-list-item__trailing-text--empty {
996
- display: none;
997
- }
998
-
999
- /* Lucide leading icon — per the M3 expansion list spec the parent
1000
- row's leading icon fills (FILL axis → 1) while expanded. Child rows in
1001
- `expanded-content` are separate hosts and keep their own resting icon. */
1002
- .pami-list-item__icon {
1003
- font-size: var(--_leading-icon-size);
1004
- inline-size: var(--_leading-icon-size);
1005
- block-size: var(--_leading-icon-size);
1006
- line-height: 1;
1007
- color: var(--_leading-icon-color);
1008
- transition: font-variation-settings var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
1009
- }
1010
-
1011
- :host(.pami-list-item--expanded) .pami-list-item__icon {
1012
- }
1013
-
1014
- /* The leading avatar is now an internal `pami-avatar` component. We forward
1015
- the list-item's avatar tokens (`--_leading-avatar-*`) to the avatar's
1016
- public API via CSS custom-property inheritance so authors can keep
1017
- theming the avatar through the list-item without knowing the avatar
1018
- component exists. */
1019
- pami-avatar.pami-list-item__avatar {
1020
- --pami-avatar-size: var(--_leading-avatar-size);
1021
- --pami-avatar-container-shape: var(--_leading-avatar-shape);
1022
- /* When the list-item caller did NOT explicitly request name-derived
1023
- palette colors, fall back to the legacy primary-container tone so
1024
- existing pages keep their visuals. */
1025
- --pami-avatar-container-color: var(--_leading-avatar-color);
1026
- --pami-avatar-label-color: var(--_leading-avatar-label-color);
1027
- }
1028
-
1029
- /* Image thumbnail — prop-based `leading-image` wraps the <img> so a
1030
- selected-state scrim + checkmark circle can overlay the tile per M3. */
1031
- .pami-list-item__image-wrap {
1032
- position: relative;
1033
- display: inline-flex;
1034
- flex-shrink: 0;
1035
- inline-size: var(--_leading-image-width);
1036
- block-size: var(--_leading-image-height);
1037
- border-radius: var(--_leading-image-shape);
1038
- overflow: hidden;
1039
- }
1040
-
1041
- .pami-list-item__image {
1042
- inline-size: 100%;
1043
- block-size: 100%;
1044
- object-fit: cover;
1045
- }
1046
-
1047
- /* Selected thumbnail overlay — scrim fades in; circle scales in with M3
1048
- emphasized-decelerate (mirrors pami-step check-in). Always `display:flex`
1049
- so opacity/scale can animate; visibility is driven by opacity, not
1050
- display:none toggling. */
1051
- .pami-list-item__image-selection-indicator {
1052
- position: absolute;
1053
- inset: 0;
1054
- display: flex;
1055
- align-items: center;
1056
- justify-content: center;
1057
- background-color: var(--_leading-image-selection-scrim-color);
1058
- pointer-events: none;
1059
- opacity: 0;
1060
- transition: opacity var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
1061
- }
1062
-
1063
- :host(.pami-list-item--selected) .pami-list-item__image-selection-indicator {
1064
- opacity: 1;
1065
- }
1066
-
1067
- .pami-list-item__image-selection-circle {
1068
- display: inline-flex;
1069
- align-items: center;
1070
- justify-content: center;
1071
- flex-shrink: 0;
1072
- inline-size: var(--_leading-image-selection-icon-size);
1073
- block-size: var(--_leading-image-selection-icon-size);
1074
- border-radius: var(--md-sys-shape-corner-full, 9999px);
1075
- background-color: var(--_leading-image-selection-circle-color);
1076
- transform: scale(0);
1077
- opacity: 0;
1078
- }
1079
-
1080
- :host(.pami-list-item--selected) .pami-list-item__image-selection-circle {
1081
- animation: pami-list-item-image-selection-in var(--md-sys-motion-duration-medium2, 250ms)
1082
- var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)) both;
1083
- }
1084
-
1085
- @keyframes pami-list-item-image-selection-in {
1086
- 0% {
1087
- transform: scale(0);
1088
- opacity: 0;
1089
- }
1090
-
1091
- 60% {
1092
- transform: scale(1.08);
1093
- opacity: 1;
1094
- }
1095
-
1096
- 100% {
1097
- transform: scale(1);
1098
- opacity: 1;
1099
- }
1100
- }
1101
-
1102
- /* Outscore the generic `pami-icon { display: inline-block }`
1103
- rule in Section 11 so the glyph centers inside the 24px circle. */
1104
- .pami-list-item__image-selection-checkpami-icon {
1105
- display: inline-flex;
1106
- align-items: center;
1107
- justify-content: center;
1108
- inline-size: calc(var(--_leading-image-selection-icon-size) * 0.667);
1109
- block-size: calc(var(--_leading-image-selection-icon-size) * 0.667);
1110
- font-size: calc(var(--_leading-image-selection-icon-size) * 0.667);
1111
- line-height: 1;
1112
- color: var(--_leading-image-selection-icon-color);
1113
- font-weight: normal;
1114
- }
1115
-
1116
- /* Slotted leading content inherits color */
1117
- ::slotted([slot="leading"]) {
1118
- display: inline-flex;
1119
- align-items: center;
1120
- justify-content: center;
1121
- color: var(--_leading-icon-color);
1122
- fill: currentColor;
1123
- }
1124
-
1125
- /* Direct <video slot="leading"> thumbnail — sized per the M3 leading
1126
- video tokens (100×56 dp default). For a custom-sized video, override
1127
- --pami-list-item-leading-video-{width,height,shape} on the host or
1128
- set width/height inline on the video element. */
1129
- ::slotted(video[slot="leading"]) {
1130
- inline-size: var(--_leading-video-width);
1131
- block-size: var(--_leading-video-height);
1132
- border-radius: var(--_leading-video-shape);
1133
- object-fit: cover;
1134
- }
1135
-
1136
- /* ==========================================================
1137
- 9. CONTENT (CENTER) — overline, headline, supporting
1138
- ========================================================== */
1139
- .pami-list-item__content {
1140
- flex: 1;
1141
- display: flex;
1142
- flex-direction: column;
1143
- min-inline-size: 0;
1144
- overflow: hidden;
1145
- gap: 0;
1146
- }
1147
-
1148
- /* Overline */
1149
- .pami-list-item__overline {
1150
- font-family: var(--md-sys-typescale-label-small-font-family, Roboto, sans-serif);
1151
- font-size: var(--md-sys-typescale-label-small-font-size, 11px);
1152
- font-weight: var(--md-sys-typescale-label-small-font-weight, 500);
1153
- line-height: var(--md-sys-typescale-label-small-line-height, 16px);
1154
- letter-spacing: var(--md-sys-typescale-label-small-letter-spacing, 0.5px);
1155
- color: var(--_overline-color);
1156
- contain: inline-size;
1157
- min-inline-size: 0;
1158
- text-overflow: ellipsis;
1159
- overflow: hidden;
1160
- white-space: nowrap;
1161
- text-transform: uppercase;
1162
- transition: none;
1163
- }
1164
-
1165
- /* Headline.
1166
- `display: block` makes the span clip with `text-overflow: ellipsis` even
1167
- though it is now nested inside the layout-transparent pami-tooltip wrapper
1168
- (when unwrapped it was blockified as a flex child; inside the wrapper it
1169
- needs an explicit block box). The wrapper stretches to the content-column
1170
- width and constrains this span — see section 9b. */
1171
- .pami-list-item__headline {
1172
- font-family: var(--_label-text-font);
1173
- font-size: max(13px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));
1174
- font-weight: var(--md-sys-typescale-body-large-font-weight, 400);
1175
- line-height: max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px));
1176
- letter-spacing: var(--md-sys-typescale-body-large-letter-spacing, 0.5px);
1177
- color: var(--_label-text-color);
1178
- display: block;
1179
- contain: inline-size;
1180
- min-inline-size: 0;
1181
- max-inline-size: 100%;
1182
- text-overflow: ellipsis;
1183
- overflow: hidden;
1184
- white-space: nowrap;
1185
- transition: none;
1186
- }
1187
-
1188
- /* Supporting */
1189
- .pami-list-item__supporting-text {
1190
- font-family: var(--_supporting-text-font);
1191
- font-size: max(11px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));
1192
- font-weight: var(--md-sys-typescale-body-medium-font-weight, 400);
1193
- line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));
1194
- letter-spacing: var(--md-sys-typescale-body-medium-letter-spacing, 0.25px);
1195
- color: var(--_supporting-text-color);
1196
- display: block;
1197
- contain: inline-size;
1198
- min-inline-size: 0;
1199
- max-inline-size: 100%;
1200
- text-overflow: ellipsis;
1201
- overflow: hidden;
1202
- white-space: nowrap;
1203
- transition: none;
1204
- }
1205
-
1206
- /* 3-line: supporting text wraps up to 2 lines */
1207
- :host(.pami-list-item--3-line) .pami-list-item__supporting-text {
1208
- display: -webkit-box;
1209
- -webkit-line-clamp: 2;
1210
- -webkit-box-orient: vertical;
1211
- white-space: normal;
1212
- }
1213
-
1214
- /* ==========================================================
1215
- 9b. TEXT TOOLTIP WRAPPERS
1216
- The headline + supporting-text spans are ALWAYS wrapped in a stable
1217
- pami-tooltip (rendered unconditionally — never mounted/unmounted on
1218
- resize, so there is no DOM-swap flicker). The full text is shown on
1219
- hover ONLY while the span is actually clipped; the tooltip's
1220
- `disabled` prop is toggled imperatively from a single debounced
1221
- ResizeObserver (see applyTooltipToggle in pami-list-item.tsx) so there
1222
- is no Stencil re-render on resize either.
1223
-
1224
- The wrapper must be layout-transparent so the inner span's ellipsis
1225
- math is byte-for-byte what it was unwrapped. We give the tooltip host
1226
- `display:block; min-inline-size:0; overflow:hidden`: as a column-flex
1227
- child of `.pami-list-item__content` it stretches to the content-column
1228
- width (align-items:stretch) and then constrains the inner block span,
1229
- which keeps `text-overflow: ellipsis` working exactly as before. The
1230
- `pami-tooltip` + class selector outscores pami-tooltip's own
1231
- `:host { display: inline-block }` so the block override is
1232
- deterministic across the shadow boundary. The popup itself is
1233
- position:fixed and escapes the wrapper's overflow:hidden.
1234
- ========================================================== */
1235
- pami-tooltip.pami-list-item__headline-tooltip,
1236
- pami-tooltip.pami-list-item__supporting-tooltip {
1237
- display: block;
1238
- min-inline-size: 0;
1239
- max-inline-size: 100%;
1240
- overflow: hidden;
1241
- /* A touch wider than the 280px plain-tooltip default so long row text
1242
- is more fully revealed when the tooltip does show. */
1243
- --pami-tooltip-plain-max-inline-size: 320px;
1244
- }
1245
-
1246
- /* Empty supporting text → collapse the whole wrapper, mirroring the
1247
- legacy `--empty` span behavior (nothing to measure or reveal). */
1248
- pami-tooltip.pami-list-item__supporting-tooltip--empty {
1249
- display: none;
1250
- }
1251
-
1252
- /* ==========================================================
1253
- 10. TRAILING SLOT
1254
- ========================================================== */
1255
- .pami-list-item__trailing {
1256
- display: flex;
1257
- align-items: center;
1258
- gap: 4px;
1259
- flex-shrink: 0;
1260
- color: var(--_trailing-icon-color);
1261
- }
1262
-
1263
- /* Trailing supporting text */
1264
- .pami-list-item__trailing-text {
1265
- font-family: var(--_trailing-supporting-text-font);
1266
- font-size: var(--md-sys-typescale-label-small-font-size, 11px);
1267
- font-weight: var(--md-sys-typescale-label-small-font-weight, 500);
1268
- line-height: var(--md-sys-typescale-label-small-line-height, 16px);
1269
- color: var(--_trailing-supporting-text-color);
1270
- white-space: nowrap;
1271
- }
1272
-
1273
- /* Trailing icon */
1274
- .pami-list-item__trailing-icon {
1275
- display: inline-flex;
1276
- align-items: center;
1277
- justify-content: center;
1278
- font-size: var(--_trailing-icon-size);
1279
- inline-size: var(--_trailing-icon-size);
1280
- block-size: var(--_trailing-icon-size);
1281
- line-height: 1;
1282
- color: var(--_trailing-icon-color);
1283
- }
1284
-
1285
- /* Slotted trailing content — secondary actions keep their own hit targets
1286
- in multi-action lists (icon buttons, switches, etc.).
1287
- pami-badge is excluded: it owns container/label colors via --pami-badge-* tokens
1288
- and must not inherit the row's trailing-icon color (on-surface-variant). */
1289
- ::slotted([slot="trailing"]:not(pami-badge)) {
1290
- display: inline-flex;
1291
- align-items: center;
1292
- justify-content: center;
1293
- color: var(--_trailing-icon-color);
1294
- fill: currentColor;
1295
- pointer-events: auto;
1296
- }
1297
-
1298
- /* pami-badge is authored as an overlay (position:absolute on the host) for
1299
- icon-button anchors. When slotted directly as trailing list content it
1300
- must participate in the row flex flow so it vertically centres with the
1301
- headline instead of painting against the row bottom / divider edge.
1302
- Color is intentionally omitted — badge owns label/container tokens. */
1303
- ::slotted(pami-badge[slot="trailing"]) {
1304
- display: inline-flex;
1305
- align-items: center;
1306
- justify-content: center;
1307
- pointer-events: auto;
1308
- position: static;
1309
- inset-block-start: auto;
1310
- inset-inline-end: auto;
1311
- transform: none;
1312
- flex-shrink: 0;
1313
- }
1314
-
1315
- /* 3-line rows stack trailing content in a column — centre standalone badges
1316
- the same way trailing icons get margin-block:auto. */
1317
- :host(.pami-list-item--3-line) ::slotted(pami-badge[slot="trailing"]) {
1318
- margin-block: auto;
1319
- }
1320
-
1321
- /* ==========================================================
1322
- 10a2. DRAG HANDLE (reorderable rows)
1323
- Rendered as the LAST trailing affordance when the parent
1324
- pami-list is `reorderable`. Grabbing it starts a pointer drag
1325
- that the parent list turns into a reorder. `touch-action:none`
1326
- lets the drag work on touch without the page scrolling, and
1327
- `pointer-events:auto` keeps the handle grabbable even inside a
1328
- row whose body is the primary click target.
1329
-
1330
- The selector intentionally doubles up the `pami-icon`
1331
- class (which the handle also carries for its glyph font) so this rule
1332
- outscores the generic `pami-icon { pointer-events: none }`
1333
- in Section 11. With equal single-class specificity that later rule would
1334
- otherwise win on source order and make the handle non-hittable — the
1335
- pointer would fall through to the row, `pointerdown`'s composedPath would
1336
- never include the handle, and the drag would never start. */
1337
- .pami-list-item__drag-handlepami-icon {
1338
- /* Visual parity with pami-accordion-item's drag handle: a 24px box holding a
1339
- 22px `drag_indicator` glyph that rests at on-surface-variant / 0.55 opacity
1340
- and lifts to full opacity + a subtle scale on hover. */
1341
- display: inline-flex;
1342
- align-items: center;
1343
- justify-content: center;
1344
- inline-size: 24px;
1345
- block-size: 24px;
1346
- flex-shrink: 0;
1347
- font-size: 22px;
1348
- line-height: 1;
1349
- color: var(--_trailing-icon-color);
1350
- opacity: 0.55;
1351
- cursor: grab;
1352
- touch-action: none;
1353
- pointer-events: auto;
1354
- transition:
1355
- opacity var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
1356
- transform var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)),
1357
- color var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
1358
- }
1359
-
1360
- .pami-list-item__drag-handlepami-icon:hover {
1361
- opacity: 1;
1362
- color: var(--md-sys-color-on-surface, #1c1b1f);
1363
- transform: scale(1.08);
1364
- }
1365
-
1366
- .pami-list-item__drag-handlepami-icon:active {
1367
- cursor: grabbing;
1368
- }
1369
-
1370
- :host(.pami-list-item--dragged) .pami-list-item__drag-handle {
1371
- opacity: 1;
1372
- color: var(--md-sys-color-on-surface, #1c1b1f);
1373
- cursor: grabbing;
1374
- }
1375
-
1376
- /* Siblings of the dragged row glide into their new slot. The dragged row
1377
- itself is NOT given this class, so its pointer-follow transform stays
1378
- instant (no lag). */
1379
- :host(.pami-list-item--shifting) {
1380
- transition: transform var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
1381
- will-change: transform;
1382
- }
1383
-
1384
- /* ==========================================================
1385
- 10b. EXPAND CARET (pami-icon-button)
1386
- The disclosure control is now an pami-icon-button rendered as
1387
- the LAST child of the trailing slot when the row is
1388
- `expandable`. It carries aria-expanded / aria-controls, gets
1389
- the icon-button's pill/squircle shape morph when selected
1390
- (expanded), and its `expand_more` glyph rotates 180° (points
1391
- up) when expanded — animated through the ::part(icon) it
1392
- forwards.
1393
- ========================================================== */
1394
- .pami-list-item__expand-button {
1395
- flex-shrink: 0;
1396
- /* xs (32px) fits the 56px row chassis — sm (40px) + 8/10 padding overshoots
1397
- min-block-size and makes the trigger look taller than child rows. */
1398
- --pami-icon-button-container-width: var(--pami-list-item-expand-button-size, 32px);
1399
- --pami-icon-button-container-height: var(--pami-list-item-expand-button-size, 32px);
1400
- --pami-icon-button-icon-size: var(--pami-list-item-expand-chevron-size, 24px);
1401
- --pami-icon-button-icon-color: var(--_expand-chevron-color);
1402
- --pami-icon-button-state-layer-color: var(--_expand-chevron-color);
1403
- margin-inline-end: -4px;
1404
- }
1405
-
1406
- /* Expanded: MD3 expansion-list active pill — narrow vertical squircle, primary
1407
- container fill, on-primary chevron (points up via rotation). */
1408
- .pami-list-item__expand-button--expanded {
1409
- --pami-icon-button-container-color: var(--md-sys-color-primary, #6750a4);
1410
- --pami-icon-button-icon-color: var(--md-sys-color-on-primary, #ffffff);
1411
- --pami-icon-button-state-layer-color: var(--md-sys-color-on-primary, #ffffff);
1412
- --pami-icon-button-outline-color: transparent;
1413
- }
1414
-
1415
- /* Rotate the caret glyph. We reach into the icon-button's forwarded
1416
- `icon` part — ::part pierces exactly one shadow level, which is the
1417
- pami-icon-button living in this row's shadow tree. */
1418
- .pami-list-item__expand-button::part(icon) {
1419
- transition: transform var(--md-sys-motion-duration-medium2, 250ms) var(--md-sys-motion-easing-emphasized, cubic-bezier(0.2, 0, 0, 1));
1420
- transform-origin: center;
1421
- }
1422
-
1423
- .pami-list-item__expand-button--expanded::part(icon) {
1424
- transform: rotate(180deg);
1425
- }
1426
-
1427
- /* ==========================================================
1428
- 10c. EXPANDED PANEL — MD3 expressive open / retract
1429
- Single-level reveal: the panel animates height via the modern
1430
- `grid-template-rows: 0fr ↔ 1fr` trick PLUS an opacity fade and
1431
- a small inner translateY so the content "arches" down into
1432
- place on open and retracts on close. Open uses
1433
- emphasized-decelerate (settle), close uses emphasized-accelerate
1434
- (clear out) — asymmetric M3 Expressive motion. The inner
1435
- wrapper carries the padding so the grid can collapse cleanly.
1436
- ========================================================== */
1437
- .pami-list-item__expanded-panel {
1438
- display: grid;
1439
- grid-template-rows: 0fr;
1440
- opacity: 0;
1441
- background-color: var(--_expanded-panel-background);
1442
- transition:
1443
- grid-template-rows var(--_collapse-duration) var(--_collapse-easing),
1444
- opacity var(--_collapse-duration) var(--_collapse-easing);
1445
- }
1446
-
1447
- :host(.pami-list-item--expanded) .pami-list-item__expanded-panel {
1448
- grid-template-rows: 1fr;
1449
- opacity: 1;
1450
- transition:
1451
- grid-template-rows var(--_expand-duration) var(--_expand-easing),
1452
- opacity var(--_expand-duration) var(--_expand-easing);
1453
- }
1454
-
1455
- .pami-list-item__expanded-panel-inner {
1456
- min-block-size: 0;
1457
- overflow: hidden;
1458
- /* Child motion coordinated with the parent height/opacity — the content
1459
- starts lifted and arcs down into its resting position on open. */
1460
- transform: translateY(-8px);
1461
- transition: transform var(--_collapse-duration) var(--_collapse-easing);
1462
- padding-block: var(--_expanded-panel-padding-block);
1463
- padding-inline-start: var(--_expanded-panel-padding-inline-start);
1464
- padding-inline-end: var(--_expanded-panel-padding-inline);
1465
- }
1466
-
1467
- :host(.pami-list-item--expanded) .pami-list-item__expanded-panel-inner {
1468
- transform: translateY(0);
1469
- transition: transform var(--_expand-duration) var(--_expand-easing);
1470
- }
1471
-
1472
- /* Flat expansion list — child rows are full-width sibling list items, not a
1473
- nested sub-box. Sharp corners on every child; the last child inherits the
1474
- expandable group's bottom rounding when this row is the list's last item. */
1475
- :host(.pami-list-item--expandable) ::slotted(pami-list-item[slot="expanded-content"]) {
1476
- --pami-list-item-container-shape: 0px;
1477
- --pami-list-item-container-shape-start-start: 0px;
1478
- --pami-list-item-container-shape-start-end: 0px;
1479
- --pami-list-item-container-shape-end-start: 0px;
1480
- --pami-list-item-container-shape-end-end: 0px;
1481
- display: block;
1482
- inline-size: 100%;
1483
- box-sizing: border-box;
1484
- }
1485
-
1486
- :host-context(.pami-list--standard):host(:last-of-type.pami-list-item--expanded) ::slotted(pami-list-item[slot="expanded-content"]:last-of-type),
1487
- :host-context(.pami-list--segmented):host(:last-of-type.pami-list-item--expanded) ::slotted(pami-list-item[slot="expanded-content"]:last-of-type) {
1488
- --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
1489
- --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
1490
- }
1491
-
1492
- /* Dividers between child rows slot inline with the connected chassis. */
1493
- ::slotted(pami-divider[slot="expanded-content"]) {
1494
- display: block;
1495
- }
1496
-
1497
- ::slotted([slot="expanded-content"]) {
1498
- display: block;
1499
- }
1500
-
1501
- /* When the panel is hidden via [hidden], grid still animates from 0fr
1502
- so don't collapse the box ourselves. */
1503
- .pami-list-item__expanded-panel[hidden] {
1504
- display: grid;
1505
- }
1506
-
1507
- /* Reduced motion: snap, don't animate */
1508
- @media (prefers-reduced-motion: reduce) {
1509
- :host {
1510
- transition-property: box-shadow;
1511
- }
1512
-
1513
- .pami-list-item__row,
1514
- .pami-list-item__expanded-panel,
1515
- .pami-list-item__expanded-panel-inner,
1516
- .pami-list-item__drag-handle {
1517
- transition: none;
1518
- }
1519
-
1520
- .pami-list-item__drag-handlepami-icon:hover {
1521
- transform: none;
1522
- }
1523
-
1524
- .pami-list-item__expand-button::part(icon) {
1525
- transition: none;
1526
- }
1527
-
1528
- .pami-list-item__image-selection-indicator {
1529
- transition: none;
1530
- }
1531
-
1532
- :host(.pami-list-item--selected) .pami-list-item__image-selection-circle {
1533
- animation: none;
1534
- transform: scale(1);
1535
- opacity: 1;
1536
- }
1537
- }
1538
-
1539
- /* ==========================================================
1540
- 11. ICON (icon font inside shadow DOM)
1541
- ========================================================== */
1542
- pami-icon {
1543
- font-weight: normal;
1544
- font-style: normal;
1545
- line-height: 1;
1546
- letter-spacing: normal;
1547
- text-transform: none;
1548
- display: inline-block;
1549
- white-space: nowrap;
1550
- overflow-wrap: normal;
1551
- direction: ltr;
1552
- -webkit-font-smoothing: antialiased;
1553
- pointer-events: none;
1554
- }
1555
-
1556
- /* ==========================================================
1557
- 12. RTL — directional icon mirroring hook
1558
- Trailing icons that imply direction (chevrons, arrows) can
1559
- be mirrored at the application level via a class. We do not
1560
- mirror by default since most trailing icons are non-directional.
1561
- ========================================================== */
1562
- :host([dir="rtl"]) .pami-list-item__trailing-icon[data-rtl-mirror],
1563
- :host-context([dir="rtl"]) .pami-list-item__trailing-icon[data-rtl-mirror] {
1564
- transform: scaleX(-1);
1565
- }
1566
-
1567
- /* ==========================================================
1568
- 14. IMAGE / AVATAR padding adjustments
1569
- When a row uses an image thumbnail, the leading slot fills
1570
- the full 16+56+16 column so the start padding of the host
1571
- moves onto the image itself.
1572
- ========================================================== */
1573
- :host(.pami-list-item--with-image) .pami-list-item__row {
1574
- padding-inline-start: 16px;
1575
- }
1576
-
1577
- /* ==========================================================
1578
- DENSITY (local override)
1579
- Maps the local `density` prop onto the same --md-sys-density-scale signal a
1580
- global `data-density` ancestor sets. Declared on :host, so a local rung wins
1581
- over the inherited global one. Every density-sensitive value in this file
1582
- derives from that single signal by calc — never add a fixed per-rung ladder.
1583
- ========================================================== */
1584
- :host([density='-1']) { --md-sys-density-scale: -1; }
1585
- :host([density='-2']) { --md-sys-density-scale: -2; }
1586
- :host([density='-3']) { --md-sys-density-scale: -3; }
1587
- :host([density='-4']) { --md-sys-density-scale: -4; }
1588
-
1589
- /* ==========================================================
1590
- HIDDEN
1591
- `[hidden]` is a UA-stylesheet rule, and every `:host` display
1592
- declaration above is an AUTHOR rule — author origin beats UA, so without
1593
- this guard `el.hidden = true` left the component fully laid out.
1594
- `!important` because state rules in this file set `display` at equal or
1595
- higher specificity than `:host([hidden])`.
1596
- ========================================================== */
1597
- :host([hidden]) {
1598
- display: none !important;
1599
- }
1
+ /* ==========================================================
2
+ pami-list-item — Material Design 3 List Item
3
+ Spec: https://m3.material.io/components/lists/specs
4
+
5
+ PUBLIC CSS CUSTOM PROPERTIES (override per-instance):
6
+ --pami-list-item-container-color Container background (M3 default: surface = #FEF7FF light)
7
+ --pami-list-item-container-shape Border-radius shorthand (all four corners)
8
+ --pami-list-item-container-shape-start-start Top-start corner (used by pami-list grouped style)
9
+ --pami-list-item-container-shape-start-end Top-end corner (used by pami-list grouped style)
10
+ --pami-list-item-container-shape-end-start Bottom-start corner
11
+ --pami-list-item-container-shape-end-end Bottom-end corner
12
+ --pami-list-item-active-container-shape Meta-override applied to every active state
13
+ (hover / focus / pressed / selected / dragged)
14
+ --pami-list-item-hover-container-shape Border-radius on hover (default 0 — no morph; opt-in)
15
+ --pami-list-item-focus-container-shape Border-radius on focus (default 16px / corner-large)
16
+ --pami-list-item-pressed-container-shape Border-radius on press (default 16px / corner-large)
17
+ --pami-list-item-selected-container-shape Border-radius on selected (default 16px / corner-large)
18
+ --pami-list-item-active-container-shape Shared default for all four states above
19
+ --pami-list-item-dragged-container-shape Border-radius on dragged (default 16px / corner-large)
20
+ --pami-list-item-hover-state-layer-opacity State-layer opacity on hover (M3: 0.08)
21
+ --pami-list-item-focus-state-layer-opacity State-layer opacity on focus (M3: 0.10)
22
+ --pami-list-item-pressed-state-layer-opacity State-layer opacity on press (M3: 0.10)
23
+ --pami-list-item-dragged-state-layer-opacity State-layer opacity when dragged (M3: 0.16)
24
+ --pami-list-item-disabled-state-layer-opacity State-layer opacity when disabled (default 0)
25
+ --pami-list-item-label-text-color Headline text color
26
+ --pami-list-item-label-text-font Headline font family
27
+ --pami-list-item-supporting-text-color Supporting text color
28
+ --pami-list-item-supporting-text-font Supporting text font family
29
+ --pami-list-item-overline-color Overline text color
30
+ --pami-list-item-trailing-supporting-text-color Trailing supporting text color
31
+ --pami-list-item-trailing-supporting-text-font Trailing supporting text font family
32
+ --pami-list-item-leading-icon-color Leading icon color
33
+ --pami-list-item-leading-icon-size Leading icon size, default (M3: 24px)
34
+ --pami-list-item-leading-icon-expressive-size Leading icon size, Expressive list-style (M3: 20px).
35
+ Auto-applied when the row sits inside an
36
+ pami-list[list-style="standard"|"segmented"].
37
+ --pami-list-item-trailing-icon-color Trailing icon color
38
+ --pami-list-item-unselected-trailing-icon-color Trailing icon color when row is in selection
39
+ mode but NOT selected (M3: on-surface)
40
+ --pami-list-item-trailing-icon-size Trailing icon size, default (M3: 24px)
41
+ --pami-list-item-trailing-icon-expressive-size Trailing icon size, Expressive list-style (M3: 20px)
42
+ --pami-list-item-leading-space Inline-start padding (M3: 16px)
43
+ --pami-list-item-trailing-space Inline-end padding (M3: 16px)
44
+ --pami-list-item-top-space Block-start padding (M3: 8px)
45
+ --pami-list-item-bottom-space Block-end padding (M3: 10px)
46
+ --pami-list-item-between-space Gap between leading / content / trailing (M3: 12px)
47
+ --pami-list-item-three-line-top-space Block-start padding when 3-line / 88px+ (M3: 12px)
48
+ --pami-list-item-three-line-bottom-space Block-end padding when 3-line / 88px+ (M3: 12px)
49
+ --pami-list-item-dragged-container-elevation Box-shadow applied when host carries
50
+ .pami-list-item--dragged (M3: level 4 lift)
51
+ --pami-list-item-leading-video-width Width of <video slot="leading"> thumbnail (M3: 100px)
52
+ --pami-list-item-leading-video-height Height of <video slot="leading"> thumbnail (M3: 56px)
53
+ --pami-list-item-leading-video-shape Border-radius of <video slot="leading"> (M3: corner-small)
54
+ --pami-list-item-leading-video-top-space Block-start padding bumped when the row carries
55
+ a <video slot="leading"> (M3: 12px). Bottom padding
56
+ is unaffected — the asymmetry visually anchors the
57
+ wider 100×56px video thumbnail.
58
+ --pami-list-item-leading-avatar-color Avatar circle color (label avatar)
59
+ --pami-list-item-leading-avatar-label-color Avatar label text color
60
+ --pami-list-item-leading-avatar-size Avatar dimensions (default 40px)
61
+ --pami-list-item-leading-avatar-shape Avatar border-radius (default full)
62
+ --pami-list-item-leading-image-width Image thumbnail width (default 56px)
63
+ --pami-list-item-leading-image-height Image thumbnail height (default 56px)
64
+ --pami-list-item-leading-image-shape Image thumbnail radius, default (M3: 0)
65
+ --pami-list-item-leading-image-expressive-shape Image thumbnail radius, Expressive list-style
66
+ (M3: corner-small / 8px). Auto-applied on
67
+ pami-list[list-style="standard"|"segmented"].
68
+ --pami-list-item-leading-image-selection-scrim-color Full-thumbnail scrim when selected (M3: scrim @ 32%)
69
+ --pami-list-item-leading-image-selection-circle-color Checkmark circle fill when selected (M3: on-surface @ 60%)
70
+ --pami-list-item-leading-image-selection-icon-color Checkmark glyph color (M3: surface / white)
71
+ --pami-list-item-leading-image-selection-icon-size Checkmark circle diameter (M3: 24px)
72
+ --pami-list-item-selected-container-color Selected container background (Pami: tertiary-container)
73
+ --pami-list-item-selected-label-text-color Selected headline color (Pami: on-tertiary-container)
74
+ --pami-list-item-selected-active-icon-color Leading/trailing icon color when row is BOTH
75
+ selected AND in an active state (hover / focus /
76
+ pressed / dragged). M3: on-surface (#1D1B20).
77
+ --pami-list-item-selected-disabled-container-color Container fill when row is BOTH selected AND
78
+ disabled (M3: on-surface @ 12%)
79
+ --pami-list-item-expand-chevron-color Caret icon color when collapsed (forwarded to the
80
+ trailing pami-icon-button's icon color). Expanded pill
81
+ uses `--md-sys-color-primary` /
82
+ `--md-sys-color-on-primary`.
83
+ --pami-list-item-expand-duration Expanded-panel open duration (M3: medium3 / 350ms)
84
+ --pami-list-item-collapse-duration Expanded-panel close duration (M3: short4 / 200ms)
85
+ --pami-list-item-expanded-panel-padding-block Expanded panel vertical padding
86
+ --pami-list-item-expanded-panel-padding-inline Expanded panel horizontal padding (both sides)
87
+ --pami-list-item-expanded-panel-padding-inline-start Expanded panel start padding —
88
+ takes precedence over the symmetric value
89
+ above. Default 0 — child rows align with the
90
+ parent row in a flat connected expansion list.
91
+ --pami-list-item-expanded-panel-background Expanded panel background
92
+
93
+ CSS PARTS:
94
+ row Row chassis (leading + content + trailing)
95
+ state-layer State-layer overlay (interactive rows only)
96
+ leading Leading slot container
97
+ content Content slot container (overline + headline + supporting)
98
+ headline Headline text element
99
+ headline-tooltip-popup Popup of the headline overflow tooltip (forwarded)
100
+ overline Overline text element
101
+ supporting-text Supporting text element
102
+ supporting-tooltip-popup Popup of the supporting-text overflow tooltip (forwarded)
103
+ trailing Trailing slot container
104
+ trailing-supporting-text Trailing supporting text element
105
+ leading-icon Leading Lucide icon
106
+ trailing-icon Trailing Lucide icon
107
+ avatar Leading avatar (image or label)
108
+ image Leading image thumbnail
109
+ image-wrap Wrapper around prop-based leading image + selection overlay
110
+ image-selection-indicator Selected-state scrim overlay on image thumbnail
111
+ image-selection-circle Checkmark circle fill centered on thumbnail
112
+ image-selection-check Lucide check glyph inside the circle
113
+ expand-button Trailing caret pami-icon-button on expandable rows
114
+ expand-button-state-layer State-layer of the caret button (forwarded)
115
+ expand-button-icon Icon glyph wrapper of the caret button (forwarded;
116
+ rotates 180° when expanded)
117
+ drag-handle Trailing drag grip on reorderable rows
118
+ expanded-panel Wrapper revealed when `expanded` is true
119
+ expanded-panel-inner Inner wrapper that holds the slot
120
+
121
+ SLOTS:
122
+ (default) Headline content (fallback for `headline` prop)
123
+ headline Rich headline (overrides `headline` prop)
124
+ overline Rich overline (overrides `overline` prop)
125
+ supporting-text Rich supporting text
126
+ trailing-supporting-text Rich trailing supporting text
127
+ leading Custom leading content (icon / avatar / image)
128
+ trailing Custom trailing content (icon button, switch, etc.)
129
+ expanded-content Content revealed when an expandable row is expanded
130
+ ========================================================== */
131
+
132
+ /* ==========================================================
133
+ 1. HOST — token mapping + base block layout
134
+ The host is the "container" — it owns the rounded chassis,
135
+ background, divider position, and (when expandable) stacks
136
+ a row above an expanded panel via display: block. The actual
137
+ row chrome lives on .pami-list-item__row.
138
+ ========================================================== */
139
+ :host {
140
+ /* PUBLIC → INTERNAL */
141
+ /* Per the M3 Lists token spec the resting container color is `surface`
142
+ (#FEF7FF on the light tonal palette). pami-list wrappers stay
143
+ transparent so the items provide the visible fill. */
144
+ --_container-color: var(--pami-list-item-container-color, var(--md-sys-color-surface, #fef7ff));
145
+ --_container-shape: var(--pami-list-item-container-shape, 0px);
146
+
147
+ /* Per-corner shapes — fall through to the shorthand by default but
148
+ pami-list[list-style="grouped"] overrides start-start/start-end on
149
+ the first row and end-start/end-end on the last to give a shared
150
+ rounded chassis. Threading them as custom properties means the
151
+ parent list can paint shape via `::slotted()` without crossing the
152
+ shadow boundary directly. */
153
+ --_container-shape-start-start: var(--pami-list-item-container-shape-start-start, var(--_container-shape));
154
+ --_container-shape-start-end: var(--pami-list-item-container-shape-start-end, var(--_container-shape));
155
+ --_container-shape-end-start: var(--pami-list-item-container-shape-end-start, var(--_container-shape));
156
+ --_container-shape-end-end: var(--pami-list-item-container-shape-end-end, var(--_container-shape));
157
+
158
+ /* Per-state container shape morph per the M3 Lists spec:
159
+ Hover → no default morph (state layer only)
160
+ Focus → 16px (corner-large)
161
+ Pressed → 16px (corner-large)
162
+ Selected → 16px (corner-large)
163
+ Dragged → 16px (corner-large)
164
+ `--pami-list-item-active-container-shape` acts as a meta-override —
165
+ set it once to apply the same shape across focus / pressed / selected /
166
+ dragged. Hover is excluded unless `--pami-list-item-hover-container-shape`
167
+ is set explicitly. */
168
+ /* Active-state corner radii — focus / pressed / selected / dragged default
169
+ to corner-large (16px). Hover defaults to 0 so flat middle rows keep
170
+ sharp corners during pointer-over; only the state layer signals hover. */
171
+ /* Hover defaults to 0 so flat / middle rows keep their resting corners.
172
+ Hover feedback is the state layer only — rounding on hover made
173
+ hover-out snap from rounded → sharp even without a radius transition.
174
+ Authors can still opt in via --pami-list-item-hover-container-shape or
175
+ the shared --pami-list-item-active-container-shape meta-override. */
176
+ --_hover-container-shape: var(--pami-list-item-hover-container-shape, var(--pami-list-item-active-container-shape, 0px));
177
+ /* These three are the MORPHED corner radii for focus / press / selection.
178
+ They are consumed as `max(<resting corner>, <this>)`, so multiplying by
179
+ --md-sys-shape-morph-enabled collapses them to 0 when shape morphing is
180
+ switched off — and max(rest, 0) is exactly the resting corner. That freezes
181
+ all 50+ per-corner morph rules below from three declarations, with no
182
+ change at all while the flag is its default 1.
183
+
184
+ Global `data-shape-morph="off"` or per-component `shape-morph="off"`; see
185
+ §13 in tokens.css. */
186
+ --_focus-container-shape: calc(var(--pami-list-item-focus-container-shape, var(--pami-list-item-active-container-shape, var(--md-sys-shape-corner-large, 16px))) * var(--md-sys-shape-morph-enabled, 1));
187
+ --_pressed-container-shape: calc(var(--pami-list-item-pressed-container-shape, var(--pami-list-item-active-container-shape, var(--md-sys-shape-corner-large, 16px))) * var(--md-sys-shape-morph-enabled, 1));
188
+ --_selected-container-shape: calc(var(--pami-list-item-selected-container-shape, var(--pami-list-item-active-container-shape, var(--md-sys-shape-corner-large, 16px))) * var(--md-sys-shape-morph-enabled, 1));
189
+ --_dragged-container-shape: var(--pami-list-item-dragged-container-shape, var(--pami-list-item-active-container-shape, var(--md-sys-shape-corner-large, 16px)));
190
+
191
+ --_label-text-color: var(--pami-list-item-label-text-color, var(--md-sys-color-on-surface, #1c1b1f));
192
+ --_label-text-font: var(--pami-list-item-label-text-font, var(--md-sys-typescale-body-large-font-family, Roboto, sans-serif));
193
+
194
+ --_supporting-text-color: var(--pami-list-item-supporting-text-color, var(--md-sys-color-on-surface-variant, #49454f));
195
+ --_supporting-text-font: var(--pami-list-item-supporting-text-font, var(--md-sys-typescale-body-medium-font-family, Roboto, sans-serif));
196
+
197
+ --_overline-color: var(--pami-list-item-overline-color, var(--md-sys-color-on-surface-variant, #49454f));
198
+
199
+ --_trailing-supporting-text-color: var(--pami-list-item-trailing-supporting-text-color, var(--md-sys-color-on-surface-variant, #49454f));
200
+ --_trailing-supporting-text-font: var(--pami-list-item-trailing-supporting-text-font, var(--md-sys-typescale-label-small-font-family, Roboto, sans-serif));
201
+
202
+ --_leading-icon-color: var(--pami-list-item-leading-icon-color, var(--md-sys-color-on-surface-variant, #49454f));
203
+ /* M3 token spec: list-item leading icon = 24px (default).
204
+ The Expressive list-styles (`standard`, `segmented`) tighten this to
205
+ 20px via the `--_leading-icon-expressive-size` override below. */
206
+ --_leading-icon-size: var(--pami-list-item-leading-icon-size, max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px)));
207
+ --_leading-icon-expressive-size: var(--pami-list-item-leading-icon-expressive-size, max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px)));
208
+ --_trailing-icon-color: var(--pami-list-item-trailing-icon-color, var(--md-sys-color-on-surface-variant, #49454f));
209
+ /* When the row is in selection mode but NOT selected, the M3 token spec
210
+ calls for the trailing icon (typically a checkmark or radio glyph) to
211
+ use on-surface instead of on-surface-variant — slightly higher contrast
212
+ so the affordance reads as "tap to select" rather than ambient meta. */
213
+ --_unselected-trailing-icon-color: var(--pami-list-item-unselected-trailing-icon-color, var(--md-sys-color-on-surface, #1d1b20));
214
+ --_trailing-icon-size: var(--pami-list-item-trailing-icon-size, max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px)));
215
+ --_trailing-icon-expressive-size: var(--pami-list-item-trailing-icon-expressive-size, max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px)));
216
+
217
+ --_leading-avatar-color: var(--pami-list-item-leading-avatar-color, var(--md-sys-color-primary-container, #eaddff));
218
+ --_leading-avatar-label-color: var(--pami-list-item-leading-avatar-label-color, var(--md-sys-color-on-primary-container, #21005d));
219
+ --_leading-avatar-size: var(--pami-list-item-leading-avatar-size, 40px);
220
+ --_leading-avatar-shape: var(--pami-list-item-leading-avatar-shape, var(--md-sys-shape-corner-full, 9999px));
221
+
222
+ --_leading-image-width: var(--pami-list-item-leading-image-width, 56px);
223
+ --_leading-image-height: var(--pami-list-item-leading-image-height, 56px);
224
+ /* M3: default image is square (corner-none); Expressive image rounds
225
+ to corner-small (8px). The expressive value is applied by the
226
+ `:host-context(.pami-list--standard|.pami-list--segmented)` rule
227
+ down in Section 3. */
228
+ --_leading-image-shape: var(--pami-list-item-leading-image-shape, var(--md-sys-shape-corner-none, 0px));
229
+ --_leading-image-expressive-shape: var(--pami-list-item-leading-image-expressive-shape, var(--md-sys-shape-corner-small, 8px));
230
+ --_leading-image-selection-scrim-color: var(
231
+ --pami-list-item-leading-image-selection-scrim-color,
232
+ color-mix(in srgb, var(--md-sys-color-scrim, #000000) 32%, transparent)
233
+ );
234
+ --_leading-image-selection-circle-color: var(
235
+ --pami-list-item-leading-image-selection-circle-color,
236
+ color-mix(in srgb, var(--md-sys-color-on-surface, #1d1b20) 60%, transparent)
237
+ );
238
+ --_leading-image-selection-icon-color: var(
239
+ --pami-list-item-leading-image-selection-icon-color,
240
+ var(--md-sys-color-surface, #fef7ff)
241
+ );
242
+ --_leading-image-selection-icon-size: var(--pami-list-item-leading-image-selection-icon-size, 24px);
243
+
244
+ /* Per the M3 spec the leading slot may also hold a <video> thumbnail.
245
+ Default size is 100×56px (small video token). Authors slot a
246
+ `<video slot="leading">` and these props size it automatically. */
247
+ --_leading-video-width: var(--pami-list-item-leading-video-width, 100px);
248
+ --_leading-video-height: var(--pami-list-item-leading-video-height, 56px);
249
+ --_leading-video-shape: var(--pami-list-item-leading-video-shape, var(--md-sys-shape-corner-small, 8px));
250
+
251
+ /* Pami object selection uses Bronze soft; filters use Olive soft. */
252
+ --_selected-container-color: var(--pami-list-item-selected-container-color, var(--md-sys-color-tertiary-container, #FFEEE4));
253
+ --_selected-label-text-color: var(--pami-list-item-selected-label-text-color, var(--md-sys-color-on-tertiary-container, #331E11));
254
+ /* Selected + interactive states: per the M3 spec, when a selected
255
+ row is hovered / focused / pressed / dragged its leading + trailing
256
+ icons jump from on-tertiary-container (#4A4458) to on-surface
257
+ (#1D1B20) for the duration of the interaction. */
258
+ --_selected-active-icon-color: var(--pami-list-item-selected-active-icon-color, var(--md-sys-color-on-surface, #1d1b20));
259
+ /* Selected + disabled: container fades to on-surface @ 12% per spec. */
260
+ --_selected-disabled-container-color: var(
261
+ --pami-list-item-selected-disabled-container-color,
262
+ color-mix(in srgb, var(--md-sys-color-on-surface, #1d1b20) 12%, transparent)
263
+ );
264
+
265
+ --_state-layer-color: var(--md-sys-color-on-surface, #1c1b1f);
266
+
267
+ /* Per-state state-layer opacities from the M3 Lists spec — these
268
+ override the generic system tokens (which default to 0.12 for
269
+ focus/press and don't define a dragged opacity). */
270
+ --_hover-state-layer-opacity: var(--pami-list-item-hover-state-layer-opacity, var(--md-sys-state-hover-state-layer-opacity, 0.08));
271
+ --_focus-state-layer-opacity: var(--pami-list-item-focus-state-layer-opacity, 0.1);
272
+ --_pressed-state-layer-opacity: var(--pami-list-item-pressed-state-layer-opacity, 0.1);
273
+ --_dragged-state-layer-opacity: var(--pami-list-item-dragged-state-layer-opacity, 0.16);
274
+ --_disabled-state-layer-opacity: var(--pami-list-item-disabled-state-layer-opacity, 0);
275
+
276
+ /* Row spacing tokens — defaults track the M3 Lists token spec
277
+ (leading 16px, trailing 16px, top 8px, bottom 10px, between 12px).
278
+ When the row sits inside a 88px+ chassis (lines=3) the top/bottom
279
+ flips to 12px per the spec. When the leading slot hosts a <video>
280
+ thumbnail, the top padding is bumped to 12px (see the `:has()`
281
+ override below) so the 100×56px tile reads as anchored rather than
282
+ hugged-tight against the chassis edge. */
283
+ --_leading-space: var(--pami-list-item-leading-space, var(--md-sys-spacing-inset-lg, 16px));
284
+ --_trailing-space: var(--pami-list-item-trailing-space, var(--md-sys-spacing-inset-lg, 16px));
285
+ /* Vertical padding rides inset-sm (8px at density 0, so the M3 8px/10px
286
+ defaults are unchanged) so multi-line rows keep tightening past the point
287
+ where min-block-size alone floors on the text height. */
288
+ /* Vertical padding tightens with global density down to 2px (8/10px at
289
+ density 0), so multi-line rows reach a genuinely compact height at -3/-4. */
290
+ --_top-space: var(--pami-list-item-top-space, max(2px, calc(8px + var(--md-sys-density-scale, 0) * 1.5px)));
291
+ --_bottom-space: var(--pami-list-item-bottom-space, max(2px, calc(8px + var(--md-sys-density-scale, 0) * 1.5px)));
292
+ --_between-space: var(--pami-list-item-between-space, max(8px, var(--md-sys-spacing-gap-md, 12px)));
293
+ --_three-line-top-space: var(--pami-list-item-three-line-top-space, max(2px, calc(12px + var(--md-sys-density-scale, 0) * 2.5px)));
294
+ --_three-line-bottom-space: var(--pami-list-item-three-line-bottom-space, max(2px, calc(12px + var(--md-sys-density-scale, 0) * 2.5px)));
295
+
296
+ /* Global density lever: each rung of `data-density` (0…-4) trims the row
297
+ height. density-scale is 0 by default, so the default heights below are
298
+ unchanged. Single-line uses 4px/rung; multi-line uses 6px/rung so 2/3-line
299
+ rows tighten toward their content instead of flooring ~16px above it.
300
+ See packages/tokens/src/tokens.css §10-12. */
301
+ --_density-delta: calc(var(--md-sys-density-scale, 0) * 4px);
302
+ --_density-delta-multi: calc(var(--md-sys-density-scale, 0) * 6px);
303
+
304
+ /* Per the M3 Lists spec a dragged tile lifts to level 4 elevation so
305
+ it visually detaches from its neighbours. */
306
+ --_dragged-container-elevation: var(--pami-list-item-dragged-container-elevation, inset 0 0 0 1px var(--pami-material-crumb-edge-side, var(--pami-component-glass-light-bottom, rgba(80, 69, 54, 0.16))));
307
+
308
+ --_expand-chevron-color: var(--pami-list-item-expand-chevron-color, var(--md-sys-color-on-surface-variant, #49454f));
309
+
310
+ /* MD3 expressive disclosure motion — the panel "arches" open with
311
+ emphasized-decelerate (content settles into place on the way down) and
312
+ "retracts" on close with emphasized-accelerate (content gets out of the
313
+ way quickly). Asymmetric duration + easing is the M3 Expressive
314
+ open/close vocabulary, mirroring pami-accordion-item. */
315
+ --_expand-duration: var(--pami-list-item-expand-duration, var(--md-sys-motion-duration-medium3, 350ms));
316
+ --_collapse-duration: var(--pami-list-item-collapse-duration, var(--md-sys-motion-duration-short4, 200ms));
317
+ --_expand-easing: var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1));
318
+ --_collapse-easing: var(--md-sys-motion-easing-emphasized-accelerate, cubic-bezier(0.3, 0, 0.8, 0.15));
319
+
320
+ --_expanded-panel-padding-block: var(--pami-list-item-expanded-panel-padding-block, 0px);
321
+ --_expanded-panel-padding-inline: var(--pami-list-item-expanded-panel-padding-inline, 0px);
322
+ /* Flat expansion list — child rows sit at the same inline alignment as the
323
+ parent row (no nested sub-box indent). Authors can opt into nesting via
324
+ `--pami-list-item-expanded-panel-padding-inline-start`. */
325
+ --_expanded-panel-padding-inline-start: var(
326
+ --pami-list-item-expanded-panel-padding-inline-start,
327
+ var(--pami-list-item-expanded-panel-padding-inline, 0px)
328
+ );
329
+ --_expanded-panel-background: var(--pami-list-item-expanded-panel-background, transparent);
330
+
331
+ display: block;
332
+ position: relative;
333
+ background-color: var(--_container-color);
334
+ color: var(--_label-text-color);
335
+ /* The longhand corner radii are set so pami-list[list-style="grouped"]
336
+ can override individual corners. The shorthand stays as a fallback
337
+ for the standard / segmented paths. */
338
+ border-start-start-radius: var(--_container-shape-start-start);
339
+ border-start-end-radius: var(--_container-shape-start-end);
340
+ border-end-start-radius: var(--_container-shape-end-start);
341
+ border-end-end-radius: var(--_container-shape-end-end);
342
+ box-sizing: border-box;
343
+ -webkit-tap-highlight-color: transparent;
344
+ outline: none;
345
+ /* The chassis owns rounding so a non-zero border-radius clips both
346
+ the row's state layer AND the expanded panel without bleeding past
347
+ the corners. `clip` (not `hidden`) avoids creating a stacking
348
+ context that would clip outward popups. */
349
+ overflow: clip;
350
+ /* Animate chassis shape + elevation only — not color/background. Transitions
351
+ on color during continuous resize reflow read as text flicker even when
352
+ the token value is unchanged. Selection / disabled tints snap via custom
353
+ properties on child text nodes instead. */
354
+ transition:
355
+ box-shadow var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
356
+ border-start-start-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
357
+ border-start-end-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
358
+ border-end-start-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
359
+ border-end-end-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1));
360
+ }
361
+
362
+ /* ==========================================================
363
+ 1b. ROW — flex chrome (leading | content | trailing)
364
+ All spacing flows through public custom properties so apps can
365
+ re-tune individual edges without rewriting padding shorthands. The
366
+ defaults track the M3 Lists token spec:
367
+ - Leading space 16px (--pami-list-item-leading-space)
368
+ - Trailing space 16px (--pami-list-item-trailing-space)
369
+ - Top space 10px (--pami-list-item-top-space)
370
+ - Bottom space 10px (--pami-list-item-bottom-space)
371
+ - Between space 12px (--pami-list-item-between-space) — gap
372
+ - 3-line top/bottom 12px (--pami-list-item-three-line-{top,bottom}-space)
373
+ - Minimum touch 48px → min-block-size 56px (≥48px)
374
+ To revert to the older 24px trailing / 16px between (M3 baseline
375
+ pre-Expressive), set:
376
+ pami-list-item {
377
+ --pami-list-item-trailing-space: 24px;
378
+ --pami-list-item-between-space: 16px;
379
+ }
380
+ ========================================================== */
381
+ .pami-list-item__row {
382
+ display: flex;
383
+ align-items: center;
384
+ position: relative;
385
+ min-block-size: calc(56px + var(--_density-delta));
386
+ padding-block-start: var(--_top-space);
387
+ padding-block-end: var(--_bottom-space);
388
+ padding-inline-start: var(--_leading-space);
389
+ padding-inline-end: var(--_trailing-space);
390
+ gap: var(--_between-space);
391
+ box-sizing: border-box;
392
+ /* Keep ripple + state-layer inside the row when the host has 0px radius. */
393
+ overflow: hidden;
394
+ transition:
395
+ border-start-start-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
396
+ border-start-end-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
397
+ border-end-start-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)),
398
+ border-end-end-radius var(--md-sys-motion-duration-medium4, 400ms) var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1));
399
+ }
400
+
401
+ /* Interactive rows show pointer cursor */
402
+ :host(.pami-list-item--interactive) .pami-list-item__row {
403
+ cursor: pointer;
404
+ user-select: none;
405
+ }
406
+
407
+ /* Non-interactive plain rows (default `type="text"`) */
408
+ :host(.pami-list-item--type-text:not(.pami-list-item--selection-mode):not(.pami-list-item--expandable)) .pami-list-item__row {
409
+ cursor: default;
410
+ }
411
+
412
+ /* ==========================================================
413
+ 1c. PRIMARY ACTION (non-selection interactive rows)
414
+ For `type="button"` / `type="link"` rows the interactive widget is an inner
415
+ element (`role="button"` / `menuitem` span, or a real `<a href>`), NOT the
416
+ host — so the host stays a structural role (`listitem`, or `none` in a menu)
417
+ and any trailing controls remain its focusable SIBLINGS (never nested → no
418
+ axe `nested-interactive`). It wraps only the leading + content clusters and
419
+ takes the primary flex bay of the row; the ripple, state layer and focus ring
420
+ stay row/host-level so their visuals are byte-for-byte unchanged. The leading↔
421
+ content gap lives here; the content↔trailing gap stays on the row.
422
+ ========================================================== */
423
+ .pami-list-item__primary {
424
+ display: flex;
425
+ align-items: center;
426
+ flex: 1 1 auto;
427
+ min-inline-size: 0;
428
+ gap: var(--_between-space);
429
+ /* Neutralize the intrinsic chrome of <button> / <a> so layout + typography
430
+ are identical to when leading/content sat directly in the row. */
431
+ appearance: none;
432
+ margin: 0;
433
+ padding: 0;
434
+ border: 0;
435
+ background: transparent;
436
+ color: inherit;
437
+ font: inherit;
438
+ text-align: inherit;
439
+ text-decoration: none;
440
+ cursor: inherit;
441
+ outline: none;
442
+ -webkit-tap-highlight-color: transparent;
443
+ }
444
+
445
+ /* 3-line rows top-align the leading cluster; mirror that inside the primary
446
+ wrapper, which is now the flex parent of leading + content. */
447
+ :host(.pami-list-item--3-line) .pami-list-item__primary {
448
+ align-items: flex-start;
449
+ /* Stretch to the row's full content box. Without this the primary is only as
450
+ tall as its text (60px in a 64px box) and sits at the top, so anything
451
+ centred INSIDE it — the avatar below — centres on the text rather than on
452
+ the row, landing 2px high. The trailing cluster already stretches for the
453
+ same reason. `align-items: flex-start` above is untouched, so the text
454
+ itself stays top-aligned and the trailing timestamp keeps lining up with
455
+ the overline. */
456
+ align-self: stretch;
457
+ }
458
+
459
+ /* ==========================================================
460
+ 2. LINE HEIGHT VARIANTS
461
+ 1-line: 56px | 2-line: 72px | 3-line: 88px+
462
+ At 88px+ the spec says elements top-align; we apply that
463
+ to both leading and trailing so an avatar/icon sits at
464
+ the top of a multi-line row like the M3 reference image.
465
+ ========================================================== */
466
+ /* 1 / 2-line rows: keep the host's --_top-space / --_bottom-space
467
+ defaults (8px / 10px). Only the row height changes per the M3 spec. */
468
+ :host(.pami-list-item--1-line) .pami-list-item__row {
469
+ min-block-size: calc(56px + var(--_density-delta));
470
+ }
471
+
472
+ :host(.pami-list-item--2-line) .pami-list-item__row {
473
+ min-block-size: calc(72px + var(--_density-delta-multi));
474
+ }
475
+
476
+ /* 3-line rows (88px+): the M3 spec bumps top / bottom padding to 12px
477
+ and top-aligns the leading + trailing wrappers so the leading icon
478
+ sits flush to the spec's 12px leading-icon-top-padding mark. */
479
+ :host(.pami-list-item--3-line) .pami-list-item__row {
480
+ min-block-size: calc(88px + var(--_density-delta-multi));
481
+ padding-block-start: var(--_three-line-top-space);
482
+ padding-block-end: var(--_three-line-bottom-space);
483
+ align-items: flex-start;
484
+ }
485
+
486
+ /* When the leading slot hosts a <video> thumbnail (100×56px), the M3
487
+ spec asks for a 12px top inset instead of the 8px default so the
488
+ wider thumbnail reads as anchored to the row, not crammed against
489
+ the chassis edge. We override --_top-space at the host level so the
490
+ `.pami-list-item__row` rule above keeps the single source of truth.
491
+ The 3-line override above still wins by source order for 3-line +
492
+ video (both ask for 12px anyway).
493
+
494
+ Detection is done via the `pami-list-item--with-video` host class set
495
+ from TSX (see `detectSlottedFromLightDom` in pami-list-item.tsx). We
496
+ can't use `:host(:has(> video[slot="leading"]))` here because
497
+ Chromium doesn't let `:host()`'s relational pseudo-class arguments
498
+ cross the shadow boundary into the host's light-DOM descendants. */
499
+ :host(.pami-list-item--with-video) {
500
+ --_top-space: var(--pami-list-item-leading-video-top-space, max(4px, calc(12px + var(--md-sys-density-scale, 0) * 2px)));
501
+ --_bottom-space: max(4px, calc(12px + var(--md-sys-density-scale, 0) * 2px));
502
+ }
503
+
504
+ :host(.pami-list-item--3-line) .pami-list-item__leading {
505
+ align-self: flex-start;
506
+ /* Leading icon top padding = 12px on ≥88px rows per the M3 spec.
507
+ The row already provides padding-block: 12px when 3-line, so the
508
+ leading wrapper doesn't add anything on top — it just pins to
509
+ flex-start so the row's padding is the only offset. */
510
+ }
511
+
512
+ /* …but an AVATAR centres instead. The flex-start above is the spec rule for a
513
+ 24px leading ICON, which reads as aligned to the first text line. A 40px
514
+ avatar is a much heavier object and pinning it to the top of an 88px row
515
+ leaves it visibly high — measured 12px above the row's centre. Icons keep the
516
+ spec behaviour; only avatars change.
517
+
518
+ Keyed off the existing `--with-avatar` host class rather than `:has()`, which
519
+ the host already sets for the `leading-avatar*` props. */
520
+ :host(.pami-list-item--3-line.pami-list-item--with-avatar) .pami-list-item__leading {
521
+ align-self: center;
522
+ }
523
+
524
+ /* Same, for an avatar the consumer SLOTS rather than passing as a prop — that
525
+ one lives in the light tree, so it has to be tested on the host. Kept as its
526
+ own rule on purpose: `:has()` inside `:host()` is not universally parsed, and
527
+ in a shared selector list one unparsable selector invalidates the whole rule,
528
+ which would silently take the prop-driven case above down with it. */
529
+ :host(.pami-list-item--3-line:has(pami-avatar[slot='leading'])) .pami-list-item__leading {
530
+ align-self: center;
531
+ }
532
+
533
+ /* 3-line rows: stack the trailing cluster vertically, full row height,
534
+ pinned to the inline-end edge (fully right). The trailing supporting
535
+ text (e.g. a timestamp) sits at the top while the trailing icon/action
536
+ (e.g. a star) is vertically centred in the remaining space via auto
537
+ block margins — so the star reads as middle-right of the row. */
538
+ :host(.pami-list-item--3-line) .pami-list-item__trailing {
539
+ align-self: stretch;
540
+ flex-direction: column;
541
+ align-items: flex-end;
542
+ justify-content: flex-start;
543
+ gap: 0;
544
+ }
545
+
546
+ :host(.pami-list-item--3-line) .pami-list-item__trailing-icon {
547
+ margin-block: auto;
548
+ }
549
+
550
+ /* ==========================================================
551
+ 3. EXPRESSIVE LIST-STYLES — inherited from
552
+ pami-list[list-style="standard"] and pami-list[list-style="segmented"].
553
+
554
+ Both Expressive variants tighten the leading + trailing icons from
555
+ 24px (baseline token) to 20px (Expressive token) and round the
556
+ leading image thumbnail from sharp corners to corner-small (8px).
557
+ The `--pami-list-item-*-expressive-*` props are the user-overrideable
558
+ inputs; the rule simply re-binds the internal slots so the rest of
559
+ the CSS keeps referring to the canonical
560
+ `--_leading-icon-size` / `--_trailing-icon-size` / `--_leading-image-shape`
561
+ without per-style branching.
562
+ ========================================================== */
563
+ :host-context(.pami-list--standard),
564
+ :host-context(.pami-list--segmented) {
565
+ --_leading-icon-size: var(--pami-list-item-leading-icon-size, var(--_leading-icon-expressive-size));
566
+ --_trailing-icon-size: var(--pami-list-item-trailing-icon-size, var(--_trailing-icon-expressive-size));
567
+ --_leading-image-shape: var(--pami-list-item-leading-image-shape, var(--_leading-image-expressive-shape));
568
+ }
569
+
570
+ /* Standard connected list — first / last row corner rounding at rest.
571
+ pami-list also threads per-corner custom properties via ::slotted(); we
572
+ mirror the same radii here with :host(:first-of-type|:last-of-type)
573
+ so resting corners paint reliably from inside the shadow boundary.
574
+ Uses .pami-list--standard (always on the host class map) rather than
575
+ the list-style attribute, which is not reflected. Middle rows keep
576
+ 0px on internal edges via the --_container-shape default. */
577
+ :host-context(.pami-list--standard):host(:first-of-type) {
578
+ --pami-list-item-container-shape-start-start: var(--md-sys-shape-corner-large, 16px);
579
+ --pami-list-item-container-shape-start-end: var(--md-sys-shape-corner-large, 16px);
580
+ }
581
+
582
+ :host-context(.pami-list--standard):host(:last-of-type) {
583
+ --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
584
+ --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
585
+ }
586
+
587
+ :host-context(.pami-list--standard):host(:only-of-type) {
588
+ --pami-list-item-container-shape-start-start: var(--md-sys-shape-corner-large, 16px);
589
+ --pami-list-item-container-shape-start-end: var(--md-sys-shape-corner-large, 16px);
590
+ --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
591
+ --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
592
+ }
593
+
594
+ /* Expandable rows that are open hand their bottom corners to the last child
595
+ row in the panel so the connected chassis continues as one flat stack. */
596
+ :host(.pami-list-item--expandable.pami-list-item--expanded) {
597
+ --pami-list-item-container-shape-end-start: 0px;
598
+ --pami-list-item-container-shape-end-end: 0px;
599
+ }
600
+
601
+ /* Segmented adds the rounded-tile container shape on top of the
602
+ shared Expressive icon/image overrides above. The container colour
603
+ already falls through to the `:host` default (surface = the M3
604
+ `list-item-segmented-container-color` token), so re-declaring it
605
+ here would lift the cascade specificity of `:host-context()` above
606
+ `:host(.pami-list-item--selected)` and stop the selected-state tint
607
+ from painting. Authors can still re-tint the bay via
608
+ `--pami-list-item-container-color` on the row or list. */
609
+ :host-context(.pami-list--segmented) {
610
+ --_container-shape: var(--pami-list-item-container-shape, var(--md-sys-shape-corner-extra-small, 4px));
611
+ }
612
+
613
+ /* Segmented connected stack — first / last row corner emphasis at rest.
614
+ Tiles keep corner-extra-small (4px) on internal edges; the first row
615
+ lifts its top corners and the last row lifts its bottom corners to
616
+ corner-large (16px) so the separated stack reads as one grouped chassis
617
+ (mirrors standard list first/last treatment). Middle rows stay 4px
618
+ on all four corners. */
619
+ :host-context(.pami-list--segmented):host(:first-of-type) {
620
+ --pami-list-item-container-shape-start-start: var(--md-sys-shape-corner-large, 16px);
621
+ --pami-list-item-container-shape-start-end: var(--md-sys-shape-corner-large, 16px);
622
+ }
623
+
624
+ :host-context(.pami-list--segmented):host(:last-of-type) {
625
+ --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
626
+ --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
627
+ }
628
+
629
+ :host-context(.pami-list--segmented):host(:only-of-type) {
630
+ --pami-list-item-container-shape-start-start: var(--md-sys-shape-corner-large, 16px);
631
+ --pami-list-item-container-shape-start-end: var(--md-sys-shape-corner-large, 16px);
632
+ --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
633
+ --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
634
+ }
635
+
636
+ /* ==========================================================
637
+ 4. STATE LAYER (interactive rows only)
638
+ ========================================================== */
639
+ .pami-list-item__state-layer {
640
+ position: absolute;
641
+ inset: 0;
642
+ /* Match the row's (possibly morphed) corner radius so the overlay clips to
643
+ the rounded chassis even if a consumer lifts the row out of flow during a
644
+ drag and an ancestor's overflow no longer does the clipping for us. */
645
+ border-radius: inherit;
646
+ background: var(--md-sys-pari-glow);
647
+ opacity: 0;
648
+ transition: opacity var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
649
+ pointer-events: none;
650
+ }
651
+
652
+ :host(.pami-list-item--interactive) .pami-list-item__row:hover .pami-list-item__state-layer {
653
+ opacity: var(--_hover-state-layer-opacity);
654
+ }
655
+
656
+ :host(.pami-list-item--interactive:focus-visible) .pami-list-item__state-layer,
657
+ :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)) .pami-list-item__state-layer {
658
+ opacity: var(--_focus-state-layer-opacity);
659
+ }
660
+
661
+ /* Inner-primary keyboard focus. The row uses no delegatesFocus (that broke
662
+ focusable option-row hosts), so keyboard focus lands on the inner primary and
663
+ the host does NOT match :focus-visible — :has() drives the chassis focus
664
+ feedback for button / link / menuitem rows instead. */
665
+ :host(.pami-list-item--interactive:has(.pami-list-item__primary:focus-visible)) .pami-list-item__state-layer {
666
+ opacity: var(--_focus-state-layer-opacity);
667
+ }
668
+
669
+ :host(.pami-list-item--interactive) .pami-list-item__row:active .pami-list-item__state-layer,
670
+ :host(.pami-list-item--pressed) .pami-list-item__state-layer {
671
+ opacity: var(--_pressed-state-layer-opacity);
672
+ }
673
+
674
+ /* Dragged is an app-driven state — toggle `.pami-list-item--dragged` on the
675
+ host (e.g. from a reorderable drag wrapper) to get the spec's 16% state
676
+ layer, corner-large morph, and a level-4 elevation lift so the tile
677
+ visually detaches from its neighbours. z-index keeps the shadow above
678
+ sibling rows that haven't scrolled past. */
679
+ :host(.pami-list-item--dragged) .pami-list-item__state-layer {
680
+ opacity: var(--_dragged-state-layer-opacity);
681
+ }
682
+
683
+ /* While dragged, the M3 affordance is the steady 16 % state layer (above) plus
684
+ the elevation lift — NOT an active press ripple. Suppress the ripple wave so
685
+ it can't sit as an oversized circle near the press point (e.g. the trailing
686
+ drag handle the user grabbed) for the whole drag, which previously read as a
687
+ large blob overlapping the handle. */
688
+ :host(.pami-list-item--dragged) pami-ripple {
689
+ display: none;
690
+ }
691
+
692
+ :host(.pami-list-item--dragged) {
693
+ box-shadow: var(--_dragged-container-elevation);
694
+ z-index: 1;
695
+ }
696
+
697
+ /* ==========================================================
698
+ 5. FOCUS RING
699
+ Inset box-shadow on :host — paints inside the border-box so
700
+ parent overflow (pami-list overflow:clip, story wrappers with
701
+ overflow:hidden, stacked connected rows) cannot clip the ring.
702
+ Outward host outlines + outline-offset extended past the chassis
703
+ and lost pixels at the top edge of first rows. Row-level inset
704
+ rings were still clipped by :host { overflow: clip } and
705
+ .pami-list-item__row { overflow: hidden }. z-index keeps dragged
706
+ elevation shadows above neighbours when both apply.
707
+ ========================================================== */
708
+ :host(.pami-list-item--interactive:focus-visible),
709
+ :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)) {
710
+ box-shadow: inset 0 0 0 var(--md-sys-state-focus-ring-width, 2px) var(--md-sys-color-focus-ring, var(--md-sys-color-secondary));
711
+ outline: none;
712
+ z-index: 1;
713
+ }
714
+
715
+ /* Chassis focus ring when the inner primary holds keyboard focus (the host
716
+ itself isn't focused for button / link / menuitem rows — see the state-layer
717
+ note above). Kept on the host so the ring hugs the chassis edge, not the
718
+ padding-inset primary. */
719
+ :host(.pami-list-item--interactive:has(.pami-list-item__primary:focus-visible)) {
720
+ box-shadow: inset 0 0 0 var(--md-sys-state-focus-ring-width, 2px) var(--md-sys-color-focus-ring, var(--md-sys-color-secondary));
721
+ outline: none;
722
+ z-index: 1;
723
+ }
724
+
725
+ :host(.pami-list-item--dragged:focus-visible) {
726
+ box-shadow:
727
+ var(--_dragged-container-elevation),
728
+ inset 0 0 0 3px var(--md-sys-color-focus-ring, #513018);
729
+ }
730
+
731
+ /* ==========================================================
732
+ 5b. ACTIVE-STATE SHAPE MORPH (M3 Lists spec)
733
+ Per https://m3.material.io/components/lists/specs, the list-item
734
+ morphs from its resting shape into a state-specific corner radius:
735
+
736
+ Hover → no default morph (state layer only)
737
+ Focus → 16px (corner-large)
738
+ Pressed → 16px (corner-large)
739
+ Selected → 16px (corner-large)
740
+ Dragged → 16px (corner-large)
741
+
742
+ Applied on focus / selected / pressed / dragged — NOT hover. Hover
743
+ uses the state layer only; morphing corners on hover made flat middle
744
+ rows round to 16px then snap back to sharp on mouse-out. Even with
745
+ border-radius transitions removed, the fading state layer made that
746
+ snap read as an animated corner morph.
747
+
748
+ Coverage:
749
+ - focus / selected / pressed / dragged on standard rows
750
+ - standard first / last edge corners — focus would otherwise SHRINK
751
+ below resting 16px; clamped via max()
752
+ - segmented tiles (resting 4px) — focus morphs up to corner-large;
753
+ clamped via max()
754
+ - grouped first / middle / last rows — morph that lifts out of the
755
+ shared chassis
756
+
757
+ Each corner is computed as `max(resting, active)` so an interaction
758
+ can only ever round a corner further — never sharpen one.
759
+
760
+ Border-radius animates on shape-morph states only (focus / selected /
761
+ pressed / dragged) via the logical-corner transitions on :host and
762
+ .pami-list-item__row. Hover does not change border-radius, so pointer-
763
+ over stays state-layer-only with no corner morph on hover-out. The
764
+ focus ring (Section 5 inset box-shadow) follows the morphed host
765
+ border-radius on :host.
766
+
767
+ Asymmetric M3 Expressive timing (mirrors pami-button / pami-icon-button):
768
+ Enter / settle : medium4 (400ms) + emphasized-decelerate — base :host
769
+ Exit / release : short4 (200ms) + standard — active states
770
+
771
+ Rule order matters: when multiple states are simultaneously true
772
+ (e.g. selected + focused, pressed + selected), the LATER rule in
773
+ source order wins on equal specificity. Priority climbs
774
+ focus → selected → pressed/dragged.
775
+
776
+ Authors can override per-state (--pami-list-item-{state}-container-shape)
777
+ or globally (--pami-list-item-active-container-shape). To restore hover
778
+ rounding, set --pami-list-item-hover-container-shape and add a :hover
779
+ rule in app CSS.
780
+ ========================================================== */
781
+ /* Shape morph exit timing — applied on active states so release snaps
782
+ back with short4 + standard while press-in uses the base medium4 +
783
+ emphasized-decelerate curve (CSS uses the pre-change transition). */
784
+ :host(.pami-list-item--interactive:focus-visible),
785
+ :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)),
786
+ :host(.pami-list-item--selected),
787
+ :host(.pami-list-item--interactive:active),
788
+ :host(.pami-list-item--pressed),
789
+ :host(.pami-list-item--dragged) {
790
+ transition:
791
+ box-shadow var(--md-sys-motion-duration-short2, 100ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
792
+ border-start-start-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
793
+ border-start-end-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
794
+ border-end-start-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
795
+ border-end-end-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
796
+ }
797
+
798
+ :host(.pami-list-item--interactive:focus-visible) .pami-list-item__row,
799
+ :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)) .pami-list-item__row,
800
+ :host(.pami-list-item--selected) .pami-list-item__row,
801
+ :host(.pami-list-item--interactive:active) .pami-list-item__row,
802
+ :host(.pami-list-item--pressed) .pami-list-item__row,
803
+ :host(.pami-list-item--dragged) .pami-list-item__row {
804
+ transition:
805
+ border-start-start-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
806
+ border-start-end-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
807
+ border-end-start-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
808
+ border-end-end-radius var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
809
+ }
810
+
811
+ :host(.pami-list-item--interactive:focus-visible),
812
+ :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)),
813
+ :host(.pami-list-item--interactive:focus-visible) .pami-list-item__row,
814
+ :host(.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)) .pami-list-item__row {
815
+ border-start-start-radius: max(var(--_container-shape-start-start), var(--_focus-container-shape));
816
+ border-start-end-radius: max(var(--_container-shape-start-end), var(--_focus-container-shape));
817
+ border-end-start-radius: max(var(--_container-shape-end-start), var(--_focus-container-shape));
818
+ border-end-end-radius: max(var(--_container-shape-end-end), var(--_focus-container-shape));
819
+ }
820
+
821
+ :host(.pami-list-item--selected),
822
+ :host(.pami-list-item--selected) .pami-list-item__row {
823
+ border-start-start-radius: max(var(--_container-shape-start-start), var(--_selected-container-shape));
824
+ border-start-end-radius: max(var(--_container-shape-start-end), var(--_selected-container-shape));
825
+ border-end-start-radius: max(var(--_container-shape-end-start), var(--_selected-container-shape));
826
+ border-end-end-radius: max(var(--_container-shape-end-end), var(--_selected-container-shape));
827
+ }
828
+
829
+ :host(.pami-list-item--interactive:active),
830
+ :host(.pami-list-item--pressed),
831
+ :host(.pami-list-item--dragged),
832
+ :host(.pami-list-item--interactive:active) .pami-list-item__row,
833
+ :host(.pami-list-item--pressed) .pami-list-item__row,
834
+ :host(.pami-list-item--dragged) .pami-list-item__row {
835
+ border-start-start-radius: max(var(--_container-shape-start-start), var(--_pressed-container-shape));
836
+ border-start-end-radius: max(var(--_container-shape-start-end), var(--_pressed-container-shape));
837
+ border-end-start-radius: max(var(--_container-shape-end-start), var(--_pressed-container-shape));
838
+ border-end-end-radius: max(var(--_container-shape-end-end), var(--_pressed-container-shape));
839
+ }
840
+
841
+ /* Dragged supersedes its own pressed default but inherits visually. */
842
+ :host(.pami-list-item--dragged),
843
+ :host(.pami-list-item--dragged) .pami-list-item__row {
844
+ border-start-start-radius: max(var(--_container-shape-start-start), var(--_dragged-container-shape));
845
+ border-start-end-radius: max(var(--_container-shape-start-end), var(--_dragged-container-shape));
846
+ border-end-start-radius: max(var(--_container-shape-end-start), var(--_dragged-container-shape));
847
+ border-end-end-radius: max(var(--_container-shape-end-end), var(--_dragged-container-shape));
848
+ }
849
+
850
+ /* ==========================================================
851
+ 6. SELECTED STATE
852
+ When a row is selected we tint the container and remap the
853
+ text/icon colors onto the selection palette (tertiary-container /
854
+ on-tertiary-container in the Pami palette).
855
+ ========================================================== */
856
+ :host(.pami-list-item--selected) {
857
+ --_container-color: var(--_selected-container-color);
858
+ --_label-text-color: var(--_selected-label-text-color);
859
+ --_supporting-text-color: var(--_selected-label-text-color);
860
+ --_overline-color: var(--_selected-label-text-color);
861
+ --_leading-icon-color: var(--_selected-label-text-color);
862
+ --_trailing-icon-color: var(--_selected-label-text-color);
863
+ --_trailing-supporting-text-color: var(--_selected-label-text-color);
864
+ --_state-layer-color: var(--_selected-label-text-color);
865
+ --_expand-chevron-color: var(--_selected-label-text-color);
866
+ }
867
+
868
+ /* ==========================================================
869
+ 6b. SELECTION-MODE UNSELECTED TRAILING ICON
870
+ Per the M3 token spec a row in a `selection-mode` list that is NOT
871
+ selected swaps its trailing icon to on-surface (#1D1B20) so the
872
+ tap-to-select affordance (checkbox/radio glyph) reads at full
873
+ contrast. The leading icon stays on-surface-variant.
874
+ ========================================================== */
875
+ :host(.pami-list-item--selection-mode:not(.pami-list-item--selected)) {
876
+ --_trailing-icon-color: var(--_unselected-trailing-icon-color);
877
+ }
878
+
879
+ /* ==========================================================
880
+ 6c. SELECTED + ACTIVE-STATE ICON SHIFT
881
+ Per the M3 Lists spec, a selected row in an active interaction
882
+ (hover / focus / pressed / dragged) shifts its leading + trailing
883
+ icons from on-tertiary-container (#4A4458) up to on-surface
884
+ (#1D1B20) for the duration of the interaction so the affordance
885
+ reads slightly louder under the cursor. The selected resting label
886
+ colour stays on-tertiary-container.
887
+ ========================================================== */
888
+ :host(.pami-list-item--selected.pami-list-item--interactive:hover),
889
+ :host(.pami-list-item--selected.pami-list-item--interactive:focus-visible),
890
+ :host(.pami-list-item--selected.pami-list-item--interactive.pami-list-item--roving-focus-visible:not(:focus)),
891
+ :host(.pami-list-item--selected.pami-list-item--interactive:active),
892
+ :host(.pami-list-item--selected.pami-list-item--pressed),
893
+ :host(.pami-list-item--selected.pami-list-item--dragged) {
894
+ --_leading-icon-color: var(--_selected-active-icon-color);
895
+ --_trailing-icon-color: var(--_selected-active-icon-color);
896
+ }
897
+
898
+ /* 6d. EXPANDABLE DISCLOSURE TRIGGERS — never list-selection targets.
899
+ Only flat child rows in `expanded-content` may carry selection tint.
900
+ Wins over §6 / §6c when a stale handler sets `selected` on the parent. */
901
+ :host(.pami-list-item--expandable),
902
+ :host(.pami-list-item--expandable[selected]),
903
+ :host(.pami-list-item--expandable.pami-list-item--selected),
904
+ :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--interactive:hover),
905
+ :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--interactive:focus-visible),
906
+ :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--interactive:active),
907
+ :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--pressed),
908
+ :host(.pami-list-item--expandable.pami-list-item--selected.pami-list-item--dragged) {
909
+ --_container-color: var(--pami-list-item-container-color, var(--md-sys-color-surface, #fef7ff));
910
+ --_label-text-color: var(--pami-list-item-label-text-color, var(--md-sys-color-on-surface, #1c1b1f));
911
+ --_supporting-text-color: var(--pami-list-item-supporting-text-color, var(--md-sys-color-on-surface-variant, #49454f));
912
+ --_overline-color: var(--pami-list-item-overline-color, var(--md-sys-color-on-surface-variant, #49454f));
913
+ --_leading-icon-color: var(--pami-list-item-leading-icon-color, var(--md-sys-color-on-surface-variant, #49454f));
914
+ --_trailing-icon-color: var(--pami-list-item-trailing-icon-color, var(--md-sys-color-on-surface-variant, #49454f));
915
+ --_trailing-supporting-text-color: var(
916
+ --pami-list-item-trailing-supporting-text-color,
917
+ var(--md-sys-color-on-surface-variant, #49454f)
918
+ );
919
+ --_state-layer-color: var(--md-sys-color-on-surface, #1c1b1f);
920
+ --_expand-chevron-color: var(--pami-list-item-expand-chevron-color, var(--md-sys-color-on-surface-variant, #49454f));
921
+ }
922
+
923
+ :host(.pami-list-item--expandable.pami-list-item--selected),
924
+ :host(.pami-list-item--expandable.pami-list-item--selected) .pami-list-item__row {
925
+ border-start-start-radius: var(--_container-shape-start-start);
926
+ border-start-end-radius: var(--_container-shape-start-end);
927
+ border-end-start-radius: var(--_container-shape-end-start);
928
+ border-end-end-radius: var(--_container-shape-end-end);
929
+ }
930
+
931
+ /* ==========================================================
932
+ 7. DISABLED STATE
933
+ ========================================================== */
934
+ :host(.pami-list-item--disabled) {
935
+ cursor: default;
936
+ pointer-events: none;
937
+ --_label-text-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
938
+ --_supporting-text-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
939
+ --_overline-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
940
+ --_leading-icon-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
941
+ --_trailing-icon-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
942
+ --_trailing-supporting-text-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
943
+ --_expand-chevron-color: color-mix(in srgb, var(--md-sys-color-on-surface, #1c1b1f) calc(var(--md-sys-state-disabled-content-opacity, 0.38) * 100%), transparent);
944
+ }
945
+
946
+ :host(.pami-list-item--disabled) .pami-list-item__state-layer {
947
+ opacity: var(--_disabled-state-layer-opacity);
948
+ }
949
+
950
+ /* When a row is BOTH selected AND disabled, the M3 spec collapses the
951
+ tertiary-container fill to a faint on-surface @ 12% wash and lets the
952
+ disabled content opacity (0.38) carry the "frozen" cue. Authors can
953
+ override via --pami-list-item-selected-disabled-container-color. */
954
+ :host(.pami-list-item--selected.pami-list-item--disabled) {
955
+ --_container-color: var(--_selected-disabled-container-color);
956
+ }
957
+
958
+ /* Soft-disabled: same disabled visuals but remains focusable.
959
+ Overrides the hard-disabled pointer-events:none so keyboard users
960
+ can still discover the row and hear aria-disabled="true". */
961
+ :host([soft-disabled]) {
962
+ pointer-events: auto;
963
+ }
964
+
965
+ :host([soft-disabled]) .pami-list-item__row {
966
+ cursor: default;
967
+ }
968
+
969
+ :host([soft-disabled]) .pami-list-item__state-layer {
970
+ display: none;
971
+ }
972
+
973
+ /* ==========================================================
974
+ 8. LEADING SLOT — icon (18px), avatar (40px), image (56px)
975
+ ========================================================== */
976
+ .pami-list-item__leading {
977
+ display: flex;
978
+ align-items: center;
979
+ justify-content: center;
980
+ flex-shrink: 0;
981
+ min-inline-size: 24px;
982
+ color: var(--_leading-icon-color);
983
+ }
984
+
985
+ /* Hide empty wrappers for slots that ARE always rendered (so the
986
+ * slot elements stay queryable + slotchange listeners always wire).
987
+ * `.pami-list-item__trailing` is intentionally NOT in this list — the
988
+ * trailing wrapper is omitted from the DOM entirely when empty (see
989
+ * `renderTrailing` + `detectSlottedFromLightDom` in pami-list-item.tsx). */
990
+ .pami-list-item__leading--empty,
991
+ .pami-list-item__overline--empty,
992
+ .pami-list-item__supporting-text--empty,
993
+ .pami-list-item__trailing-text--empty {
994
+ display: none;
995
+ }
996
+
997
+ /* Lucide leading icon — per the M3 expansion list spec the parent
998
+ row's leading icon fills (FILL axis → 1) while expanded. Child rows in
999
+ `expanded-content` are separate hosts and keep their own resting icon. */
1000
+ .pami-list-item__icon {
1001
+ font-size: var(--_leading-icon-size);
1002
+ inline-size: var(--_leading-icon-size);
1003
+ block-size: var(--_leading-icon-size);
1004
+ line-height: 1;
1005
+ color: var(--_leading-icon-color);
1006
+ transition: font-variation-settings var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
1007
+ }
1008
+
1009
+ :host(.pami-list-item--expanded) .pami-list-item__icon {
1010
+ }
1011
+
1012
+ /* The leading avatar is now an internal `pami-avatar` component. We forward
1013
+ the list-item's avatar tokens (`--_leading-avatar-*`) to the avatar's
1014
+ public API via CSS custom-property inheritance so authors can keep
1015
+ theming the avatar through the list-item without knowing the avatar
1016
+ component exists. */
1017
+ pami-avatar.pami-list-item__avatar {
1018
+ --pami-avatar-size: var(--_leading-avatar-size);
1019
+ --pami-avatar-container-shape: var(--_leading-avatar-shape);
1020
+ /* When the list-item caller did NOT explicitly request name-derived
1021
+ palette colors, fall back to the legacy primary-container tone so
1022
+ existing pages keep their visuals. */
1023
+ --pami-avatar-container-color: var(--_leading-avatar-color);
1024
+ --pami-avatar-label-color: var(--_leading-avatar-label-color);
1025
+ }
1026
+
1027
+ /* Image thumbnail — prop-based `leading-image` wraps the <img> so a
1028
+ selected-state scrim + checkmark circle can overlay the tile per M3. */
1029
+ .pami-list-item__image-wrap {
1030
+ position: relative;
1031
+ display: inline-flex;
1032
+ flex-shrink: 0;
1033
+ inline-size: var(--_leading-image-width);
1034
+ block-size: var(--_leading-image-height);
1035
+ border-radius: var(--_leading-image-shape);
1036
+ overflow: hidden;
1037
+ }
1038
+
1039
+ .pami-list-item__image {
1040
+ inline-size: 100%;
1041
+ block-size: 100%;
1042
+ object-fit: cover;
1043
+ }
1044
+
1045
+ /* Selected thumbnail overlay — scrim fades in; circle scales in with M3
1046
+ emphasized-decelerate (mirrors pami-step check-in). Always `display:flex`
1047
+ so opacity/scale can animate; visibility is driven by opacity, not
1048
+ display:none toggling. */
1049
+ .pami-list-item__image-selection-indicator {
1050
+ position: absolute;
1051
+ inset: 0;
1052
+ display: flex;
1053
+ align-items: center;
1054
+ justify-content: center;
1055
+ background-color: var(--_leading-image-selection-scrim-color);
1056
+ pointer-events: none;
1057
+ opacity: 0;
1058
+ transition: opacity var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
1059
+ }
1060
+
1061
+ :host(.pami-list-item--selected) .pami-list-item__image-selection-indicator {
1062
+ opacity: 1;
1063
+ }
1064
+
1065
+ .pami-list-item__image-selection-circle {
1066
+ display: inline-flex;
1067
+ align-items: center;
1068
+ justify-content: center;
1069
+ flex-shrink: 0;
1070
+ inline-size: var(--_leading-image-selection-icon-size);
1071
+ block-size: var(--_leading-image-selection-icon-size);
1072
+ border-radius: var(--md-sys-shape-corner-full, 9999px);
1073
+ background-color: var(--_leading-image-selection-circle-color);
1074
+ transform: scale(0);
1075
+ opacity: 0;
1076
+ }
1077
+
1078
+ :host(.pami-list-item--selected) .pami-list-item__image-selection-circle {
1079
+ animation: pami-list-item-image-selection-in var(--md-sys-motion-duration-medium2, 250ms)
1080
+ var(--md-sys-motion-easing-emphasized-decelerate, cubic-bezier(0.05, 0.7, 0.1, 1)) both;
1081
+ }
1082
+
1083
+ @keyframes pami-list-item-image-selection-in {
1084
+ 0% {
1085
+ transform: scale(0);
1086
+ opacity: 0;
1087
+ }
1088
+
1089
+ 60% {
1090
+ transform: scale(1.08);
1091
+ opacity: 1;
1092
+ }
1093
+
1094
+ 100% {
1095
+ transform: scale(1);
1096
+ opacity: 1;
1097
+ }
1098
+ }
1099
+
1100
+ /* Outscore the generic `pami-icon { display: inline-block }`
1101
+ rule in Section 11 so the glyph centers inside the 24px circle. */
1102
+ .pami-list-item__image-selection-checkpami-icon {
1103
+ display: inline-flex;
1104
+ align-items: center;
1105
+ justify-content: center;
1106
+ inline-size: calc(var(--_leading-image-selection-icon-size) * 0.667);
1107
+ block-size: calc(var(--_leading-image-selection-icon-size) * 0.667);
1108
+ font-size: calc(var(--_leading-image-selection-icon-size) * 0.667);
1109
+ line-height: 1;
1110
+ color: var(--_leading-image-selection-icon-color);
1111
+ font-weight: normal;
1112
+ }
1113
+
1114
+ /* Slotted leading content inherits color */
1115
+ ::slotted([slot="leading"]) {
1116
+ display: inline-flex;
1117
+ align-items: center;
1118
+ justify-content: center;
1119
+ color: var(--_leading-icon-color);
1120
+ fill: currentColor;
1121
+ }
1122
+
1123
+ /* Direct <video slot="leading"> thumbnail — sized per the M3 leading
1124
+ video tokens (100×56 dp default). For a custom-sized video, override
1125
+ --pami-list-item-leading-video-{width,height,shape} on the host or
1126
+ set width/height inline on the video element. */
1127
+ ::slotted(video[slot="leading"]) {
1128
+ inline-size: var(--_leading-video-width);
1129
+ block-size: var(--_leading-video-height);
1130
+ border-radius: var(--_leading-video-shape);
1131
+ object-fit: cover;
1132
+ }
1133
+
1134
+ /* ==========================================================
1135
+ 9. CONTENT (CENTER) — overline, headline, supporting
1136
+ ========================================================== */
1137
+ .pami-list-item__content {
1138
+ flex: 1;
1139
+ display: flex;
1140
+ flex-direction: column;
1141
+ min-inline-size: 0;
1142
+ overflow: hidden;
1143
+ gap: 0;
1144
+ }
1145
+
1146
+ /* Overline */
1147
+ .pami-list-item__overline {
1148
+ font-family: var(--md-sys-typescale-label-small-font-family, Roboto, sans-serif);
1149
+ font-size: var(--md-sys-typescale-label-small-font-size, 11px);
1150
+ font-weight: var(--md-sys-typescale-label-small-font-weight, 500);
1151
+ line-height: var(--md-sys-typescale-label-small-line-height, 16px);
1152
+ letter-spacing: var(--md-sys-typescale-label-small-letter-spacing, 0.5px);
1153
+ color: var(--_overline-color);
1154
+ contain: inline-size;
1155
+ min-inline-size: 0;
1156
+ text-overflow: ellipsis;
1157
+ overflow: hidden;
1158
+ white-space: nowrap;
1159
+ text-transform: uppercase;
1160
+ transition: none;
1161
+ }
1162
+
1163
+ /* Headline.
1164
+ `display: block` makes the span clip with `text-overflow: ellipsis` even
1165
+ though it is now nested inside the layout-transparent pami-tooltip wrapper
1166
+ (when unwrapped it was blockified as a flex child; inside the wrapper it
1167
+ needs an explicit block box). The wrapper stretches to the content-column
1168
+ width and constrains this span — see section 9b. */
1169
+ .pami-list-item__headline {
1170
+ font-family: var(--_label-text-font);
1171
+ font-size: max(13px, calc(16px + var(--md-sys-density-scale, 0) * 0.5px));
1172
+ font-weight: var(--md-sys-typescale-body-large-font-weight, 400);
1173
+ line-height: max(18px, calc(24px + var(--md-sys-density-scale, 0) * 1px));
1174
+ letter-spacing: var(--md-sys-typescale-body-large-letter-spacing, 0.5px);
1175
+ color: var(--_label-text-color);
1176
+ display: block;
1177
+ contain: inline-size;
1178
+ min-inline-size: 0;
1179
+ max-inline-size: 100%;
1180
+ text-overflow: ellipsis;
1181
+ overflow: hidden;
1182
+ white-space: nowrap;
1183
+ transition: none;
1184
+ }
1185
+
1186
+ /* Supporting */
1187
+ .pami-list-item__supporting-text {
1188
+ font-family: var(--_supporting-text-font);
1189
+ font-size: max(11px, calc(14px + var(--md-sys-density-scale, 0) * 0.5px));
1190
+ font-weight: var(--md-sys-typescale-body-medium-font-weight, 400);
1191
+ line-height: max(16px, calc(20px + var(--md-sys-density-scale, 0) * 1px));
1192
+ letter-spacing: var(--md-sys-typescale-body-medium-letter-spacing, 0.25px);
1193
+ color: var(--_supporting-text-color);
1194
+ display: block;
1195
+ contain: inline-size;
1196
+ min-inline-size: 0;
1197
+ max-inline-size: 100%;
1198
+ text-overflow: ellipsis;
1199
+ overflow: hidden;
1200
+ white-space: nowrap;
1201
+ transition: none;
1202
+ }
1203
+
1204
+ /* 3-line: supporting text wraps up to 2 lines */
1205
+ :host(.pami-list-item--3-line) .pami-list-item__supporting-text {
1206
+ display: -webkit-box;
1207
+ -webkit-line-clamp: 2;
1208
+ -webkit-box-orient: vertical;
1209
+ white-space: normal;
1210
+ }
1211
+
1212
+ /* ==========================================================
1213
+ 9b. TEXT TOOLTIP WRAPPERS
1214
+ The headline + supporting-text spans are ALWAYS wrapped in a stable
1215
+ pami-tooltip (rendered unconditionally — never mounted/unmounted on
1216
+ resize, so there is no DOM-swap flicker). The full text is shown on
1217
+ hover ONLY while the span is actually clipped; the tooltip's
1218
+ `disabled` prop is toggled imperatively from a single debounced
1219
+ ResizeObserver (see applyTooltipToggle in pami-list-item.tsx) so there
1220
+ is no Stencil re-render on resize either.
1221
+
1222
+ The wrapper must be layout-transparent so the inner span's ellipsis
1223
+ math is byte-for-byte what it was unwrapped. We give the tooltip host
1224
+ `display:block; min-inline-size:0; overflow:hidden`: as a column-flex
1225
+ child of `.pami-list-item__content` it stretches to the content-column
1226
+ width (align-items:stretch) and then constrains the inner block span,
1227
+ which keeps `text-overflow: ellipsis` working exactly as before. The
1228
+ `pami-tooltip` + class selector outscores pami-tooltip's own
1229
+ `:host { display: inline-block }` so the block override is
1230
+ deterministic across the shadow boundary. The popup itself is
1231
+ position:fixed and escapes the wrapper's overflow:hidden.
1232
+ ========================================================== */
1233
+ pami-tooltip.pami-list-item__headline-tooltip,
1234
+ pami-tooltip.pami-list-item__supporting-tooltip {
1235
+ display: block;
1236
+ min-inline-size: 0;
1237
+ max-inline-size: 100%;
1238
+ overflow: hidden;
1239
+ /* A touch wider than the 280px plain-tooltip default so long row text
1240
+ is more fully revealed when the tooltip does show. */
1241
+ --pami-tooltip-plain-max-inline-size: 320px;
1242
+ }
1243
+
1244
+ /* Empty supporting text → collapse the whole wrapper, mirroring the
1245
+ legacy `--empty` span behavior (nothing to measure or reveal). */
1246
+ pami-tooltip.pami-list-item__supporting-tooltip--empty {
1247
+ display: none;
1248
+ }
1249
+
1250
+ /* ==========================================================
1251
+ 10. TRAILING SLOT
1252
+ ========================================================== */
1253
+ .pami-list-item__trailing {
1254
+ display: flex;
1255
+ align-items: center;
1256
+ gap: 4px;
1257
+ flex-shrink: 0;
1258
+ color: var(--_trailing-icon-color);
1259
+ }
1260
+
1261
+ /* Trailing supporting text */
1262
+ .pami-list-item__trailing-text {
1263
+ font-family: var(--_trailing-supporting-text-font);
1264
+ font-size: var(--md-sys-typescale-label-small-font-size, 11px);
1265
+ font-weight: var(--md-sys-typescale-label-small-font-weight, 500);
1266
+ line-height: var(--md-sys-typescale-label-small-line-height, 16px);
1267
+ color: var(--_trailing-supporting-text-color);
1268
+ white-space: nowrap;
1269
+ }
1270
+
1271
+ /* Trailing icon */
1272
+ .pami-list-item__trailing-icon {
1273
+ display: inline-flex;
1274
+ align-items: center;
1275
+ justify-content: center;
1276
+ font-size: var(--_trailing-icon-size);
1277
+ inline-size: var(--_trailing-icon-size);
1278
+ block-size: var(--_trailing-icon-size);
1279
+ line-height: 1;
1280
+ color: var(--_trailing-icon-color);
1281
+ }
1282
+
1283
+ /* Slotted trailing content — secondary actions keep their own hit targets
1284
+ in multi-action lists (icon buttons, switches, etc.).
1285
+ pami-badge is excluded: it owns container/label colors via --pami-badge-* tokens
1286
+ and must not inherit the row's trailing-icon color (on-surface-variant). */
1287
+ ::slotted([slot="trailing"]:not(pami-badge)) {
1288
+ display: inline-flex;
1289
+ align-items: center;
1290
+ justify-content: center;
1291
+ color: var(--_trailing-icon-color);
1292
+ fill: currentColor;
1293
+ pointer-events: auto;
1294
+ }
1295
+
1296
+ /* pami-badge is authored as an overlay (position:absolute on the host) for
1297
+ icon-button anchors. When slotted directly as trailing list content it
1298
+ must participate in the row flex flow so it vertically centres with the
1299
+ headline instead of painting against the row bottom / divider edge.
1300
+ Color is intentionally omitted — badge owns label/container tokens. */
1301
+ ::slotted(pami-badge[slot="trailing"]) {
1302
+ display: inline-flex;
1303
+ align-items: center;
1304
+ justify-content: center;
1305
+ pointer-events: auto;
1306
+ position: static;
1307
+ inset-block-start: auto;
1308
+ inset-inline-end: auto;
1309
+ transform: none;
1310
+ flex-shrink: 0;
1311
+ }
1312
+
1313
+ /* 3-line rows stack trailing content in a column — centre standalone badges
1314
+ the same way trailing icons get margin-block:auto. */
1315
+ :host(.pami-list-item--3-line) ::slotted(pami-badge[slot="trailing"]) {
1316
+ margin-block: auto;
1317
+ }
1318
+
1319
+ /* ==========================================================
1320
+ 10a2. DRAG HANDLE (reorderable rows)
1321
+ Rendered as the LAST trailing affordance when the parent
1322
+ pami-list is `reorderable`. Grabbing it starts a pointer drag
1323
+ that the parent list turns into a reorder. `touch-action:none`
1324
+ lets the drag work on touch without the page scrolling, and
1325
+ `pointer-events:auto` keeps the handle grabbable even inside a
1326
+ row whose body is the primary click target.
1327
+
1328
+ The selector intentionally doubles up the `pami-icon`
1329
+ class (which the handle also carries for its glyph font) so this rule
1330
+ outscores the generic `pami-icon { pointer-events: none }`
1331
+ in Section 11. With equal single-class specificity that later rule would
1332
+ otherwise win on source order and make the handle non-hittable — the
1333
+ pointer would fall through to the row, `pointerdown`'s composedPath would
1334
+ never include the handle, and the drag would never start. */
1335
+ .pami-list-item__drag-handlepami-icon {
1336
+ /* Visual parity with pami-accordion-item's drag handle: a 24px box holding a
1337
+ 22px `drag_indicator` glyph that rests at on-surface-variant / 0.55 opacity
1338
+ and lifts to full opacity + a subtle scale on hover. */
1339
+ display: inline-flex;
1340
+ align-items: center;
1341
+ justify-content: center;
1342
+ inline-size: 24px;
1343
+ block-size: 24px;
1344
+ flex-shrink: 0;
1345
+ font-size: 22px;
1346
+ line-height: 1;
1347
+ color: var(--_trailing-icon-color);
1348
+ opacity: 0.55;
1349
+ cursor: grab;
1350
+ touch-action: none;
1351
+ pointer-events: auto;
1352
+ transition:
1353
+ opacity var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1)),
1354
+ transform var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-emphasized, cubic-bezier(0.2, 0, 0, 1)),
1355
+ color var(--md-sys-motion-duration-short3, 150ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
1356
+ }
1357
+
1358
+ .pami-list-item__drag-handlepami-icon:hover {
1359
+ opacity: 1;
1360
+ color: var(--md-sys-color-on-surface, #1c1b1f);
1361
+ transform: scale(1.08);
1362
+ }
1363
+
1364
+ .pami-list-item__drag-handlepami-icon:active {
1365
+ cursor: grabbing;
1366
+ }
1367
+
1368
+ :host(.pami-list-item--dragged) .pami-list-item__drag-handle {
1369
+ opacity: 1;
1370
+ color: var(--md-sys-color-on-surface, #1c1b1f);
1371
+ cursor: grabbing;
1372
+ }
1373
+
1374
+ /* Siblings of the dragged row glide into their new slot. The dragged row
1375
+ itself is NOT given this class, so its pointer-follow transform stays
1376
+ instant (no lag). */
1377
+ :host(.pami-list-item--shifting) {
1378
+ transition: transform var(--md-sys-motion-duration-short4, 200ms) var(--md-sys-motion-easing-standard, cubic-bezier(0.2, 0, 0, 1));
1379
+ will-change: transform;
1380
+ }
1381
+
1382
+ /* ==========================================================
1383
+ 10b. EXPAND CARET (pami-icon-button)
1384
+ The disclosure control is now an pami-icon-button rendered as
1385
+ the LAST child of the trailing slot when the row is
1386
+ `expandable`. It carries aria-expanded / aria-controls, gets
1387
+ the icon-button's pill/squircle shape morph when selected
1388
+ (expanded), and its `expand_more` glyph rotates 180° (points
1389
+ up) when expanded — animated through the ::part(icon) it
1390
+ forwards.
1391
+ ========================================================== */
1392
+ .pami-list-item__expand-button {
1393
+ flex-shrink: 0;
1394
+ /* xs (32px) fits the 56px row chassis — sm (40px) + 8/10 padding overshoots
1395
+ min-block-size and makes the trigger look taller than child rows. */
1396
+ --pami-icon-button-container-width: var(--pami-list-item-expand-button-size, 32px);
1397
+ --pami-icon-button-container-height: var(--pami-list-item-expand-button-size, 32px);
1398
+ --pami-icon-button-icon-size: var(--pami-list-item-expand-chevron-size, 24px);
1399
+ --pami-icon-button-icon-color: var(--_expand-chevron-color);
1400
+ --pami-icon-button-state-layer-color: var(--_expand-chevron-color);
1401
+ margin-inline-end: -4px;
1402
+ }
1403
+
1404
+ /* Expanded: MD3 expansion-list active pill — narrow vertical squircle, primary
1405
+ container fill, on-primary chevron (points up via rotation). */
1406
+ .pami-list-item__expand-button--expanded {
1407
+ --pami-icon-button-container-color: var(--md-sys-color-primary, #6750a4);
1408
+ --pami-icon-button-icon-color: var(--md-sys-color-on-primary, #ffffff);
1409
+ --pami-icon-button-state-layer-color: var(--md-sys-color-on-primary, #ffffff);
1410
+ --pami-icon-button-outline-color: transparent;
1411
+ }
1412
+
1413
+ /* Rotate the caret glyph. We reach into the icon-button's forwarded
1414
+ `icon` part — ::part pierces exactly one shadow level, which is the
1415
+ pami-icon-button living in this row's shadow tree. */
1416
+ .pami-list-item__expand-button::part(icon) {
1417
+ transition: transform var(--md-sys-motion-duration-medium2, 250ms) var(--md-sys-motion-easing-emphasized, cubic-bezier(0.2, 0, 0, 1));
1418
+ transform-origin: center;
1419
+ }
1420
+
1421
+ .pami-list-item__expand-button--expanded::part(icon) {
1422
+ transform: rotate(180deg);
1423
+ }
1424
+
1425
+ /* ==========================================================
1426
+ 10c. EXPANDED PANEL — MD3 expressive open / retract
1427
+ Single-level reveal: the panel animates height via the modern
1428
+ `grid-template-rows: 0fr ↔ 1fr` trick PLUS an opacity fade and
1429
+ a small inner translateY so the content "arches" down into
1430
+ place on open and retracts on close. Open uses
1431
+ emphasized-decelerate (settle), close uses emphasized-accelerate
1432
+ (clear out) — asymmetric M3 Expressive motion. The inner
1433
+ wrapper carries the padding so the grid can collapse cleanly.
1434
+ ========================================================== */
1435
+ .pami-list-item__expanded-panel {
1436
+ display: grid;
1437
+ grid-template-rows: 0fr;
1438
+ opacity: 0;
1439
+ background-color: var(--_expanded-panel-background);
1440
+ transition:
1441
+ grid-template-rows var(--_collapse-duration) var(--_collapse-easing),
1442
+ opacity var(--_collapse-duration) var(--_collapse-easing);
1443
+ }
1444
+
1445
+ :host(.pami-list-item--expanded) .pami-list-item__expanded-panel {
1446
+ grid-template-rows: 1fr;
1447
+ opacity: 1;
1448
+ transition:
1449
+ grid-template-rows var(--_expand-duration) var(--_expand-easing),
1450
+ opacity var(--_expand-duration) var(--_expand-easing);
1451
+ }
1452
+
1453
+ .pami-list-item__expanded-panel-inner {
1454
+ min-block-size: 0;
1455
+ overflow: hidden;
1456
+ /* Child motion coordinated with the parent height/opacity — the content
1457
+ starts lifted and arcs down into its resting position on open. */
1458
+ transform: translateY(-8px);
1459
+ transition: transform var(--_collapse-duration) var(--_collapse-easing);
1460
+ padding-block: var(--_expanded-panel-padding-block);
1461
+ padding-inline-start: var(--_expanded-panel-padding-inline-start);
1462
+ padding-inline-end: var(--_expanded-panel-padding-inline);
1463
+ }
1464
+
1465
+ :host(.pami-list-item--expanded) .pami-list-item__expanded-panel-inner {
1466
+ transform: translateY(0);
1467
+ transition: transform var(--_expand-duration) var(--_expand-easing);
1468
+ }
1469
+
1470
+ /* Flat expansion list — child rows are full-width sibling list items, not a
1471
+ nested sub-box. Sharp corners on every child; the last child inherits the
1472
+ expandable group's bottom rounding when this row is the list's last item. */
1473
+ :host(.pami-list-item--expandable) ::slotted(pami-list-item[slot="expanded-content"]) {
1474
+ --pami-list-item-container-shape: 0px;
1475
+ --pami-list-item-container-shape-start-start: 0px;
1476
+ --pami-list-item-container-shape-start-end: 0px;
1477
+ --pami-list-item-container-shape-end-start: 0px;
1478
+ --pami-list-item-container-shape-end-end: 0px;
1479
+ display: block;
1480
+ inline-size: 100%;
1481
+ box-sizing: border-box;
1482
+ }
1483
+
1484
+ :host-context(.pami-list--standard):host(:last-of-type.pami-list-item--expanded) ::slotted(pami-list-item[slot="expanded-content"]:last-of-type),
1485
+ :host-context(.pami-list--segmented):host(:last-of-type.pami-list-item--expanded) ::slotted(pami-list-item[slot="expanded-content"]:last-of-type) {
1486
+ --pami-list-item-container-shape-end-start: var(--md-sys-shape-corner-large, 16px);
1487
+ --pami-list-item-container-shape-end-end: var(--md-sys-shape-corner-large, 16px);
1488
+ }
1489
+
1490
+ /* Dividers between child rows slot inline with the connected chassis. */
1491
+ ::slotted(pami-divider[slot="expanded-content"]) {
1492
+ display: block;
1493
+ }
1494
+
1495
+ ::slotted([slot="expanded-content"]) {
1496
+ display: block;
1497
+ }
1498
+
1499
+ /* When the panel is hidden via [hidden], grid still animates from 0fr
1500
+ so don't collapse the box ourselves. */
1501
+ .pami-list-item__expanded-panel[hidden] {
1502
+ display: grid;
1503
+ }
1504
+
1505
+ /* Reduced motion: snap, don't animate */
1506
+ @media (prefers-reduced-motion: reduce) {
1507
+ :host {
1508
+ transition-property: box-shadow;
1509
+ }
1510
+
1511
+ .pami-list-item__row,
1512
+ .pami-list-item__expanded-panel,
1513
+ .pami-list-item__expanded-panel-inner,
1514
+ .pami-list-item__drag-handle {
1515
+ transition: none;
1516
+ }
1517
+
1518
+ .pami-list-item__drag-handlepami-icon:hover {
1519
+ transform: none;
1520
+ }
1521
+
1522
+ .pami-list-item__expand-button::part(icon) {
1523
+ transition: none;
1524
+ }
1525
+
1526
+ .pami-list-item__image-selection-indicator {
1527
+ transition: none;
1528
+ }
1529
+
1530
+ :host(.pami-list-item--selected) .pami-list-item__image-selection-circle {
1531
+ animation: none;
1532
+ transform: scale(1);
1533
+ opacity: 1;
1534
+ }
1535
+ }
1536
+
1537
+ /* ==========================================================
1538
+ 11. ICON (icon font inside shadow DOM)
1539
+ ========================================================== */
1540
+ pami-icon {
1541
+ font-weight: normal;
1542
+ font-style: normal;
1543
+ line-height: 1;
1544
+ letter-spacing: normal;
1545
+ text-transform: none;
1546
+ display: inline-block;
1547
+ white-space: nowrap;
1548
+ overflow-wrap: normal;
1549
+ direction: ltr;
1550
+ -webkit-font-smoothing: antialiased;
1551
+ pointer-events: none;
1552
+ }
1553
+
1554
+ /* ==========================================================
1555
+ 12. RTL — directional icon mirroring hook
1556
+ Trailing icons that imply direction (chevrons, arrows) can
1557
+ be mirrored at the application level via a class. We do not
1558
+ mirror by default since most trailing icons are non-directional.
1559
+ ========================================================== */
1560
+ :host([dir="rtl"]) .pami-list-item__trailing-icon[data-rtl-mirror],
1561
+ :host-context([dir="rtl"]) .pami-list-item__trailing-icon[data-rtl-mirror] {
1562
+ transform: scaleX(-1);
1563
+ }
1564
+
1565
+ /* ==========================================================
1566
+ 14. IMAGE / AVATAR padding adjustments
1567
+ When a row uses an image thumbnail, the leading slot fills
1568
+ the full 16+56+16 column so the start padding of the host
1569
+ moves onto the image itself.
1570
+ ========================================================== */
1571
+ :host(.pami-list-item--with-image) .pami-list-item__row {
1572
+ padding-inline-start: 16px;
1573
+ }
1574
+
1575
+ /* ==========================================================
1576
+ DENSITY (local override)
1577
+ Maps the local `density` prop onto the same --md-sys-density-scale signal a
1578
+ global `data-density` ancestor sets. Declared on :host, so a local rung wins
1579
+ over the inherited global one. Every density-sensitive value in this file
1580
+ derives from that single signal by calc — never add a fixed per-rung ladder.
1581
+ ========================================================== */
1582
+ :host([density='-1']) { --md-sys-density-scale: -1; }
1583
+ :host([density='-2']) { --md-sys-density-scale: -2; }
1584
+ :host([density='-3']) { --md-sys-density-scale: -3; }
1585
+ :host([density='-4']) { --md-sys-density-scale: -4; }
1586
+
1587
+ /* ==========================================================
1588
+ HIDDEN
1589
+ `[hidden]` is a UA-stylesheet rule, and every `:host` display
1590
+ declaration above is an AUTHOR rule — author origin beats UA, so without
1591
+ this guard `el.hidden = true` left the component fully laid out.
1592
+ `!important` because state rules in this file set `display` at equal or
1593
+ higher specificity than `:host([hidden])`.
1594
+ ========================================================== */
1595
+ :host([hidden]) {
1596
+ display: none !important;
1597
+ }