snice 7.6.0 → 7.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/adapters/react/SniceProvider.js +1 -1
  2. package/adapters/react/SniceRouter.js +1 -1
  3. package/adapters/react/calendar.d.ts +1 -0
  4. package/adapters/react/calendar.d.ts.map +1 -1
  5. package/adapters/react/calendar.js +1 -1
  6. package/adapters/react/calendar.js.map +1 -1
  7. package/adapters/react/calendar.tsx +2 -1
  8. package/adapters/react/matchRoute.js +1 -1
  9. package/adapters/react/useRequestHandler.js +1 -1
  10. package/bin/analyzer-contracts.js +8 -2
  11. package/custom-elements.json +15 -1
  12. package/dist/cdn/accordion/snice-accordion.js +1 -1
  13. package/dist/cdn/action-bar/snice-action-bar.js +1 -1
  14. package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
  15. package/dist/cdn/alert/snice-alert.js +1 -1
  16. package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
  17. package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
  18. package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
  19. package/dist/cdn/availability/snice-availability.js +1 -1
  20. package/dist/cdn/avatar/snice-avatar.js +1 -1
  21. package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
  22. package/dist/cdn/badge/snice-badge.js +1 -1
  23. package/dist/cdn/banner/snice-banner.js +1 -1
  24. package/dist/cdn/binpack/snice-binpack.js +1 -1
  25. package/dist/cdn/book/snice-book.js +1 -1
  26. package/dist/cdn/booking/snice-booking.js +1 -1
  27. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
  28. package/dist/cdn/button/snice-button.js +2 -2
  29. package/dist/cdn/button/snice-button.js.map +1 -1
  30. package/dist/cdn/button/snice-button.min.js +1 -1
  31. package/dist/cdn/button/snice-button.min.js.map +1 -1
  32. package/dist/cdn/calendar/README.md +2 -2
  33. package/dist/cdn/calendar/snice-calendar.js +26 -2
  34. package/dist/cdn/calendar/snice-calendar.js.map +1 -1
  35. package/dist/cdn/calendar/snice-calendar.min.js +2 -2
  36. package/dist/cdn/calendar/snice-calendar.min.js.map +1 -1
  37. package/dist/cdn/camera/snice-camera.js +1 -1
  38. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  39. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  40. package/dist/cdn/card/snice-card.js +1 -1
  41. package/dist/cdn/carousel/snice-carousel.js +1 -1
  42. package/dist/cdn/cart/snice-cart.js +1 -1
  43. package/dist/cdn/chart/snice-chart.js +1 -1
  44. package/dist/cdn/chat/snice-chat.js +1 -1
  45. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  46. package/dist/cdn/chip/snice-chip.js +1 -1
  47. package/dist/cdn/code-block/snice-code-block.js +1 -1
  48. package/dist/cdn/color-display/snice-color-display.js +1 -1
  49. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  50. package/dist/cdn/command-palette/snice-command-palette.js +1 -1
  51. package/dist/cdn/comments/snice-comments.js +1 -1
  52. package/dist/cdn/countdown/snice-countdown.js +1 -1
  53. package/dist/cdn/cropper/snice-cropper.js +1 -1
  54. package/dist/cdn/data-card/snice-data-card.js +1 -1
  55. package/dist/cdn/date-picker/snice-date-picker.js +1 -1
  56. package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
  57. package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
  58. package/dist/cdn/diff/snice-diff.js +1 -1
  59. package/dist/cdn/divider/snice-divider.js +1 -1
  60. package/dist/cdn/doc/snice-doc.js +1 -1
  61. package/dist/cdn/draw/snice-draw.js +1 -1
  62. package/dist/cdn/drawer/snice-drawer.js +1 -1
  63. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  64. package/dist/cdn/estimate/snice-estimate.js +1 -1
  65. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  66. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  67. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  68. package/dist/cdn/flow/snice-flow.js +1 -1
  69. package/dist/cdn/form-layout/snice-form-layout.js +1 -1
  70. package/dist/cdn/funnel/snice-funnel.js +1 -1
  71. package/dist/cdn/gantt/snice-gantt.js +1 -1
  72. package/dist/cdn/gauge/snice-gauge.js +1 -1
  73. package/dist/cdn/grid/snice-grid.js +1 -1
  74. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  75. package/dist/cdn/image/snice-image.js +1 -1
  76. package/dist/cdn/input/snice-input.js +1 -1
  77. package/dist/cdn/invoice/snice-invoice.js +1 -1
  78. package/dist/cdn/kanban/snice-kanban.js +1 -1
  79. package/dist/cdn/key-value/snice-key-value.js +1 -1
  80. package/dist/cdn/kpi/snice-kpi.js +1 -1
  81. package/dist/cdn/layout/snice-layout.js +1 -1
  82. package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
  83. package/dist/cdn/link/snice-link.js +1 -1
  84. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  85. package/dist/cdn/list/snice-list.js +1 -1
  86. package/dist/cdn/location/snice-location.js +1 -1
  87. package/dist/cdn/login/README.md +1 -1
  88. package/dist/cdn/login/snice-login.js +2 -2
  89. package/dist/cdn/login/snice-login.js.map +1 -1
  90. package/dist/cdn/login/snice-login.min.js +1 -1
  91. package/dist/cdn/login/snice-login.min.js.map +1 -1
  92. package/dist/cdn/map/snice-map.js +1 -1
  93. package/dist/cdn/markdown/snice-markdown.js +1 -1
  94. package/dist/cdn/masonry/snice-masonry.js +1 -1
  95. package/dist/cdn/menu/snice-menu.js +1 -1
  96. package/dist/cdn/message-strip/snice-message-strip.js +1 -1
  97. package/dist/cdn/modal/snice-modal.js +1 -1
  98. package/dist/cdn/music-player/snice-music-player.js +1 -1
  99. package/dist/cdn/nav/snice-nav.js +1 -1
  100. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  101. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  102. package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
  103. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  104. package/dist/cdn/pagination/snice-pagination.js +1 -1
  105. package/dist/cdn/paint/snice-paint.js +1 -1
  106. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  107. package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
  108. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  109. package/dist/cdn/popover/snice-popover.js +1 -1
  110. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  111. package/dist/cdn/product-card/snice-product-card.js +1 -1
  112. package/dist/cdn/progress/snice-progress.js +1 -1
  113. package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
  114. package/dist/cdn/qr-code/snice-qr-code.js +1 -1
  115. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  116. package/dist/cdn/radio/snice-radio.js +1 -1
  117. package/dist/cdn/range-slider/snice-range-slider.js +1 -1
  118. package/dist/cdn/rating/snice-rating.js +1 -1
  119. package/dist/cdn/receipt/snice-receipt.js +1 -1
  120. package/dist/cdn/recipe/snice-recipe.js +1 -1
  121. package/dist/cdn/runtime/README.md +2 -2
  122. package/dist/cdn/runtime/snice-runtime.esm.js +130 -31
  123. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  124. package/dist/cdn/runtime/snice-runtime.esm.min.js +1 -1
  125. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  126. package/dist/cdn/runtime/snice-runtime.js +130 -31
  127. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  128. package/dist/cdn/runtime/snice-runtime.min.js +1 -1
  129. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  130. package/dist/cdn/sankey/snice-sankey.js +1 -1
  131. package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
  132. package/dist/cdn/select/snice-select.js +1 -1
  133. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  134. package/dist/cdn/slider/snice-slider.js +1 -1
  135. package/dist/cdn/sortable/snice-sortable.js +1 -1
  136. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  137. package/dist/cdn/spinner/snice-spinner.js +1 -1
  138. package/dist/cdn/split-button/snice-split-button.js +1 -1
  139. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  140. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  141. package/dist/cdn/stat-group/snice-stat-group.js +1 -1
  142. package/dist/cdn/step-input/snice-step-input.js +1 -1
  143. package/dist/cdn/stepper/snice-stepper.js +1 -1
  144. package/dist/cdn/switch/snice-switch.js +1 -1
  145. package/dist/cdn/table/README.md +2 -2
  146. package/dist/cdn/table/snice-table.esm.js +227 -36
  147. package/dist/cdn/table/snice-table.esm.js.map +1 -1
  148. package/dist/cdn/table/snice-table.esm.min.js +69 -48
  149. package/dist/cdn/table/snice-table.esm.min.js.map +1 -1
  150. package/dist/cdn/table/snice-table.js +226 -35
  151. package/dist/cdn/table/snice-table.js.map +1 -1
  152. package/dist/cdn/table/snice-table.min.js +47 -26
  153. package/dist/cdn/table/snice-table.min.js.map +1 -1
  154. package/dist/cdn/tabs/snice-tabs.js +1 -1
  155. package/dist/cdn/tag/snice-tag.js +1 -1
  156. package/dist/cdn/tag-input/README.md +2 -2
  157. package/dist/cdn/tag-input/snice-tag-input.js +10 -16
  158. package/dist/cdn/tag-input/snice-tag-input.js.map +1 -1
  159. package/dist/cdn/tag-input/snice-tag-input.min.js +2 -2
  160. package/dist/cdn/tag-input/snice-tag-input.min.js.map +1 -1
  161. package/dist/cdn/terminal/snice-terminal.js +1 -1
  162. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  163. package/dist/cdn/textarea/snice-textarea.js +1 -1
  164. package/dist/cdn/time-picker/snice-time-picker.js +1 -1
  165. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  166. package/dist/cdn/timeline/snice-timeline.js +1 -1
  167. package/dist/cdn/timer/snice-timer.js +1 -1
  168. package/dist/cdn/toast/snice-toast.js +1 -1
  169. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  170. package/dist/cdn/tree/snice-tree.js +1 -1
  171. package/dist/cdn/treemap/snice-treemap.js +1 -1
  172. package/dist/cdn/user-card/snice-user-card.js +1 -1
  173. package/dist/cdn/video-player/snice-video-player.js +1 -1
  174. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  175. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  176. package/dist/cdn/weather/snice-weather.js +1 -1
  177. package/dist/cdn/work-order/snice-work-order.js +1 -1
  178. package/dist/components/button/snice-button.js +1 -1
  179. package/dist/components/button/snice-button.js.map +1 -1
  180. package/dist/components/calendar/snice-calendar.d.ts +2 -0
  181. package/dist/components/calendar/snice-calendar.js +25 -1
  182. package/dist/components/calendar/snice-calendar.js.map +1 -1
  183. package/dist/components/table/snice-row.d.ts +6 -0
  184. package/dist/components/table/snice-row.js +11 -3
  185. package/dist/components/table/snice-row.js.map +1 -1
  186. package/dist/components/table/snice-table.d.ts +40 -3
  187. package/dist/components/table/snice-table.js +157 -17
  188. package/dist/components/table/snice-table.js.map +1 -1
  189. package/dist/components/table/table-cell-presentation.d.ts +11 -0
  190. package/dist/components/table/table-cell-presentation.js +25 -8
  191. package/dist/components/table/table-cell-presentation.js.map +1 -1
  192. package/dist/components/table/table-export.d.ts +6 -0
  193. package/dist/components/table/table-export.js +11 -2
  194. package/dist/components/table/table-export.js.map +1 -1
  195. package/dist/components/table/table-keyboard.js +1 -1
  196. package/dist/components/table/table-keyboard.js.map +1 -1
  197. package/dist/components/table/table-master-detail.d.ts +11 -2
  198. package/dist/components/table/table-master-detail.js +20 -3
  199. package/dist/components/table/table-master-detail.js.map +1 -1
  200. package/dist/components/tag-input/snice-tag-input.d.ts +2 -2
  201. package/dist/components/tag-input/snice-tag-input.js +9 -15
  202. package/dist/components/tag-input/snice-tag-input.js.map +1 -1
  203. package/dist/index.cjs +127 -28
  204. package/dist/index.cjs.map +1 -1
  205. package/dist/index.esm.js +127 -28
  206. package/dist/index.esm.js.map +1 -1
  207. package/dist/index.iife.js +127 -28
  208. package/dist/index.iife.js.map +1 -1
  209. package/dist/react/SniceProvider.js +1 -1
  210. package/dist/react/SniceRouter.js +1 -1
  211. package/dist/react/index.js +1 -1
  212. package/dist/react/matchRoute.js +1 -1
  213. package/dist/react/useRequestHandler.js +1 -1
  214. package/dist/request-response.d.ts +24 -1
  215. package/dist/symbols.cjs +1 -1
  216. package/dist/symbols.esm.js +1 -1
  217. package/dist/testing-dom.cjs +1 -1
  218. package/dist/testing-dom.esm.js +1 -1
  219. package/dist/transitions.cjs +1 -1
  220. package/dist/transitions.esm.js +1 -1
  221. package/docs/ai/DEVELOPMENT.md +1 -1
  222. package/docs/ai/components/calendar.md +8 -0
  223. package/docs/ai/components/tag-input.md +4 -0
  224. package/docs/ai/controllers.md +22 -6
  225. package/docs/components/calendar.md +24 -0
  226. package/docs/components/tag-input.md +6 -1
  227. package/docs/controllers.md +57 -6
  228. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"snice-row.js","sources":["../../../components/table/snice-row.css?inline","../../../../components/table/snice-row.ts"],"sourcesContent":["export default \":host([hidden]){display:none}:host{display:block;width:100%;min-height:2.5rem}.row-container{display:flex;align-items:stretch;width:100%;min-height:2.5rem;background:0 0;color:var(--snice-color-text,rgb(23 23 23));border-bottom:1px solid var(--snice-color-border,rgb(226 226 226));transition:background-color .15s}.cell{display:flex;align-items:center;border-right:1px solid var(--snice-color-border,rgb(226 226 226));min-height:2.5rem;min-width:6.25rem;flex:1;word-wrap:break-word;overflow:hidden;color:var(--snice-color-text,rgb(23 23 23))}.cell:last-child{border-right:none}.cell--checkbox{width:3rem;min-width:3rem;max-width:3rem;padding:.75rem;justify-content:center}.row-checkbox{width:1rem;height:1rem;cursor:pointer;margin:0;display:block;accent-color:var(--snice-color-primary,rgb(37 99 235))}.cells-container{display:flex;flex:1;align-items:stretch}.cell--text{text-align:left}.cell--accounting,.cell--currency,.cell--fraction,.cell--number,.cell--percent,.cell--scientific{text-align:right;font-variant-numeric:tabular-nums}.cell--date{min-width:8rem;font-variant-numeric:tabular-nums}.cell--boolean{text-align:center;font-size:1rem}.cell--rating{text-align:center;min-width:6rem}.cell--progress{min-width:8rem}.cell--sparkline{text-align:center;min-width:6rem}.cell--duration,.cell--filesize{text-align:right;font-variant-numeric:tabular-nums}:host(.row--hoverable) .row-container:hover{background-color:var(--snice-color-surface-hover,rgb(243 244 246))}:host(.row--clickable) .row-container{cursor:pointer}:host(.row--clickable) .row-container:hover{background-color:var(--snice-color-surface-hover,rgb(243 244 246))}:host(.row--selected) .row-container{background-color:var(--snice-color-primary-subtle,rgb(239 246 255));box-shadow:inset 2px 0 0 0 var(--snice-color-primary,rgb(37 99 235))}:host(.row--selected.row--hoverable) .row-container:hover{background-color:var(--snice-color-primary-subtle-hover,var(--snice-color-primary-subtle,rgb(219 234 254)))}:host(.row--highlighted) .row-container{background-color:var(--snice-color-warning-subtle,rgb(254 249 195))!important;animation:2s ease-out row-highlight-fade}@keyframes row-highlight-fade{0%{background-color:var(--snice-color-warning-subtle-hover,rgb(254 252 232))}100%{background-color:var(--snice-color-warning-subtle,rgb(254 249 195))}}:host(:focus) .row-container{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(37 99 235 / .5));outline-offset:-2px}:host(.row--selectable){tabindex:0}:host(.row--striped) .row-container{background-color:var(--snice-color-surface-container-low,rgb(245 245 245))}:host(.row--bordered) .row-container{border-bottom:1px solid var(--snice-color-border,rgb(226 226 226))}:host(.row--small) .cell{padding:.5rem .75rem;min-height:2rem;font-size:.75rem}:host(.row--small) .row-container{min-height:2rem}:host(.row--large) .cell{padding:1rem 1.25rem;min-height:3.5rem;font-size:1rem}:host(.row--large) .row-container{min-height:3.5rem}@media (max-width:768px){.cell{padding:.5rem .75rem;font-size:.875rem}.cell--checkbox{width:2.5rem;min-width:2.5rem;max-width:2.5rem;padding:.5rem}.row-checkbox{width:.875rem;height:.875rem}}:host(.row--loading) .row-container{opacity:.6;pointer-events:none}:host(.row--loading) .row-container::after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(90deg,transparent,var(--snice-color-surface,rgb(255 255 255 / .6)),transparent);animation:1.5s infinite loading-shimmer}@keyframes loading-shimmer{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@media (prefers-reduced-motion:reduce){.row-container{transition:none}:host(.row--highlighted) .row-container{animation:none;background-color:var(--snice-color-warning-subtle,rgb(254 249 195))!important}:host(.row--loading) .row-container::after{animation:none}}@media (prefers-contrast:high){.cell{border-right:1px solid}.row-container{border-bottom:1px solid}:host(.row--selected) .row-container{border:2px solid}}\";","import { element, property, watch, ready, dispatch, render, styles, html, css, unsafeHTML, on } from 'snice';\nimport cssContent from './snice-row.css?inline';\nimport type {\n SniceRowElement,\n ColumnDefinition,\n SniceCellElement\n} from './snice-table.types';\nimport './snice-cell';\nimport './snice-cell-text';\nimport './snice-cell-number';\nimport './snice-cell-date';\nimport './snice-cell-boolean';\nimport './snice-cell-rating';\nimport './snice-cell-progress';\nimport './snice-cell-duration';\nimport './snice-cell-filesize';\nimport './snice-cell-sparkline';\nimport './snice-cell-link';\nimport './snice-cell-actions';\nimport './snice-cell-tag';\nimport './snice-cell-image';\nimport './snice-cell-email';\nimport './snice-cell-phone';\nimport './snice-cell-status';\nimport './snice-cell-color';\nimport './snice-cell-json';\nimport './snice-cell-currency';\nimport './snice-cell-percentage';\nimport './snice-cell-location';\n\n@element('snice-row')\nexport class SniceRow extends HTMLElement implements SniceRowElement {\n @property({ type: Boolean, })\n selected: boolean = false;\n\n @property({ type: Boolean, })\n hoverable: boolean = true;\n\n @property({ type: Boolean, })\n clickable: boolean = false;\n\n @property({ type: Boolean, })\n selectable: boolean = false;\n\n /** Table-owned guard for declarative rows that remain visible but fail a\n * conditional selectability predicate. */\n @property({ type: Boolean, attribute: false })\n selectionDisabled: boolean = false;\n\n @property({ type: Object, attribute: false })\n data: any = {};\n\n // Extract data from data-* attributes - pass raw values, let cells handle conversion\n private extractDataFromAttributes() {\n const data: any = {};\n\n // Get all attribute names that start with data-\n const attrNames = this.getAttributeNames().filter(name =>\n name.startsWith('data-') && name !== 'data-column-index'\n );\n\n attrNames.forEach(attrName => {\n const key = attrName.slice(5); // Remove 'data-' prefix\n const value = this.getAttribute(attrName);\n if (value !== null) {\n data[key] = value; // Keep as raw string, let cells convert\n }\n });\n return data;\n }\n\n @property({ type: Number, })\n index: number = 0;\n\n @property({ type: Array, attribute: false })\n columns: ColumnDefinition[] = [];\n\n @render()\n render() {\n return html/*html*/`\n <div class=\"row-container\" part=\"container\" @click=${(e: MouseEvent) => this.handleRowClick(e)} @keydown=${(e: KeyboardEvent) => this.handleKeyDown(e)}>\n <if ${this.selectable}>\n ${this.renderCheckbox()}\n </if>\n <div class=\"cells-container\">\n <if ${this.columns && this.columns.length}>\n ${this.columns.map((column, columnIndex) => this.renderCell(column, columnIndex))}\n </if>\n <if ${!this.columns || !this.columns.length}>\n <!-- No columns set yet -->\n </if>\n </div>\n </div>\n `;\n }\n\n @styles()\n styles() {\n return css/*css*/`${cssContent}`;\n }\n\n @ready()\n init() {\n // Extract data from data-* attributes if data object is empty\n if (!this.data || Object.keys(this.data).length === 0) {\n this.data = this.extractDataFromAttributes();\n }\n this.updateRowAttributes();\n this.configureCells();\n }\n\n private configureCells() {\n if (!this.columns) {\n return;\n }\n\n this.columns.forEach((column, index) => {\n const cellElement = this.shadowRoot?.querySelector(`[data-column-index=\"${index}\"]`) as any;\n if (cellElement) {\n const value = this.data[column.key];\n if (typeof column.renderCell === 'function') {\n const output = column.renderCell(value, this.data, column);\n const replacement = output instanceof HTMLElement ? output : document.createElement('span');\n if (!(output instanceof HTMLElement)) replacement.textContent = output == null ? '' : String(output);\n replacement.setAttribute('data-column-index', String(index));\n cellElement.replaceWith(replacement);\n this.applyCellPresentation(replacement.parentElement as HTMLElement, column, value);\n return;\n }\n\n const formatter = column.formatter || column.valueFormatter;\n cellElement.value = formatter ? formatter(value, this.data) : value;\n cellElement.column = formatter\n ? { ...column, type: 'text', formatter: undefined, valueFormatter: undefined }\n : column;\n cellElement.rowData = this.data;\n this.applyCellPresentation(cellElement.parentElement as HTMLElement, column, value);\n\n // For sparkline cells, also set the data property if value is an array\n if (column.type === 'sparkline' && Array.isArray(value)) {\n cellElement.data = value;\n }\n }\n });\n }\n\n @watch('selected')\n updateSelection() {\n this.updateRowAttributes();\n const checkbox = this.shadowRoot?.querySelector('.row-checkbox') as HTMLInputElement;\n if (checkbox) {\n checkbox.checked = this.selected;\n }\n }\n\n @watch('hoverable', 'clickable', 'selectable', 'selectionDisabled')\n updateRowAttributes() {\n this.classList.toggle('row--hoverable', this.hoverable);\n this.classList.toggle('row--clickable', this.clickable);\n this.classList.toggle('row--selectable', this.selectable);\n this.classList.toggle('row--selection-disabled', this.selectionDisabled);\n this.classList.toggle('row--selected', this.selected);\n }\n\n @watch('data', 'columns')\n updateCells() {\n // Re-render is handled automatically by @render decorator\n // Just need to reconfigure cells after the template updates\n setTimeout(() => this.configureCells(), 0);\n }\n\n private handleRowClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n\n // Handle checkbox change separately\n if (target.matches('.row-checkbox')) {\n return; // Let the change event handle this\n }\n\n // Don't trigger row click if clicking on other interactive elements\n if (target.matches('button, a, .interactive')) {\n return;\n }\n\n if (this.clickable) {\n this.dispatchRowClick();\n }\n\n if (this.selectable && !this.selectionDisabled) {\n this.toggleSelection();\n }\n }\n\n private handleChange(e: Event) {\n const target = e.target as HTMLElement;\n if (!target.matches('.row-checkbox')) return;\n\n const checkbox = target as HTMLInputElement;\n if (this.selectionDisabled) {\n checkbox.checked = this.selected;\n return;\n }\n this.selected = checkbox.checked;\n this.dispatchRowSelect();\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n\n if (this.selectable && !this.selectionDisabled) {\n this.toggleSelection();\n } else if (this.clickable) {\n this.dispatchRowClick();\n }\n }\n }\n\n @on('mouseenter')\n private handleRowHover() {\n this.dispatchRowHover();\n }\n\n private renderCheckbox() {\n return html/*html*/`\n <div class=\"cell cell--checkbox\" part=\"checkbox-cell\">\n <input\n type=\"checkbox\"\n class=\"row-checkbox\"\n ?checked=${this.selected}\n ?disabled=${this.selectionDisabled}\n tabindex=\"-1\"\n @change=${(e: Event) => this.handleChange(e)}\n />\n </div>\n `;\n }\n\n private renderCell(column: ColumnDefinition, columnIndex: number) {\n const value = this.data[column.key];\n const cellComponent = this.getCellComponent(\n column.formatter || column.valueFormatter ? 'text' : column.type\n );\n\n return html/*html*/`\n <div class=\"cell cell--${column.type}\" part=\"cell\" style=\"${this.getCellStyles(column)}\">\n ${unsafeHTML(`<${cellComponent}\n type=\"${column.type}\"\n align=\"${column.align || this.getDefaultAlign(column.type)}\"\n data-column-index=\"${columnIndex}\"\n ></${cellComponent}>`)}\n </div>\n `;\n }\n\n private getDefaultAlign(type?: string): 'left' | 'center' | 'right' {\n if (['number', 'currency', 'percent', 'percentage', 'duration', 'filesize', 'accounting', 'scientific', 'fraction'].includes(type || '')) return 'right';\n if (['boolean', 'rating', 'image'].includes(type || '')) return 'center';\n return 'left';\n }\n\n private applyCellPresentation(wrapper: HTMLElement | null, column: ColumnDefinition, value: any) {\n if (!wrapper) return;\n const applyStyle = (style?: ColumnDefinition['style']) => {\n if (!style) return;\n Object.assign(wrapper.style, style);\n };\n applyStyle(column.style);\n for (const rule of column.conditionalFormats || []) {\n if (!rule.condition(value, this.data)) continue;\n applyStyle(rule.style);\n if (rule.className) wrapper.classList.add(rule.className);\n break;\n }\n if (column.tooltip) {\n wrapper.title = typeof column.tooltip === 'function'\n ? column.tooltip(value, this.data)\n : (value == null ? '' : String(value));\n }\n }\n\n private getCellComponent(type: string | undefined): string {\n switch (type) {\n case 'text':\n return 'snice-cell-text';\n case 'number':\n case 'accounting':\n case 'scientific':\n case 'fraction':\n return 'snice-cell-number';\n case 'date':\n return 'snice-cell-date';\n case 'boolean':\n return 'snice-cell-boolean';\n case 'sparkline':\n return 'snice-cell-sparkline';\n case 'rating':\n return 'snice-cell-rating';\n case 'progress':\n return 'snice-cell-progress';\n case 'duration':\n return 'snice-cell-duration';\n case 'filesize':\n return 'snice-cell-filesize';\n case 'link':\n case 'url':\n return 'snice-cell-link';\n case 'actions':\n return 'snice-cell-actions';\n case 'tag':\n case 'tags':\n case 'badge':\n case 'badges':\n return 'snice-cell-tag';\n case 'image':\n case 'avatar':\n case 'thumbnail':\n return 'snice-cell-image';\n case 'email':\n return 'snice-cell-email';\n case 'phone':\n case 'tel':\n case 'telephone':\n return 'snice-cell-phone';\n case 'status':\n return 'snice-cell-status';\n case 'color':\n return 'snice-cell-color';\n case 'json':\n case 'object':\n return 'snice-cell-json';\n case 'currency':\n case 'money':\n return 'snice-cell-currency';\n case 'percent':\n case 'percentage':\n return 'snice-cell-percentage';\n case 'location':\n case 'address':\n case 'coordinates':\n return 'snice-cell-location';\n case 'custom':\n default:\n return 'snice-cell';\n }\n }\n\n private getCellStyles(column: ColumnDefinition): string {\n let styles = [];\n\n if (column.width) {\n styles.push(`width: ${column.width}`);\n styles.push(`min-width: ${column.width}`);\n styles.push(`max-width: ${column.width}`);\n }\n\n if (column.align) {\n styles.push(`text-align: ${column.align}`);\n }\n\n return styles.join('; ');\n }\n\n private escapeHtml(value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const str = String(value);\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n private toggleSelection() {\n this.selected = !this.selected;\n this.dispatchRowSelect();\n }\n\n @dispatch('row-click', { bubbles: true, composed: true })\n private dispatchRowClick() {\n return {\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n @dispatch('row-select', { bubbles: true, composed: true })\n private dispatchRowSelect() {\n return {\n selected: this.selected,\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n @dispatch('row-hover', { bubbles: true, composed: true })\n private dispatchRowHover() {\n return {\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n // Public API methods\n select() {\n if (this.selectionDisabled || !this.selectable) return;\n this.selected = true;\n this.dispatchRowSelect();\n }\n\n deselect() {\n this.selected = false;\n this.dispatchRowSelect();\n }\n\n focusRow() {\n super.focus();\n this.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n\n getCellValue(columnKey: string): any {\n return this.data[columnKey];\n }\n\n setCellValue(columnKey: string, value: any) {\n this.data = { ...this.data, [columnKey]: value };\n this.updateCells();\n }\n\n getCellElement(columnKey: string): SniceCellElement | null {\n const column = this.columns.find(col => col.key === columnKey);\n if (!column) return null;\n\n const columnIndex = this.columns.indexOf(column);\n return this.shadowRoot?.querySelector(`[data-column-index=\"${columnIndex}\"]`) as SniceCellElement || null;\n }\n\n // Highlight row temporarily (useful for showing updates)\n highlight(duration: number = 2000) {\n this.classList.add('row--highlighted');\n setTimeout(() => {\n this.classList.remove('row--highlighted');\n }, duration);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snice-row.js","sources":["../../../components/table/snice-row.css?inline","../../../../components/table/snice-row.ts"],"sourcesContent":["export default \":host([hidden]){display:none}:host{display:block;width:100%;min-height:2.5rem}.row-container{display:flex;align-items:stretch;width:100%;min-height:2.5rem;background:0 0;color:var(--snice-color-text,rgb(23 23 23));border-bottom:1px solid var(--snice-color-border,rgb(226 226 226));transition:background-color .15s}.cell{display:flex;align-items:center;border-right:1px solid var(--snice-color-border,rgb(226 226 226));min-height:2.5rem;min-width:6.25rem;flex:1;word-wrap:break-word;overflow:hidden;color:var(--snice-color-text,rgb(23 23 23))}.cell:last-child{border-right:none}.cell--checkbox{width:3rem;min-width:3rem;max-width:3rem;padding:.75rem;justify-content:center}.row-checkbox{width:1rem;height:1rem;cursor:pointer;margin:0;display:block;accent-color:var(--snice-color-primary,rgb(37 99 235))}.cells-container{display:flex;flex:1;align-items:stretch}.cell--text{text-align:left}.cell--accounting,.cell--currency,.cell--fraction,.cell--number,.cell--percent,.cell--scientific{text-align:right;font-variant-numeric:tabular-nums}.cell--date{min-width:8rem;font-variant-numeric:tabular-nums}.cell--boolean{text-align:center;font-size:1rem}.cell--rating{text-align:center;min-width:6rem}.cell--progress{min-width:8rem}.cell--sparkline{text-align:center;min-width:6rem}.cell--duration,.cell--filesize{text-align:right;font-variant-numeric:tabular-nums}:host(.row--hoverable) .row-container:hover{background-color:var(--snice-color-surface-hover,rgb(243 244 246))}:host(.row--clickable) .row-container{cursor:pointer}:host(.row--clickable) .row-container:hover{background-color:var(--snice-color-surface-hover,rgb(243 244 246))}:host(.row--selected) .row-container{background-color:var(--snice-color-primary-subtle,rgb(239 246 255));box-shadow:inset 2px 0 0 0 var(--snice-color-primary,rgb(37 99 235))}:host(.row--selected.row--hoverable) .row-container:hover{background-color:var(--snice-color-primary-subtle-hover,var(--snice-color-primary-subtle,rgb(219 234 254)))}:host(.row--highlighted) .row-container{background-color:var(--snice-color-warning-subtle,rgb(254 249 195))!important;animation:2s ease-out row-highlight-fade}@keyframes row-highlight-fade{0%{background-color:var(--snice-color-warning-subtle-hover,rgb(254 252 232))}100%{background-color:var(--snice-color-warning-subtle,rgb(254 249 195))}}:host(:focus) .row-container{outline:var(--snice-focus-ring-width,2px) solid var(--snice-focus-ring-color,rgb(37 99 235 / .5));outline-offset:-2px}:host(.row--selectable){tabindex:0}:host(.row--striped) .row-container{background-color:var(--snice-color-surface-container-low,rgb(245 245 245))}:host(.row--bordered) .row-container{border-bottom:1px solid var(--snice-color-border,rgb(226 226 226))}:host(.row--small) .cell{padding:.5rem .75rem;min-height:2rem;font-size:.75rem}:host(.row--small) .row-container{min-height:2rem}:host(.row--large) .cell{padding:1rem 1.25rem;min-height:3.5rem;font-size:1rem}:host(.row--large) .row-container{min-height:3.5rem}@media (max-width:768px){.cell{padding:.5rem .75rem;font-size:.875rem}.cell--checkbox{width:2.5rem;min-width:2.5rem;max-width:2.5rem;padding:.5rem}.row-checkbox{width:.875rem;height:.875rem}}:host(.row--loading) .row-container{opacity:.6;pointer-events:none}:host(.row--loading) .row-container::after{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(90deg,transparent,var(--snice-color-surface,rgb(255 255 255 / .6)),transparent);animation:1.5s infinite loading-shimmer}@keyframes loading-shimmer{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@media (prefers-reduced-motion:reduce){.row-container{transition:none}:host(.row--highlighted) .row-container{animation:none;background-color:var(--snice-color-warning-subtle,rgb(254 249 195))!important}:host(.row--loading) .row-container::after{animation:none}}@media (prefers-contrast:high){.cell{border-right:1px solid}.row-container{border-bottom:1px solid}:host(.row--selected) .row-container{border:2px solid}}\";","import { element, property, watch, ready, dispatch, render, styles, html, css, unsafeHTML, on } from 'snice';\nimport cssContent from './snice-row.css?inline';\nimport type {\n SniceRowElement,\n ColumnDefinition,\n SniceCellElement\n} from './snice-table.types';\nimport './snice-cell';\nimport './snice-cell-text';\nimport './snice-cell-number';\nimport './snice-cell-date';\nimport './snice-cell-boolean';\nimport './snice-cell-rating';\nimport './snice-cell-progress';\nimport './snice-cell-duration';\nimport './snice-cell-filesize';\nimport './snice-cell-sparkline';\nimport './snice-cell-link';\nimport './snice-cell-actions';\nimport './snice-cell-tag';\nimport './snice-cell-image';\nimport './snice-cell-email';\nimport './snice-cell-phone';\nimport './snice-cell-status';\nimport './snice-cell-color';\nimport './snice-cell-json';\nimport './snice-cell-currency';\nimport './snice-cell-percentage';\nimport './snice-cell-location';\n\n@element('snice-row')\nexport class SniceRow extends HTMLElement implements SniceRowElement {\n @property({ type: Boolean, })\n selected: boolean = false;\n\n @property({ type: Boolean, })\n hoverable: boolean = true;\n\n @property({ type: Boolean, })\n clickable: boolean = false;\n\n @property({ type: Boolean, })\n selectable: boolean = false;\n\n /** Table-owned guard for declarative rows that remain visible but fail a\n * conditional selectability predicate. */\n @property({ type: Boolean, attribute: false })\n selectionDisabled: boolean = false;\n\n @property({ type: Object, attribute: false })\n data: any = {};\n\n // Extract data from data-* attributes - pass raw values, let cells handle conversion\n private extractDataFromAttributes() {\n const data: any = {};\n\n // Get all attribute names that start with data-\n const attrNames = this.getAttributeNames().filter(name =>\n name.startsWith('data-') && name !== 'data-column-index'\n );\n\n attrNames.forEach(attrName => {\n const key = attrName.slice(5); // Remove 'data-' prefix\n const value = this.getAttribute(attrName);\n if (value !== null) {\n data[key] = value; // Keep as raw string, let cells convert\n }\n });\n return data;\n }\n\n @property({ type: Number, })\n index: number = 0;\n\n @property({ type: Array, attribute: false })\n columns: ColumnDefinition[] = [];\n\n @render()\n render() {\n return html/*html*/`\n <div class=\"row-container\" part=\"container\" @click=${(e: MouseEvent) => this.handleRowClick(e)} @keydown=${(e: KeyboardEvent) => this.handleKeyDown(e)}>\n <if ${this.selectable}>\n ${this.renderCheckbox()}\n </if>\n <div class=\"cells-container\">\n <if ${this.columns && this.columns.length}>\n ${this.columns.map((column, columnIndex) => this.renderCell(column, columnIndex))}\n </if>\n <if ${!this.columns || !this.columns.length}>\n <!-- No columns set yet -->\n </if>\n </div>\n </div>\n `;\n }\n\n @styles()\n styles() {\n return css/*css*/`${cssContent}`;\n }\n\n @ready()\n init() {\n // Extract data from data-* attributes if data object is empty\n if (!this.data || Object.keys(this.data).length === 0) {\n this.data = this.extractDataFromAttributes();\n }\n this.updateRowAttributes();\n this.configureCells();\n }\n\n /**\n * The column's working value for this row: `valueGetter` runs for display\n * here exactly as it does on the table's own render path, so a column whose\n * key names a server field rather than a row field still paints.\n */\n private cellValue(column: ColumnDefinition): any {\n const raw = this.data?.[column.key];\n return column.valueGetter ? column.valueGetter(raw, this.data) : raw;\n }\n\n private configureCells() {\n if (!this.columns) {\n return;\n }\n\n this.columns.forEach((column, index) => {\n const cellElement = this.shadowRoot?.querySelector(`[data-column-index=\"${index}\"]`) as any;\n if (cellElement) {\n const value = this.cellValue(column);\n if (typeof column.renderCell === 'function') {\n const output = column.renderCell(value, this.data, column);\n const replacement = output instanceof HTMLElement ? output : document.createElement('span');\n if (!(output instanceof HTMLElement)) replacement.textContent = output == null ? '' : String(output);\n replacement.setAttribute('data-column-index', String(index));\n cellElement.replaceWith(replacement);\n this.applyCellPresentation(replacement.parentElement as HTMLElement, column, value);\n return;\n }\n\n const formatter = column.formatter || column.valueFormatter;\n cellElement.value = formatter ? String(formatter(value, this.data) ?? '') : value;\n cellElement.column = formatter\n ? { ...column, type: 'text', formatter: undefined, valueFormatter: undefined }\n : column;\n cellElement.rowData = this.data;\n this.applyCellPresentation(cellElement.parentElement as HTMLElement, column, value);\n\n // For sparkline cells, also set the data property if value is an array\n if (column.type === 'sparkline' && Array.isArray(value)) {\n cellElement.data = value;\n }\n }\n });\n }\n\n @watch('selected')\n updateSelection() {\n this.updateRowAttributes();\n const checkbox = this.shadowRoot?.querySelector('.row-checkbox') as HTMLInputElement;\n if (checkbox) {\n checkbox.checked = this.selected;\n }\n }\n\n @watch('hoverable', 'clickable', 'selectable', 'selectionDisabled')\n updateRowAttributes() {\n this.classList.toggle('row--hoverable', this.hoverable);\n this.classList.toggle('row--clickable', this.clickable);\n this.classList.toggle('row--selectable', this.selectable);\n this.classList.toggle('row--selection-disabled', this.selectionDisabled);\n this.classList.toggle('row--selected', this.selected);\n }\n\n @watch('data', 'columns')\n updateCells() {\n // Re-render is handled automatically by @render decorator\n // Just need to reconfigure cells after the template updates\n setTimeout(() => this.configureCells(), 0);\n }\n\n private handleRowClick(e: MouseEvent) {\n const target = e.target as HTMLElement;\n\n // Handle checkbox change separately\n if (target.matches('.row-checkbox')) {\n return; // Let the change event handle this\n }\n\n // Don't trigger row click if clicking on other interactive elements\n if (target.matches('button, a, .interactive')) {\n return;\n }\n\n if (this.clickable) {\n this.dispatchRowClick();\n }\n\n if (this.selectable && !this.selectionDisabled) {\n this.toggleSelection();\n }\n }\n\n private handleChange(e: Event) {\n const target = e.target as HTMLElement;\n if (!target.matches('.row-checkbox')) return;\n\n const checkbox = target as HTMLInputElement;\n if (this.selectionDisabled) {\n checkbox.checked = this.selected;\n return;\n }\n this.selected = checkbox.checked;\n this.dispatchRowSelect();\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n\n if (this.selectable && !this.selectionDisabled) {\n this.toggleSelection();\n } else if (this.clickable) {\n this.dispatchRowClick();\n }\n }\n }\n\n @on('mouseenter')\n private handleRowHover() {\n this.dispatchRowHover();\n }\n\n private renderCheckbox() {\n return html/*html*/`\n <div class=\"cell cell--checkbox\" part=\"checkbox-cell\">\n <input\n type=\"checkbox\"\n class=\"row-checkbox\"\n ?checked=${this.selected}\n ?disabled=${this.selectionDisabled}\n tabindex=\"-1\"\n @change=${(e: Event) => this.handleChange(e)}\n />\n </div>\n `;\n }\n\n private renderCell(column: ColumnDefinition, columnIndex: number) {\n const cellComponent = this.getCellComponent(\n column.formatter || column.valueFormatter ? 'text' : column.type\n );\n\n return html/*html*/`\n <div class=\"cell cell--${column.type}\" part=\"cell\" style=\"${this.getCellStyles(column)}\">\n ${unsafeHTML(`<${cellComponent}\n type=\"${column.type}\"\n align=\"${column.align || this.getDefaultAlign(column.type)}\"\n data-column-index=\"${columnIndex}\"\n ></${cellComponent}>`)}\n </div>\n `;\n }\n\n private getDefaultAlign(type?: string): 'left' | 'center' | 'right' {\n if (['number', 'currency', 'percent', 'percentage', 'duration', 'filesize', 'accounting', 'scientific', 'fraction'].includes(type || '')) return 'right';\n if (['boolean', 'rating', 'image'].includes(type || '')) return 'center';\n return 'left';\n }\n\n private applyCellPresentation(wrapper: HTMLElement | null, column: ColumnDefinition, value: any) {\n if (!wrapper) return;\n const applyStyle = (style?: ColumnDefinition['style']) => {\n if (!style) return;\n Object.assign(wrapper.style, style);\n };\n applyStyle(column.style);\n for (const rule of column.conditionalFormats || []) {\n if (!rule.condition(value, this.data)) continue;\n applyStyle(rule.style);\n if (rule.className) wrapper.classList.add(rule.className);\n break;\n }\n if (column.tooltip) {\n wrapper.title = typeof column.tooltip === 'function'\n ? column.tooltip(value, this.data)\n : (value == null ? '' : String(value));\n }\n }\n\n private getCellComponent(type: string | undefined): string {\n switch (type) {\n case 'text':\n return 'snice-cell-text';\n case 'number':\n case 'accounting':\n case 'scientific':\n case 'fraction':\n return 'snice-cell-number';\n case 'date':\n return 'snice-cell-date';\n case 'boolean':\n return 'snice-cell-boolean';\n case 'sparkline':\n return 'snice-cell-sparkline';\n case 'rating':\n return 'snice-cell-rating';\n case 'progress':\n return 'snice-cell-progress';\n case 'duration':\n return 'snice-cell-duration';\n case 'filesize':\n return 'snice-cell-filesize';\n case 'link':\n case 'url':\n return 'snice-cell-link';\n case 'actions':\n return 'snice-cell-actions';\n case 'tag':\n case 'tags':\n case 'badge':\n case 'badges':\n return 'snice-cell-tag';\n case 'image':\n case 'avatar':\n case 'thumbnail':\n return 'snice-cell-image';\n case 'email':\n return 'snice-cell-email';\n case 'phone':\n case 'tel':\n case 'telephone':\n return 'snice-cell-phone';\n case 'status':\n return 'snice-cell-status';\n case 'color':\n return 'snice-cell-color';\n case 'json':\n case 'object':\n return 'snice-cell-json';\n case 'currency':\n case 'money':\n return 'snice-cell-currency';\n case 'percent':\n case 'percentage':\n return 'snice-cell-percentage';\n case 'location':\n case 'address':\n case 'coordinates':\n return 'snice-cell-location';\n case 'custom':\n default:\n return 'snice-cell';\n }\n }\n\n private getCellStyles(column: ColumnDefinition): string {\n let styles = [];\n\n if (column.width) {\n styles.push(`width: ${column.width}`);\n styles.push(`min-width: ${column.width}`);\n styles.push(`max-width: ${column.width}`);\n }\n\n if (column.align) {\n styles.push(`text-align: ${column.align}`);\n }\n\n return styles.join('; ');\n }\n\n private escapeHtml(value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n const str = String(value);\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n private toggleSelection() {\n this.selected = !this.selected;\n this.dispatchRowSelect();\n }\n\n @dispatch('row-click', { bubbles: true, composed: true })\n private dispatchRowClick() {\n return {\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n @dispatch('row-select', { bubbles: true, composed: true })\n private dispatchRowSelect() {\n return {\n selected: this.selected,\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n @dispatch('row-hover', { bubbles: true, composed: true })\n private dispatchRowHover() {\n return {\n data: this.data,\n index: this.index,\n element: this\n };\n }\n\n // Public API methods\n select() {\n if (this.selectionDisabled || !this.selectable) return;\n this.selected = true;\n this.dispatchRowSelect();\n }\n\n deselect() {\n this.selected = false;\n this.dispatchRowSelect();\n }\n\n focusRow() {\n super.focus();\n this.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n\n getCellValue(columnKey: string): any {\n return this.data[columnKey];\n }\n\n setCellValue(columnKey: string, value: any) {\n this.data = { ...this.data, [columnKey]: value };\n this.updateCells();\n }\n\n getCellElement(columnKey: string): SniceCellElement | null {\n const column = this.columns.find(col => col.key === columnKey);\n if (!column) return null;\n\n const columnIndex = this.columns.indexOf(column);\n return this.shadowRoot?.querySelector(`[data-column-index=\"${columnIndex}\"]`) as SniceCellElement || null;\n }\n\n // Highlight row temporarily (useful for showing updates)\n highlight(duration: number = 2000) {\n this.classList.add('row--highlighted');\n setTimeout(() => {\n this.classList.remove('row--highlighted');\n }, duration);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -141,6 +141,7 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
141
141
  styles(): import("snice").CSSResult;
142
142
  render(): import("snice").TemplateResult;
143
143
  renderControls(): void;
144
+ handleFrameResize(): void;
144
145
  initialize(): Promise<void>;
145
146
  private processSlottedContent;
146
147
  /** Whether declarative rows need the full grouping/aggregation table model. */
@@ -190,6 +191,14 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
190
191
  renderHeader(): void;
191
192
  renderSortableHeader(column: any): string;
192
193
  renderBody(): void;
194
+ /**
195
+ * When the host is taller than its rows, append an inert filler row so the
196
+ * column grid runs to the bottom edge of the frame. Cloned from the last
197
+ * data row, so column widths, pinning, and alignment track the table
198
+ * engine natively. Removed entirely when content fills (or overflows) the
199
+ * frame, restoring the plain last-row styling.
200
+ */
201
+ private updateFillRow;
193
202
  private reconcileRows;
194
203
  /**
195
204
  * A structural fingerprint of everything `createRow` reads that is NOT
@@ -202,12 +211,28 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
202
211
  private rendererIdSeq;
203
212
  private rendererIdFor;
204
213
  private computeStructuralSig;
214
+ /**
215
+ * A fingerprint of a row's own field values, so a row object that was mutated
216
+ * IN PLACE (the same identity re-delivered by a poll/websocket patch, or an
217
+ * array the app edits) is rebuilt instead of recycled with stale cells.
218
+ *
219
+ * Tradeoff, deliberately chosen: this walks the row's OWN, SHALLOW fields
220
+ * rather than running each column's valueGetter/formatter. It therefore costs
221
+ * one string build per rendered row — never a user callback, so call counts
222
+ * for `valueGetter` stay exactly one per row per render — and it still catches
223
+ * getter-derived columns, because a getter reads the fields this covers.
224
+ * Nested objects collapse to their String() form, so a mutation buried inside
225
+ * a nested object (or an object rendered by a JSON/progress cell) is not
226
+ * detected; those callers should hand over a new row object. Recycling keeps
227
+ * its payoff: rows whose values did not change are still reused untouched.
228
+ */
229
+ private rowValueSignature;
205
230
  /**
206
231
  * The per-row rebuild signature. Selection and the plain data-index are
207
232
  * re-stamped on reuse (not here) so they never force a rebuild; this captures
208
- * only what a re-stamp cannot repair: tree node state, per-row height, and —
209
- * when a feature embeds the index in a row-scoped closure (row DnD drag index,
210
- * master-detail toggle index) — the index itself.
233
+ * the row's cell values plus what a re-stamp cannot repair: tree node state,
234
+ * per-row height, and — when a feature embeds the index in a row-scoped
235
+ * closure (row DnD drag index, master-detail toggle index) — the index itself.
211
236
  */
212
237
  private rowSignature;
213
238
  /** Whether the row at `index` currently hosts an inline editor. */
@@ -233,6 +258,12 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
233
258
  private dispatchPageChange;
234
259
  renderPagination(): void;
235
260
  private pageButton;
261
+ /**
262
+ * The column's display text, or null when the column declares no display
263
+ * formatter. `formatter` (row-aware) is the display formatter and
264
+ * `valueFormatter` its documented fallback, so `formatter` wins.
265
+ */
266
+ private cellDisplayText;
236
267
  /** Create a cell element safely using createElement + setAttribute */
237
268
  createCellElement(column: any, value: any, row?: any): HTMLElement;
238
269
  getCellTagName(type: string): string;
@@ -251,6 +282,12 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
251
282
  private updateRowSelectionStateFor;
252
283
  updateSelectAllState(): void;
253
284
  toggleSort(columnKey: string, multiSort?: boolean): void;
285
+ /**
286
+ * Reorder `this.data` to the current client-side sort (or back to delivery
287
+ * order when the sort was cleared). Split out of sortLocalData so a fresh
288
+ * delivery can land sorted without re-entering the render/index bookkeeping.
289
+ */
290
+ private applyLocalSortOrder;
254
291
  private sortLocalData;
255
292
  private dispatchRowSelectionChanged;
256
293
  private dispatchRowClicked;
@@ -1,5 +1,5 @@
1
1
  import { __esDecorate, __runInitializers } from 'tslib';
2
- import { element, property, query, request, styles, render, ready, on, watch, dispatch, dispose, css, html } from 'snice';
2
+ import { element, property, query, request, styles, render, observe, ready, on, watch, dispatch, dispose, css, html } from 'snice';
3
3
  import '../input/snice-input.js';
4
4
  import '../select/snice-select.js';
5
5
  import '../button/snice-button.js';
@@ -192,6 +192,7 @@ let SniceTable = (() => {
192
192
  let _getTableData_decorators;
193
193
  let _styles_decorators;
194
194
  let _render_decorators;
195
+ let _handleFrameResize_decorators;
195
196
  let _initialize_decorators;
196
197
  let _handleDeclarativeColumnChange_decorators;
197
198
  let _handleSelectorOptionsChange_decorators;
@@ -289,6 +290,7 @@ let SniceTable = (() => {
289
290
  _getTableData_decorators = [request('table/data')];
290
291
  _styles_decorators = [styles()];
291
292
  _render_decorators = [render()];
293
+ _handleFrameResize_decorators = [observe('resize', '.table-frame')];
292
294
  _initialize_decorators = [ready()];
293
295
  _handleDeclarativeColumnChange_decorators = [on('column-changed')];
294
296
  _handleSelectorOptionsChange_decorators = [watch('selectorOptions')];
@@ -337,6 +339,7 @@ let SniceTable = (() => {
337
339
  __esDecorate(this, null, _getTableData_decorators, { kind: "method", name: "getTableData", static: false, private: false, access: { has: obj => "getTableData" in obj, get: obj => obj.getTableData }, metadata: _metadata }, null, _instanceExtraInitializers);
338
340
  __esDecorate(this, null, _styles_decorators, { kind: "method", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles }, metadata: _metadata }, null, _instanceExtraInitializers);
339
341
  __esDecorate(this, null, _render_decorators, { kind: "method", name: "render", static: false, private: false, access: { has: obj => "render" in obj, get: obj => obj.render }, metadata: _metadata }, null, _instanceExtraInitializers);
342
+ __esDecorate(this, null, _handleFrameResize_decorators, { kind: "method", name: "handleFrameResize", static: false, private: false, access: { has: obj => "handleFrameResize" in obj, get: obj => obj.handleFrameResize }, metadata: _metadata }, null, _instanceExtraInitializers);
340
343
  __esDecorate(this, null, _initialize_decorators, { kind: "method", name: "initialize", static: false, private: false, access: { has: obj => "initialize" in obj, get: obj => obj.initialize }, metadata: _metadata }, null, _instanceExtraInitializers);
341
344
  __esDecorate(this, null, _handleDeclarativeColumnChange_decorators, { kind: "method", name: "handleDeclarativeColumnChange", static: false, private: false, access: { has: obj => "handleDeclarativeColumnChange" in obj, get: obj => obj.handleDeclarativeColumnChange }, metadata: _metadata }, null, _instanceExtraInitializers);
342
345
  __esDecorate(this, null, _handleSelectorOptionsChange_decorators, { kind: "method", name: "handleSelectorOptionsChange", static: false, private: false, access: { has: obj => "handleSelectorOptionsChange" in obj, get: obj => obj.handleSelectorOptionsChange }, metadata: _metadata }, null, _instanceExtraInitializers);
@@ -655,6 +658,27 @@ let SniceTable = (() => {
655
658
  border-bottom: none;
656
659
  }
657
660
 
661
+ /* Height fill: when the host is taller than its rows, an inert filler
662
+ row (cloned from the last data row, so column widths and pinning
663
+ track the table engine) keeps the column grid running to the bottom
664
+ edge instead of the borders cutting off where the rows end. */
665
+ tbody tr.table-fill-row {
666
+ pointer-events: none;
667
+ }
668
+
669
+ tbody tr.table-fill-row td {
670
+ border-bottom: none;
671
+ padding: 0;
672
+ }
673
+
674
+ :host([striped]) tbody tr.table-fill-row {
675
+ background: transparent;
676
+ }
677
+
678
+ :host([hoverable]) tbody tr.table-fill-row:hover {
679
+ background: transparent;
680
+ }
681
+
658
682
  th {
659
683
  padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-sm, 0.75rem);
660
684
  }
@@ -1678,6 +1702,11 @@ let SniceTable = (() => {
1678
1702
  }
1679
1703
  container.appendChild(controlsDiv);
1680
1704
  }
1705
+ // Re-derive the fill row whenever the frame's box changes (host resized,
1706
+ // fullscreen toggled) — the leftover space below the rows changes with it.
1707
+ handleFrameResize() {
1708
+ this.updateFillRow();
1709
+ }
1681
1710
  async initialize() {
1682
1711
  // Listen for controller attached event
1683
1712
  this.addEventListener('controller-attached', this.onAttached);
@@ -1979,8 +2008,14 @@ let SniceTable = (() => {
1979
2008
  if (this.settingSortedData)
1980
2009
  return;
1981
2010
  this.unsortedData = [...this.data];
2011
+ // C3: rows delivered while a client-side sort is active must land in that
2012
+ // sorted order — the currentSort watcher only fires when the sort itself
2013
+ // changes, so without this the body silently contradicts the header. In
2014
+ // remote mode the server owns the ordering.
2015
+ if (this.mode !== 'remote' && this.currentSort.length > 0)
2016
+ this.applyLocalSortOrder();
1982
2017
  this.rebuildRowIndex();
1983
- this.masterDetail.prepare(this.data);
2018
+ this.masterDetail.prepare(this.data, row => this.rowValueSignature(row));
1984
2019
  if (this.settingDataImperative)
1985
2020
  return; // imperative setData(): caller renders
1986
2021
  this.scheduleRender('body');
@@ -2436,6 +2471,7 @@ let SniceTable = (() => {
2436
2471
  // Still render pagination
2437
2472
  if (this.pagination)
2438
2473
  this.renderPagination();
2474
+ this.updateSelectAllState();
2439
2475
  return;
2440
2476
  }
2441
2477
  if (this.data.length === 0 && this.columns.length > 0) {
@@ -2652,10 +2688,52 @@ let SniceTable = (() => {
2652
2688
  this.reconcileRows(entries);
2653
2689
  // Re-establish grid role + roving tabindex after the body changed.
2654
2690
  this.keyboard.refresh();
2691
+ // The select-all control describes the *filtered* row set, so it goes stale
2692
+ // whenever the denominator moves (rows delivered, filter cleared) even
2693
+ // though `selectedRows` — its only other trigger — never changed.
2694
+ this.updateSelectAllState();
2655
2695
  // Render pagination after body
2656
2696
  if (this.pagination) {
2657
2697
  this.renderPagination();
2658
2698
  }
2699
+ this.updateFillRow();
2700
+ }
2701
+ /**
2702
+ * When the host is taller than its rows, append an inert filler row so the
2703
+ * column grid runs to the bottom edge of the frame. Cloned from the last
2704
+ * data row, so column widths, pinning, and alignment track the table
2705
+ * engine natively. Removed entirely when content fills (or overflows) the
2706
+ * frame, restoring the plain last-row styling.
2707
+ */
2708
+ updateFillRow() {
2709
+ const frame = this.shadowRoot?.querySelector('.table-frame');
2710
+ const tableEl = frame?.querySelector('table');
2711
+ const tbody = tableEl?.querySelector('tbody');
2712
+ if (!frame || !tableEl || !tbody)
2713
+ return;
2714
+ tbody.querySelector('tr.table-fill-row')?.remove();
2715
+ if (this.list && this.listRenderer)
2716
+ return;
2717
+ const rows = tbody.querySelectorAll('tr[data-index]');
2718
+ const lastRow = rows[rows.length - 1];
2719
+ if (!lastRow)
2720
+ return;
2721
+ const leftover = Math.floor(frame.clientHeight - tableEl.offsetHeight);
2722
+ if (leftover <= 1)
2723
+ return;
2724
+ const fill = lastRow.cloneNode(true);
2725
+ fill.className = 'table-fill-row';
2726
+ for (const attr of ['data-index', 'data-selected', 'role', 'aria-rowindex', 'aria-selected', 'tabindex', 'id']) {
2727
+ fill.removeAttribute(attr);
2728
+ }
2729
+ fill.setAttribute('aria-hidden', 'true');
2730
+ fill.querySelectorAll('td').forEach(td => {
2731
+ td.replaceChildren();
2732
+ for (const attr of ['role', 'aria-colindex', 'tabindex', 'aria-selected'])
2733
+ td.removeAttribute(attr);
2734
+ });
2735
+ fill.style.height = `${leftover}px`;
2736
+ tbody.appendChild(fill);
2659
2737
  }
2660
2738
  // ── Task B: render-path reconciler ──────────────────────────────────────
2661
2739
  //
@@ -2746,15 +2824,41 @@ let SniceTable = (() => {
2746
2824
  `tree=${this.treeData.isEnabled() ? this.treeData.getGroupColumn() : ''}`,
2747
2825
  ].join('|');
2748
2826
  }
2827
+ /**
2828
+ * A fingerprint of a row's own field values, so a row object that was mutated
2829
+ * IN PLACE (the same identity re-delivered by a poll/websocket patch, or an
2830
+ * array the app edits) is rebuilt instead of recycled with stale cells.
2831
+ *
2832
+ * Tradeoff, deliberately chosen: this walks the row's OWN, SHALLOW fields
2833
+ * rather than running each column's valueGetter/formatter. It therefore costs
2834
+ * one string build per rendered row — never a user callback, so call counts
2835
+ * for `valueGetter` stay exactly one per row per render — and it still catches
2836
+ * getter-derived columns, because a getter reads the fields this covers.
2837
+ * Nested objects collapse to their String() form, so a mutation buried inside
2838
+ * a nested object (or an object rendered by a JSON/progress cell) is not
2839
+ * detected; those callers should hand over a new row object. Recycling keeps
2840
+ * its payoff: rows whose values did not change are still reused untouched.
2841
+ */
2842
+ rowValueSignature(rowData) {
2843
+ if (rowData === null || typeof rowData !== 'object')
2844
+ return String(rowData);
2845
+ const parts = [];
2846
+ for (const key of Object.keys(rowData)) {
2847
+ const value = rowData[key];
2848
+ parts.push(`${key}=${value === null || value === undefined ? '' : String(value)}`);
2849
+ }
2850
+ // A separator keeps {a:'1b'} from colliding with {a:'1',b:''}.
2851
+ return parts.join('|');
2852
+ }
2749
2853
  /**
2750
2854
  * The per-row rebuild signature. Selection and the plain data-index are
2751
2855
  * re-stamped on reuse (not here) so they never force a rebuild; this captures
2752
- * only what a re-stamp cannot repair: tree node state, per-row height, and —
2753
- * when a feature embeds the index in a row-scoped closure (row DnD drag index,
2754
- * master-detail toggle index) — the index itself.
2856
+ * the row's cell values plus what a re-stamp cannot repair: tree node state,
2857
+ * per-row height, and — when a feature embeds the index in a row-scoped
2858
+ * closure (row DnD drag index, master-detail toggle index) — the index itself.
2755
2859
  */
2756
2860
  rowSignature(rowData, index, structuralSig, treeRow) {
2757
- const parts = [structuralSig];
2861
+ const parts = [structuralSig, `v:${this.rowValueSignature(rowData)}`];
2758
2862
  if (treeRow)
2759
2863
  parts.push(`t:${treeRow.depth}:${treeRow.expanded ? 1 : 0}:${treeRow.hasChildren ? 1 : 0}`);
2760
2864
  if (this.rowHeightCallback)
@@ -2951,6 +3055,15 @@ let SniceTable = (() => {
2951
3055
  const active = page === this.currentPage ? ' pagination__btn--active' : '';
2952
3056
  return `<button class="pagination__btn pagination__page${active}" data-page="${page}">${page}</button>`;
2953
3057
  }
3058
+ /**
3059
+ * The column's display text, or null when the column declares no display
3060
+ * formatter. `formatter` (row-aware) is the display formatter and
3061
+ * `valueFormatter` its documented fallback, so `formatter` wins.
3062
+ */
3063
+ cellDisplayText(column, value, row) {
3064
+ const formatter = column.formatter || column.valueFormatter;
3065
+ return formatter ? String(formatter(value, row) ?? '') : null;
3066
+ }
2954
3067
  /** Create a cell element safely using createElement + setAttribute */
2955
3068
  createCellElement(column, value, row) {
2956
3069
  // E2: a custom renderCell bypasses the type-based cell entirely. A string
@@ -2975,22 +3088,38 @@ let SniceTable = (() => {
2975
3088
  if (column.align)
2976
3089
  el.setAttribute('align', column.align);
2977
3090
  el.setAttribute('in-table', 'true');
3091
+ // A declared display formatter makes the cell's value its DISPLAY text:
3092
+ // the pipeline (valueGetter -> formatter, valueFormatter as the fallback)
3093
+ // is resolved here, once, so the `value` channel a caller reads is what the
3094
+ // cell actually shows. The cell is marked `formatted` and handed a column
3095
+ // without the formatters, which keeps it from formatting again and tells
3096
+ // the shared presentation contract to paint the text over any type-specific
3097
+ // rendering (a rating/progress/link cell cannot render display text).
3098
+ const displayText = this.cellDisplayText(column, value, row);
3099
+ const cellColumn = displayText === null
3100
+ ? column
3101
+ : { ...column, formatter: undefined, valueFormatter: undefined };
2978
3102
  // Set the property directly so arrays/objects reach progress, sparkline,
2979
3103
  // JSON, action, and tag cells without a lossy attribute conversion. Keep a
2980
3104
  // primitive attribute for declarative inspection and CSS selectors.
2981
- if (column.type === 'sparkline' && value !== null && typeof value === 'object') {
3105
+ if (displayText !== null) {
3106
+ el.setAttribute('formatted', '');
3107
+ el.value = displayText;
3108
+ el.setAttribute('value', displayText);
3109
+ }
3110
+ else if (column.type === 'sparkline' && value !== null && typeof value === 'object') {
2982
3111
  el.setAttribute('value', JSON.stringify(value));
2983
3112
  if (Array.isArray(value))
2984
3113
  el.data = value;
2985
3114
  }
2986
3115
  else {
2987
3116
  el.value = value ?? '';
2988
- }
2989
- if (value === null || typeof value !== 'object') {
2990
- el.setAttribute('value', String(value ?? ''));
3117
+ if (value === null || typeof value !== 'object') {
3118
+ el.setAttribute('value', String(value ?? ''));
3119
+ }
2991
3120
  }
2992
3121
  // Column definition as property (for formatter access etc.)
2993
- el.column = column;
3122
+ el.column = cellColumn;
2994
3123
  // Row-aware formatters, conditional formatting, and action-cell events all
2995
3124
  // consume the originating row through the cell's property API.
2996
3125
  el.rowData = row ?? null;
@@ -3280,7 +3409,12 @@ let SniceTable = (() => {
3280
3409
  this.sortLocalData();
3281
3410
  }
3282
3411
  }
3283
- sortLocalData() {
3412
+ /**
3413
+ * Reorder `this.data` to the current client-side sort (or back to delivery
3414
+ * order when the sort was cleared). Split out of sortLocalData so a fresh
3415
+ * delivery can land sorted without re-entering the render/index bookkeeping.
3416
+ */
3417
+ applyLocalSortOrder() {
3284
3418
  if (!this.unsortedData.length) {
3285
3419
  this.unsortedData = [...this.data];
3286
3420
  }
@@ -3295,16 +3429,19 @@ let SniceTable = (() => {
3295
3429
  for (const { column, direction } of this.currentSort) {
3296
3430
  const colDef = this.columns.find(c => c.key === column);
3297
3431
  const customComparator = colDef?.sortComparator;
3432
+ // The value pipeline feeds BOTH sort paths: valueGetter "runs for
3433
+ // display, sort, aggregation", so a custom comparator sees the same
3434
+ // derived value the cell shows (remote columns routinely key on the
3435
+ // server's sort field and bridge the display with a getter).
3436
+ const aVal = colDef?.valueGetter ? colDef.valueGetter(a[column], a) : a[column];
3437
+ const bVal = colDef?.valueGetter ? colDef.valueGetter(b[column], b) : b[column];
3298
3438
  if (customComparator) {
3299
- const cmp = customComparator(a[column], b[column], direction);
3439
+ const cmp = customComparator(aVal, bVal, direction);
3300
3440
  if (cmp !== 0)
3301
3441
  return cmp;
3302
3442
  }
3303
3443
  else {
3304
- // Use value pipeline getter if available
3305
- const aVal = colDef?.valueGetter ? colDef.valueGetter(a[column], a) : (a[column] ?? '');
3306
- const bVal = colDef?.valueGetter ? colDef.valueGetter(b[column], b) : (b[column] ?? '');
3307
- const cmp = String(aVal).localeCompare(String(bVal), undefined, { numeric: true });
3444
+ const cmp = String(aVal ?? '').localeCompare(String(bVal ?? ''), undefined, { numeric: true });
3308
3445
  if (cmp !== 0)
3309
3446
  return direction === 'asc' ? cmp : -cmp;
3310
3447
  }
@@ -3313,6 +3450,9 @@ let SniceTable = (() => {
3313
3450
  });
3314
3451
  }
3315
3452
  this.settingSortedData = false;
3453
+ }
3454
+ sortLocalData() {
3455
+ this.applyLocalSortOrder();
3316
3456
  // Sort replaced this.data (new order + reference) — resync the row-index
3317
3457
  // map and drop the stale filtered snapshot before re-rendering. Render is
3318
3458
  // queued (not synchronous): sortLocalData is reachable from the currentSort