snice 7.7.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 (216) 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 +5 -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 +1 -1
  29. package/dist/cdn/calendar/README.md +2 -2
  30. package/dist/cdn/calendar/snice-calendar.js +26 -2
  31. package/dist/cdn/calendar/snice-calendar.js.map +1 -1
  32. package/dist/cdn/calendar/snice-calendar.min.js +2 -2
  33. package/dist/cdn/calendar/snice-calendar.min.js.map +1 -1
  34. package/dist/cdn/camera/snice-camera.js +1 -1
  35. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  36. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  37. package/dist/cdn/card/snice-card.js +1 -1
  38. package/dist/cdn/carousel/snice-carousel.js +1 -1
  39. package/dist/cdn/cart/snice-cart.js +1 -1
  40. package/dist/cdn/chart/snice-chart.js +1 -1
  41. package/dist/cdn/chat/snice-chat.js +1 -1
  42. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  43. package/dist/cdn/chip/snice-chip.js +1 -1
  44. package/dist/cdn/code-block/snice-code-block.js +1 -1
  45. package/dist/cdn/color-display/snice-color-display.js +1 -1
  46. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  47. package/dist/cdn/command-palette/snice-command-palette.js +1 -1
  48. package/dist/cdn/comments/snice-comments.js +1 -1
  49. package/dist/cdn/countdown/snice-countdown.js +1 -1
  50. package/dist/cdn/cropper/snice-cropper.js +1 -1
  51. package/dist/cdn/data-card/snice-data-card.js +1 -1
  52. package/dist/cdn/date-picker/snice-date-picker.js +1 -1
  53. package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
  54. package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
  55. package/dist/cdn/diff/snice-diff.js +1 -1
  56. package/dist/cdn/divider/snice-divider.js +1 -1
  57. package/dist/cdn/doc/snice-doc.js +1 -1
  58. package/dist/cdn/draw/snice-draw.js +1 -1
  59. package/dist/cdn/drawer/snice-drawer.js +1 -1
  60. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  61. package/dist/cdn/estimate/snice-estimate.js +1 -1
  62. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  63. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  64. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  65. package/dist/cdn/flow/snice-flow.js +1 -1
  66. package/dist/cdn/form-layout/snice-form-layout.js +1 -1
  67. package/dist/cdn/funnel/snice-funnel.js +1 -1
  68. package/dist/cdn/gantt/snice-gantt.js +1 -1
  69. package/dist/cdn/gauge/snice-gauge.js +1 -1
  70. package/dist/cdn/grid/snice-grid.js +1 -1
  71. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  72. package/dist/cdn/image/snice-image.js +1 -1
  73. package/dist/cdn/input/snice-input.js +1 -1
  74. package/dist/cdn/invoice/snice-invoice.js +1 -1
  75. package/dist/cdn/kanban/snice-kanban.js +1 -1
  76. package/dist/cdn/key-value/snice-key-value.js +1 -1
  77. package/dist/cdn/kpi/snice-kpi.js +1 -1
  78. package/dist/cdn/layout/snice-layout.js +1 -1
  79. package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
  80. package/dist/cdn/link/snice-link.js +1 -1
  81. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  82. package/dist/cdn/list/snice-list.js +1 -1
  83. package/dist/cdn/location/snice-location.js +1 -1
  84. package/dist/cdn/login/snice-login.js +1 -1
  85. package/dist/cdn/map/snice-map.js +1 -1
  86. package/dist/cdn/markdown/snice-markdown.js +1 -1
  87. package/dist/cdn/masonry/snice-masonry.js +1 -1
  88. package/dist/cdn/menu/snice-menu.js +1 -1
  89. package/dist/cdn/message-strip/snice-message-strip.js +1 -1
  90. package/dist/cdn/modal/snice-modal.js +1 -1
  91. package/dist/cdn/music-player/snice-music-player.js +1 -1
  92. package/dist/cdn/nav/snice-nav.js +1 -1
  93. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  94. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  95. package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
  96. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  97. package/dist/cdn/pagination/snice-pagination.js +1 -1
  98. package/dist/cdn/paint/snice-paint.js +1 -1
  99. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  100. package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
  101. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  102. package/dist/cdn/popover/snice-popover.js +1 -1
  103. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  104. package/dist/cdn/product-card/snice-product-card.js +1 -1
  105. package/dist/cdn/progress/snice-progress.js +1 -1
  106. package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
  107. package/dist/cdn/qr-code/snice-qr-code.js +1 -1
  108. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  109. package/dist/cdn/radio/snice-radio.js +1 -1
  110. package/dist/cdn/range-slider/snice-range-slider.js +1 -1
  111. package/dist/cdn/rating/snice-rating.js +1 -1
  112. package/dist/cdn/receipt/snice-receipt.js +1 -1
  113. package/dist/cdn/recipe/snice-recipe.js +1 -1
  114. package/dist/cdn/runtime/README.md +2 -2
  115. package/dist/cdn/runtime/snice-runtime.esm.js +130 -31
  116. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  117. package/dist/cdn/runtime/snice-runtime.esm.min.js +1 -1
  118. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  119. package/dist/cdn/runtime/snice-runtime.js +130 -31
  120. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  121. package/dist/cdn/runtime/snice-runtime.min.js +1 -1
  122. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  123. package/dist/cdn/sankey/snice-sankey.js +1 -1
  124. package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
  125. package/dist/cdn/select/snice-select.js +1 -1
  126. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  127. package/dist/cdn/slider/snice-slider.js +1 -1
  128. package/dist/cdn/sortable/snice-sortable.js +1 -1
  129. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  130. package/dist/cdn/spinner/snice-spinner.js +1 -1
  131. package/dist/cdn/split-button/snice-split-button.js +1 -1
  132. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  133. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  134. package/dist/cdn/stat-group/snice-stat-group.js +1 -1
  135. package/dist/cdn/step-input/snice-step-input.js +1 -1
  136. package/dist/cdn/stepper/snice-stepper.js +1 -1
  137. package/dist/cdn/switch/snice-switch.js +1 -1
  138. package/dist/cdn/table/README.md +2 -2
  139. package/dist/cdn/table/snice-table.esm.js +157 -33
  140. package/dist/cdn/table/snice-table.esm.js.map +1 -1
  141. package/dist/cdn/table/snice-table.esm.min.js +4 -4
  142. package/dist/cdn/table/snice-table.esm.min.js.map +1 -1
  143. package/dist/cdn/table/snice-table.js +157 -33
  144. package/dist/cdn/table/snice-table.js.map +1 -1
  145. package/dist/cdn/table/snice-table.min.js +33 -33
  146. package/dist/cdn/table/snice-table.min.js.map +1 -1
  147. package/dist/cdn/tabs/snice-tabs.js +1 -1
  148. package/dist/cdn/tag/snice-tag.js +1 -1
  149. package/dist/cdn/tag-input/README.md +2 -2
  150. package/dist/cdn/tag-input/snice-tag-input.js +10 -16
  151. package/dist/cdn/tag-input/snice-tag-input.js.map +1 -1
  152. package/dist/cdn/tag-input/snice-tag-input.min.js +2 -2
  153. package/dist/cdn/tag-input/snice-tag-input.min.js.map +1 -1
  154. package/dist/cdn/terminal/snice-terminal.js +1 -1
  155. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  156. package/dist/cdn/textarea/snice-textarea.js +1 -1
  157. package/dist/cdn/time-picker/snice-time-picker.js +1 -1
  158. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  159. package/dist/cdn/timeline/snice-timeline.js +1 -1
  160. package/dist/cdn/timer/snice-timer.js +1 -1
  161. package/dist/cdn/toast/snice-toast.js +1 -1
  162. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  163. package/dist/cdn/tree/snice-tree.js +1 -1
  164. package/dist/cdn/treemap/snice-treemap.js +1 -1
  165. package/dist/cdn/user-card/snice-user-card.js +1 -1
  166. package/dist/cdn/video-player/snice-video-player.js +1 -1
  167. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  168. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  169. package/dist/cdn/weather/snice-weather.js +1 -1
  170. package/dist/cdn/work-order/snice-work-order.js +1 -1
  171. package/dist/components/calendar/snice-calendar.d.ts +2 -0
  172. package/dist/components/calendar/snice-calendar.js +25 -1
  173. package/dist/components/calendar/snice-calendar.js.map +1 -1
  174. package/dist/components/table/snice-row.d.ts +6 -0
  175. package/dist/components/table/snice-row.js +11 -3
  176. package/dist/components/table/snice-row.js.map +1 -1
  177. package/dist/components/table/snice-table.d.ts +31 -3
  178. package/dist/components/table/snice-table.js +89 -16
  179. package/dist/components/table/snice-table.js.map +1 -1
  180. package/dist/components/table/table-cell-presentation.d.ts +11 -0
  181. package/dist/components/table/table-cell-presentation.js +25 -8
  182. package/dist/components/table/table-cell-presentation.js.map +1 -1
  183. package/dist/components/table/table-export.d.ts +6 -0
  184. package/dist/components/table/table-export.js +11 -2
  185. package/dist/components/table/table-export.js.map +1 -1
  186. package/dist/components/table/table-master-detail.d.ts +11 -2
  187. package/dist/components/table/table-master-detail.js +20 -3
  188. package/dist/components/table/table-master-detail.js.map +1 -1
  189. package/dist/components/tag-input/snice-tag-input.d.ts +2 -2
  190. package/dist/components/tag-input/snice-tag-input.js +9 -15
  191. package/dist/components/tag-input/snice-tag-input.js.map +1 -1
  192. package/dist/index.cjs +127 -28
  193. package/dist/index.cjs.map +1 -1
  194. package/dist/index.esm.js +127 -28
  195. package/dist/index.esm.js.map +1 -1
  196. package/dist/index.iife.js +127 -28
  197. package/dist/index.iife.js.map +1 -1
  198. package/dist/react/SniceProvider.js +1 -1
  199. package/dist/react/SniceRouter.js +1 -1
  200. package/dist/react/index.js +1 -1
  201. package/dist/react/matchRoute.js +1 -1
  202. package/dist/react/useRequestHandler.js +1 -1
  203. package/dist/request-response.d.ts +24 -1
  204. package/dist/symbols.cjs +1 -1
  205. package/dist/symbols.esm.js +1 -1
  206. package/dist/testing-dom.cjs +1 -1
  207. package/dist/testing-dom.esm.js +1 -1
  208. package/dist/transitions.cjs +1 -1
  209. package/dist/transitions.esm.js +1 -1
  210. package/docs/ai/components/calendar.md +8 -0
  211. package/docs/ai/components/tag-input.md +4 -0
  212. package/docs/ai/controllers.md +22 -6
  213. package/docs/components/calendar.md +24 -0
  214. package/docs/components/tag-input.md +6 -1
  215. package/docs/controllers.md +57 -6
  216. package/package.json +1 -1
@@ -159,6 +159,15 @@ let SniceRow = (() => {
159
159
  this.updateRowAttributes();
160
160
  this.configureCells();
161
161
  }
162
+ /**
163
+ * The column's working value for this row: `valueGetter` runs for display
164
+ * here exactly as it does on the table's own render path, so a column whose
165
+ * key names a server field rather than a row field still paints.
166
+ */
167
+ cellValue(column) {
168
+ const raw = this.data?.[column.key];
169
+ return column.valueGetter ? column.valueGetter(raw, this.data) : raw;
170
+ }
162
171
  configureCells() {
163
172
  if (!this.columns) {
164
173
  return;
@@ -166,7 +175,7 @@ let SniceRow = (() => {
166
175
  this.columns.forEach((column, index) => {
167
176
  const cellElement = this.shadowRoot?.querySelector(`[data-column-index="${index}"]`);
168
177
  if (cellElement) {
169
- const value = this.data[column.key];
178
+ const value = this.cellValue(column);
170
179
  if (typeof column.renderCell === 'function') {
171
180
  const output = column.renderCell(value, this.data, column);
172
181
  const replacement = output instanceof HTMLElement ? output : document.createElement('span');
@@ -178,7 +187,7 @@ let SniceRow = (() => {
178
187
  return;
179
188
  }
180
189
  const formatter = column.formatter || column.valueFormatter;
181
- cellElement.value = formatter ? formatter(value, this.data) : value;
190
+ cellElement.value = formatter ? String(formatter(value, this.data) ?? '') : value;
182
191
  cellElement.column = formatter
183
192
  ? { ...column, type: 'text', formatter: undefined, valueFormatter: undefined }
184
193
  : column;
@@ -268,7 +277,6 @@ let SniceRow = (() => {
268
277
  `;
269
278
  }
270
279
  renderCell(column, columnIndex) {
271
- this.data[column.key];
272
280
  const cellComponent = this.getCellComponent(column.formatter || column.valueFormatter ? 'text' : column.type);
273
281
  return html /*html*/ `
274
282
  <div class="cell cell--${column.type}" part="cell" style="${this.getCellStyles(column)}">
@@ -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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"}
@@ -211,12 +211,28 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
211
211
  private rendererIdSeq;
212
212
  private rendererIdFor;
213
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;
214
230
  /**
215
231
  * The per-row rebuild signature. Selection and the plain data-index are
216
232
  * re-stamped on reuse (not here) so they never force a rebuild; this captures
217
- * only what a re-stamp cannot repair: tree node state, per-row height, and —
218
- * when a feature embeds the index in a row-scoped closure (row DnD drag index,
219
- * 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.
220
236
  */
221
237
  private rowSignature;
222
238
  /** Whether the row at `index` currently hosts an inline editor. */
@@ -242,6 +258,12 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
242
258
  private dispatchPageChange;
243
259
  renderPagination(): void;
244
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;
245
267
  /** Create a cell element safely using createElement + setAttribute */
246
268
  createCellElement(column: any, value: any, row?: any): HTMLElement;
247
269
  getCellTagName(type: string): string;
@@ -260,6 +282,12 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
260
282
  private updateRowSelectionStateFor;
261
283
  updateSelectAllState(): void;
262
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;
263
291
  private sortLocalData;
264
292
  private dispatchRowSelectionChanged;
265
293
  private dispatchRowClicked;
@@ -2008,8 +2008,14 @@ let SniceTable = (() => {
2008
2008
  if (this.settingSortedData)
2009
2009
  return;
2010
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();
2011
2017
  this.rebuildRowIndex();
2012
- this.masterDetail.prepare(this.data);
2018
+ this.masterDetail.prepare(this.data, row => this.rowValueSignature(row));
2013
2019
  if (this.settingDataImperative)
2014
2020
  return; // imperative setData(): caller renders
2015
2021
  this.scheduleRender('body');
@@ -2465,6 +2471,7 @@ let SniceTable = (() => {
2465
2471
  // Still render pagination
2466
2472
  if (this.pagination)
2467
2473
  this.renderPagination();
2474
+ this.updateSelectAllState();
2468
2475
  return;
2469
2476
  }
2470
2477
  if (this.data.length === 0 && this.columns.length > 0) {
@@ -2681,6 +2688,10 @@ let SniceTable = (() => {
2681
2688
  this.reconcileRows(entries);
2682
2689
  // Re-establish grid role + roving tabindex after the body changed.
2683
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();
2684
2695
  // Render pagination after body
2685
2696
  if (this.pagination) {
2686
2697
  this.renderPagination();
@@ -2813,15 +2824,41 @@ let SniceTable = (() => {
2813
2824
  `tree=${this.treeData.isEnabled() ? this.treeData.getGroupColumn() : ''}`,
2814
2825
  ].join('|');
2815
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
+ }
2816
2853
  /**
2817
2854
  * The per-row rebuild signature. Selection and the plain data-index are
2818
2855
  * re-stamped on reuse (not here) so they never force a rebuild; this captures
2819
- * only what a re-stamp cannot repair: tree node state, per-row height, and —
2820
- * when a feature embeds the index in a row-scoped closure (row DnD drag index,
2821
- * 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.
2822
2859
  */
2823
2860
  rowSignature(rowData, index, structuralSig, treeRow) {
2824
- const parts = [structuralSig];
2861
+ const parts = [structuralSig, `v:${this.rowValueSignature(rowData)}`];
2825
2862
  if (treeRow)
2826
2863
  parts.push(`t:${treeRow.depth}:${treeRow.expanded ? 1 : 0}:${treeRow.hasChildren ? 1 : 0}`);
2827
2864
  if (this.rowHeightCallback)
@@ -3018,6 +3055,15 @@ let SniceTable = (() => {
3018
3055
  const active = page === this.currentPage ? ' pagination__btn--active' : '';
3019
3056
  return `<button class="pagination__btn pagination__page${active}" data-page="${page}">${page}</button>`;
3020
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
+ }
3021
3067
  /** Create a cell element safely using createElement + setAttribute */
3022
3068
  createCellElement(column, value, row) {
3023
3069
  // E2: a custom renderCell bypasses the type-based cell entirely. A string
@@ -3042,22 +3088,38 @@ let SniceTable = (() => {
3042
3088
  if (column.align)
3043
3089
  el.setAttribute('align', column.align);
3044
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 };
3045
3102
  // Set the property directly so arrays/objects reach progress, sparkline,
3046
3103
  // JSON, action, and tag cells without a lossy attribute conversion. Keep a
3047
3104
  // primitive attribute for declarative inspection and CSS selectors.
3048
- 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') {
3049
3111
  el.setAttribute('value', JSON.stringify(value));
3050
3112
  if (Array.isArray(value))
3051
3113
  el.data = value;
3052
3114
  }
3053
3115
  else {
3054
3116
  el.value = value ?? '';
3055
- }
3056
- if (value === null || typeof value !== 'object') {
3057
- el.setAttribute('value', String(value ?? ''));
3117
+ if (value === null || typeof value !== 'object') {
3118
+ el.setAttribute('value', String(value ?? ''));
3119
+ }
3058
3120
  }
3059
3121
  // Column definition as property (for formatter access etc.)
3060
- el.column = column;
3122
+ el.column = cellColumn;
3061
3123
  // Row-aware formatters, conditional formatting, and action-cell events all
3062
3124
  // consume the originating row through the cell's property API.
3063
3125
  el.rowData = row ?? null;
@@ -3347,7 +3409,12 @@ let SniceTable = (() => {
3347
3409
  this.sortLocalData();
3348
3410
  }
3349
3411
  }
3350
- 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() {
3351
3418
  if (!this.unsortedData.length) {
3352
3419
  this.unsortedData = [...this.data];
3353
3420
  }
@@ -3362,16 +3429,19 @@ let SniceTable = (() => {
3362
3429
  for (const { column, direction } of this.currentSort) {
3363
3430
  const colDef = this.columns.find(c => c.key === column);
3364
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];
3365
3438
  if (customComparator) {
3366
- const cmp = customComparator(a[column], b[column], direction);
3439
+ const cmp = customComparator(aVal, bVal, direction);
3367
3440
  if (cmp !== 0)
3368
3441
  return cmp;
3369
3442
  }
3370
3443
  else {
3371
- // Use value pipeline getter if available
3372
- const aVal = colDef?.valueGetter ? colDef.valueGetter(a[column], a) : (a[column] ?? '');
3373
- const bVal = colDef?.valueGetter ? colDef.valueGetter(b[column], b) : (b[column] ?? '');
3374
- const cmp = String(aVal).localeCompare(String(bVal), undefined, { numeric: true });
3444
+ const cmp = String(aVal ?? '').localeCompare(String(bVal ?? ''), undefined, { numeric: true });
3375
3445
  if (cmp !== 0)
3376
3446
  return direction === 'asc' ? cmp : -cmp;
3377
3447
  }
@@ -3380,6 +3450,9 @@ let SniceTable = (() => {
3380
3450
  });
3381
3451
  }
3382
3452
  this.settingSortedData = false;
3453
+ }
3454
+ sortLocalData() {
3455
+ this.applyLocalSortOrder();
3383
3456
  // Sort replaced this.data (new order + reference) — resync the row-index
3384
3457
  // map and drop the stale filtered snapshot before re-rendering. Render is
3385
3458
  // queued (not synchronous): sortLocalData is reachable from the currentSort