@svgrid/enterprise 3.0.2 → 3.1.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 (364) hide show
  1. package/LICENSE +94 -24
  2. package/README.md +36 -4
  3. package/dist/SvAdvancedFilter.svelte +1 -1
  4. package/dist/SvAlertsManager.svelte +2 -1
  5. package/dist/SvBoard.svelte +2 -1
  6. package/dist/SvExportMenu.svelte +4 -1
  7. package/dist/SvExportMenu.svelte.d.ts +0 -13
  8. package/dist/SvExpressionEditor.svelte +3 -3
  9. package/dist/SvFormulaBar.svelte +94 -20
  10. package/dist/SvFormulaBar.svelte.d.ts +7 -0
  11. package/dist/SvGridAlerts.svelte +49 -9
  12. package/dist/SvGridBoard.svelte +13 -8
  13. package/dist/SvGridBulkEditDrawer.svelte +26 -2
  14. package/dist/SvGridEditPanel.svelte +3 -0
  15. package/dist/SvGridScheduler.svelte +69 -40
  16. package/dist/SvGridSelectionBar.svelte +10 -3
  17. package/dist/SvPivotDesigner.svelte +198 -40
  18. package/dist/SvPivotDesigner.svelte.d.ts +27 -20
  19. package/dist/SvSheet.svelte +4043 -243
  20. package/dist/SvSheet.svelte.d.ts +76 -3
  21. package/dist/SvSheetChartSetup.svelte +151 -0
  22. package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
  23. package/dist/SvSheetComment.svelte +216 -31
  24. package/dist/SvSheetComment.svelte.d.ts +11 -11
  25. package/dist/SvSheetConditionalFormat.svelte +28 -31
  26. package/dist/SvSheetDataValidation.svelte +66 -42
  27. package/dist/SvSheetEditRanges.svelte +217 -0
  28. package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
  29. package/dist/SvSheetErrors.svelte +125 -0
  30. package/dist/SvSheetErrors.svelte.d.ts +20 -0
  31. package/dist/SvSheetEvaluate.svelte +133 -0
  32. package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
  33. package/dist/SvSheetFilterMenu.svelte +137 -34
  34. package/dist/SvSheetFilterMenu.svelte.d.ts +5 -0
  35. package/dist/SvSheetFindReplace.svelte +19 -19
  36. package/dist/SvSheetFormatCells.svelte +125 -81
  37. package/dist/SvSheetGoalSeek.svelte +17 -16
  38. package/dist/SvSheetInsertFunction.svelte +15 -13
  39. package/dist/SvSheetIteration.svelte +81 -0
  40. package/dist/SvSheetIteration.svelte.d.ts +10 -0
  41. package/dist/SvSheetLink.svelte +99 -0
  42. package/dist/SvSheetLink.svelte.d.ts +17 -0
  43. package/dist/SvSheetListPicker.svelte +4 -2
  44. package/dist/SvSheetListPicker.svelte.d.ts +0 -6
  45. package/dist/SvSheetManageRules.svelte +20 -18
  46. package/dist/SvSheetNameManager.svelte +17 -15
  47. package/dist/SvSheetPageSetup.svelte +159 -0
  48. package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
  49. package/dist/SvSheetPasteSpecial.svelte +22 -20
  50. package/dist/SvSheetPivot.svelte +220 -0
  51. package/dist/SvSheetPivot.svelte.d.ts +21 -0
  52. package/dist/SvSheetProtectSheet.svelte +81 -0
  53. package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
  54. package/dist/SvSheetRemoveDuplicates.svelte +13 -10
  55. package/dist/SvSheetRibbon.svelte +104 -51
  56. package/dist/SvSheetSizeDialog.svelte +4 -2
  57. package/dist/SvSheetSort.svelte +218 -0
  58. package/dist/SvSheetSort.svelte.d.ts +28 -0
  59. package/dist/SvSheetSparklines.svelte +135 -0
  60. package/dist/SvSheetSparklines.svelte.d.ts +14 -0
  61. package/dist/SvSheetTable.svelte +160 -0
  62. package/dist/SvSheetTable.svelte.d.ts +24 -0
  63. package/dist/SvSheetTabs.svelte +161 -31
  64. package/dist/SvSheetTabs.svelte.d.ts +22 -8
  65. package/dist/SvSheetTextToColumns.svelte +20 -20
  66. package/dist/SvSheetValidationAlert.svelte +8 -6
  67. package/dist/advanced-filter-enable.js +1 -1
  68. package/dist/alerts/alert-engine.d.ts +6 -0
  69. package/dist/alerts/alert-engine.js +21 -4
  70. package/dist/alerts/alert-formats.js +2 -0
  71. package/dist/alerts/alert-types.d.ts +1 -1
  72. package/dist/alerts.d.ts +1 -1
  73. package/dist/alerts.js +2 -2
  74. package/dist/board.js +2 -2
  75. package/dist/bulk-edit.d.ts +3 -1
  76. package/dist/bulk-edit.js +1 -1
  77. package/dist/cdn/svgrid-enterprise.svelte-external.js +39827 -16429
  78. package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
  79. package/dist/designer/assets/{SvChartMenu-D9hEeHar.js → SvChartMenu-BDoeqGz6.js} +1 -1
  80. package/dist/designer/assets/{SvDateTimePicker-DARvKUL2.js → SvDateTimePicker-DCPg7WGN.js} +1 -1
  81. package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
  82. package/dist/designer/assets/{SvGridChart-B8j1SSy3.js → SvGridChart-Cy1ATrWh.js} +2 -2
  83. package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
  84. package/dist/designer/assets/{SvGridChartPanel-pT6ITc2P.js → SvGridChartPanel-CATdVc9X.js} +3 -3
  85. package/dist/designer/assets/{SvGridChartView-bg281UA1.js → SvGridChartView-CmsZtCED.js} +1 -1
  86. package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
  87. package/dist/designer/assets/{SvTabs-UFCMTHXS.js → SvTabs-2mHC6oaz.js} +1 -1
  88. package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
  89. package/dist/designer/assets/{chart-cIPUsbM5.js → chart-Cn7MnNqA.js} +1 -1
  90. package/dist/designer/assets/{chart-panel-messages-DtTxpBUU.js → chart-panel-messages-Dz7PTIqT.js} +1 -1
  91. package/dist/designer/assets/{chart-summary-Czu_5epb.js → chart-summary-BD1qYB2R.js} +1 -1
  92. package/dist/designer/assets/{chart-trend-D5I5VEe8.js → chart-trend-B8xr5LuD.js} +1 -1
  93. package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
  94. package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
  95. package/dist/designer/assets/{focus-trap-CAreAhlU.js → focus-trap-V2-6Fy9I.js} +1 -1
  96. package/dist/designer/assets/{index-DwU7CAMm.js → index-BSjv6Qec.js} +317 -315
  97. package/dist/designer/assets/index-_JVFxt02.css +1 -0
  98. package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
  99. package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
  100. package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
  101. package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
  102. package/dist/designer/index.html +17 -16
  103. package/dist/export-pdf.d.ts +75 -0
  104. package/dist/export-pdf.js +216 -15
  105. package/dist/export.js +10 -2
  106. package/dist/gantt/SvGridGantt.svelte +2890 -0
  107. package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
  108. package/dist/gantt/gantt-config.d.ts +73 -0
  109. package/dist/gantt/gantt-config.js +1 -0
  110. package/dist/gantt/gantt-critical-path.d.ts +67 -0
  111. package/dist/gantt/gantt-critical-path.js +207 -0
  112. package/dist/gantt/gantt-model.d.ts +257 -0
  113. package/dist/gantt/gantt-model.js +651 -0
  114. package/dist/gantt/gantt-resources.d.ts +59 -0
  115. package/dist/gantt/gantt-resources.js +71 -0
  116. package/dist/gantt/gantt.d.ts +7 -0
  117. package/dist/gantt/gantt.js +36 -0
  118. package/dist/gantt/index.d.ts +15 -0
  119. package/dist/gantt/index.js +22 -0
  120. package/dist/gantt/timeline-arrows.d.ts +102 -0
  121. package/dist/gantt/timeline-arrows.js +181 -0
  122. package/dist/import.d.ts +2 -2
  123. package/dist/import.js +1 -1
  124. package/dist/index.d.ts +34 -7
  125. package/dist/index.js +44 -7
  126. package/dist/install.js +8 -1
  127. package/dist/license-core.d.ts +17 -1
  128. package/dist/license-core.js +16 -5
  129. package/dist/license.d.ts +18 -2
  130. package/dist/license.js +71 -6
  131. package/dist/node/studio.js +140 -8
  132. package/dist/pivot-enable.js +2 -2
  133. package/dist/scheduler-dependencies.d.ts +35 -0
  134. package/dist/scheduler-dependencies.js +36 -1
  135. package/dist/scheduler.js +2 -2
  136. package/dist/selection-bar.js +2 -2
  137. package/dist/server/SvGroupCell.svelte +213 -0
  138. package/dist/server/SvGroupCell.svelte.d.ts +62 -0
  139. package/dist/server/SvRowGroupPanel.svelte +322 -0
  140. package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
  141. package/dist/server/enable.d.ts +17 -0
  142. package/dist/server/enable.js +49 -0
  143. package/dist/server/index.d.ts +22 -0
  144. package/dist/server/index.js +24 -0
  145. package/dist/server/messages.d.ts +45 -0
  146. package/dist/server/messages.js +35 -0
  147. package/dist/server/server-group-model.d.ts +104 -0
  148. package/dist/server/server-group-model.js +272 -0
  149. package/dist/server/server-pivot.d.ts +46 -0
  150. package/dist/server/server-pivot.js +57 -0
  151. package/dist/server/server-row-model.d.ts +547 -0
  152. package/dist/server/server-row-model.js +1551 -0
  153. package/dist/server/server-selection.d.ts +99 -0
  154. package/dist/server/server-selection.js +215 -0
  155. package/dist/server/svgrid-adapter.d.ts +155 -0
  156. package/dist/server/svgrid-adapter.js +202 -0
  157. package/dist/sheet/ast.d.ts +45 -1
  158. package/dist/sheet/ast.js +14 -0
  159. package/dist/sheet/auto-filter.d.ts +58 -4
  160. package/dist/sheet/auto-filter.js +159 -11
  161. package/dist/sheet/autocomplete.d.ts +9 -0
  162. package/dist/sheet/autocomplete.js +90 -4
  163. package/dist/sheet/cell-images.d.ts +39 -0
  164. package/dist/sheet/cell-images.js +90 -0
  165. package/dist/sheet/cell-types.d.ts +58 -0
  166. package/dist/sheet/cell-types.js +96 -0
  167. package/dist/sheet/coerce.d.ts +40 -0
  168. package/dist/sheet/coerce.js +170 -3
  169. package/dist/sheet/comments.d.ts +43 -9
  170. package/dist/sheet/comments.js +85 -27
  171. package/dist/sheet/conditional-formats.d.ts +29 -6
  172. package/dist/sheet/conditional-formats.js +37 -12
  173. package/dist/sheet/csv.d.ts +32 -0
  174. package/dist/sheet/csv.js +158 -0
  175. package/dist/sheet/culture.d.ts +87 -0
  176. package/dist/sheet/culture.js +247 -0
  177. package/dist/sheet/delta.d.ts +102 -0
  178. package/dist/sheet/delta.js +203 -0
  179. package/dist/sheet/deps.d.ts +45 -1
  180. package/dist/sheet/deps.js +77 -2
  181. package/dist/sheet/document.d.ts +106 -4
  182. package/dist/sheet/document.js +204 -3
  183. package/dist/sheet/engine.d.ts +67 -0
  184. package/dist/sheet/engine.js +19 -0
  185. package/dist/sheet/entry.d.ts +8 -4
  186. package/dist/sheet/entry.js +171 -21
  187. package/dist/sheet/error-check.d.ts +49 -0
  188. package/dist/sheet/error-check.js +83 -0
  189. package/dist/sheet/evaluate-steps.d.ts +48 -0
  190. package/dist/sheet/evaluate-steps.js +196 -0
  191. package/dist/sheet/evaluate.d.ts +67 -0
  192. package/dist/sheet/evaluate.js +725 -13
  193. package/dist/sheet/filter-files.d.ts +37 -0
  194. package/dist/sheet/filter-files.js +465 -0
  195. package/dist/sheet/format-store.d.ts +15 -0
  196. package/dist/sheet/format-store.js +11 -1
  197. package/dist/sheet/from-rows.d.ts +14 -0
  198. package/dist/sheet/from-rows.js +50 -0
  199. package/dist/sheet/function-catalog.d.ts +1 -1
  200. package/dist/sheet/function-catalog.js +296 -5
  201. package/dist/sheet/functions.js +363 -91
  202. package/dist/sheet/index.d.ts +35 -8
  203. package/dist/sheet/index.js +35 -8
  204. package/dist/sheet/links.d.ts +57 -0
  205. package/dist/sheet/links.js +174 -0
  206. package/dist/sheet/messages.d.ts +778 -0
  207. package/dist/sheet/messages.js +806 -0
  208. package/dist/sheet/number-format.d.ts +52 -5
  209. package/dist/sheet/number-format.js +465 -68
  210. package/dist/sheet/objects.d.ts +106 -0
  211. package/dist/sheet/objects.js +149 -0
  212. package/dist/sheet/ods-document.d.ts +44 -0
  213. package/dist/sheet/ods-document.js +1275 -0
  214. package/dist/sheet/open-file.d.ts +26 -0
  215. package/dist/sheet/open-file.js +56 -0
  216. package/dist/sheet/outline.d.ts +82 -0
  217. package/dist/sheet/outline.js +228 -0
  218. package/dist/sheet/packs/array.d.ts +16 -0
  219. package/dist/sheet/packs/array.js +172 -0
  220. package/dist/sheet/packs/database.d.ts +42 -0
  221. package/dist/sheet/packs/database.js +142 -0
  222. package/dist/sheet/packs/engineering.d.ts +2 -0
  223. package/dist/sheet/packs/engineering.js +296 -0
  224. package/dist/sheet/packs/financial.d.ts +5 -0
  225. package/dist/sheet/packs/financial.js +220 -0
  226. package/dist/sheet/packs/math-stats.d.ts +2 -0
  227. package/dist/sheet/packs/math-stats.js +372 -0
  228. package/dist/sheet/packs/special.d.ts +44 -0
  229. package/dist/sheet/packs/special.js +187 -0
  230. package/dist/sheet/packs/stats-dist.d.ts +2 -0
  231. package/dist/sheet/packs/stats-dist.js +785 -0
  232. package/dist/sheet/packs/text-date.d.ts +2 -0
  233. package/dist/sheet/packs/text-date.js +332 -0
  234. package/dist/sheet/packs/trig.d.ts +2 -0
  235. package/dist/sheet/packs/trig.js +73 -0
  236. package/dist/sheet/page-setup.d.ts +73 -0
  237. package/dist/sheet/page-setup.js +73 -0
  238. package/dist/sheet/parse.js +42 -10
  239. package/dist/sheet/paste-special.d.ts +22 -0
  240. package/dist/sheet/paste-special.js +14 -5
  241. package/dist/sheet/pivot-range.d.ts +160 -0
  242. package/dist/sheet/pivot-range.js +333 -0
  243. package/dist/sheet/presence.d.ts +73 -0
  244. package/dist/sheet/presence.js +79 -0
  245. package/dist/sheet/print.d.ts +104 -0
  246. package/dist/sheet/print.js +169 -0
  247. package/dist/sheet/protection.d.ts +55 -1
  248. package/dist/sheet/protection.js +55 -2
  249. package/dist/sheet/rects.d.ts +1 -1
  250. package/dist/sheet/refs.d.ts +48 -0
  251. package/dist/sheet/refs.js +155 -8
  252. package/dist/sheet/ribbon-icons.d.ts +1 -1
  253. package/dist/sheet/ribbon-icons.js +186 -0
  254. package/dist/sheet/ribbon.d.ts +1 -1
  255. package/dist/sheet/ribbon.js +324 -23
  256. package/dist/sheet/sheet-kinds.d.ts +74 -0
  257. package/dist/sheet/sheet-kinds.js +91 -0
  258. package/dist/sheet/shortcuts.d.ts +13 -3
  259. package/dist/sheet/shortcuts.js +63 -12
  260. package/dist/sheet/sort.d.ts +51 -0
  261. package/dist/sheet/sort.js +107 -0
  262. package/dist/sheet/sparklines.d.ts +111 -0
  263. package/dist/sheet/sparklines.js +204 -0
  264. package/dist/sheet/table-styles.d.ts +74 -0
  265. package/dist/sheet/table-styles.js +152 -0
  266. package/dist/sheet/tables.d.ts +19 -0
  267. package/dist/sheet/tables.js +31 -0
  268. package/dist/sheet/tokenize.d.ts +18 -1
  269. package/dist/sheet/tokenize.js +60 -9
  270. package/dist/sheet/validation.d.ts +16 -0
  271. package/dist/sheet/validation.js +37 -0
  272. package/dist/sheet/workbook.d.ts +148 -3
  273. package/dist/sheet/workbook.js +742 -31
  274. package/dist/sheet/xls-cfb.d.ts +32 -0
  275. package/dist/sheet/xls-cfb.js +290 -0
  276. package/dist/sheet/xls-document.d.ts +10 -0
  277. package/dist/sheet/xls-document.js +1243 -0
  278. package/dist/sheet/xls-formula.d.ts +40 -0
  279. package/dist/sheet/xls-formula.js +569 -0
  280. package/dist/sheet/xlsx-document.d.ts +108 -0
  281. package/dist/sheet/xlsx-document.js +1849 -0
  282. package/dist/sheet/xlsx-drawing.d.ts +99 -0
  283. package/dist/sheet/xlsx-drawing.js +420 -0
  284. package/dist/sheet-enable.js +6 -7
  285. package/dist/sheet-text.d.ts +7 -0
  286. package/dist/sheet-text.js +29 -0
  287. package/dist/sources/auth-supabase.js +2 -2
  288. package/dist/sources/realtime-supabase.js +2 -2
  289. package/dist/sources/rest.d.ts +6 -2
  290. package/dist/sources/rest.js +42 -7
  291. package/dist/sources/supabase.d.ts +10 -1
  292. package/dist/sources/supabase.js +73 -40
  293. package/dist/studio/emit-project.js +14 -1
  294. package/dist/studio/index.js +1 -1
  295. package/dist/studio/project.d.ts +11 -2
  296. package/dist/studio/project.js +5 -2
  297. package/dist/studio/ui-components.generated.js +107 -2
  298. package/dist/sveltekit/in-memory.d.ts +2 -2
  299. package/dist/sveltekit/in-memory.js +125 -4
  300. package/dist/sveltekit/index.d.ts +1 -1
  301. package/dist/sveltekit/index.js +1 -1
  302. package/dist/sveltekit/query-plan.d.ts +50 -4
  303. package/dist/sveltekit/query-plan.js +25 -3
  304. package/dist/sveltekit/sql-source.d.ts +6 -0
  305. package/dist/sveltekit/sql-source.js +34 -6
  306. package/dist/sveltekit/sql.d.ts +31 -0
  307. package/dist/sveltekit/sql.js +135 -25
  308. package/dist/sveltekit/transport.d.ts +10 -2
  309. package/dist/sveltekit/transport.js +30 -6
  310. package/dist/upgrade-prompt.d.ts +1 -1
  311. package/dist/version.d.ts +1 -1
  312. package/dist/version.js +1 -1
  313. package/dist/watermark.js +35 -2
  314. package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
  315. package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
  316. package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
  317. package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
  318. package/dist/wc/SvField-B_kurx_P.js +149 -0
  319. package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
  320. package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
  321. package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
  322. package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
  323. package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
  324. package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
  325. package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
  326. package/dist/wc/SvModal-DrfOYYyX.js +189 -0
  327. package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
  328. package/dist/wc/chart-6OXlybVT.js +4341 -0
  329. package/dist/wc/chart-export-CeSADGfi.js +135 -0
  330. package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
  331. package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
  332. package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
  333. package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
  334. package/dist/wc/client-DQIzjDBG.js +3064 -0
  335. package/dist/wc/column-resize-DUPgynvc.js +101 -0
  336. package/dist/wc/date-format-DS-z_h9v.js +1130 -0
  337. package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
  338. package/dist/wc/editor-contract-peBDxir_.js +22 -0
  339. package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
  340. package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
  341. package/dist/wc/list-option-DrRyivWp.js +82 -0
  342. package/dist/wc/popover-WsGlvtQv.js +69 -0
  343. package/dist/wc/positioning-BiKLfu1E.js +112 -0
  344. package/dist/wc/react.d.ts +41 -0
  345. package/dist/wc/react.js +90 -0
  346. package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
  347. package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
  348. package/dist/wc/row-resize-limG_N1z.js +111 -0
  349. package/dist/wc/sv-sheet-element.d.ts +97 -0
  350. package/dist/wc/sv-sheet-element.js +44213 -0
  351. package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
  352. package/dist/wc/validate-BqDthkNr.js +88 -0
  353. package/dist/wc/vue.d.ts +31 -0
  354. package/dist/wc/vue.js +75 -0
  355. package/package.json +30 -5
  356. package/dist/designer/assets/GridMenus-BlsvL_aU.js +0 -8
  357. package/dist/designer/assets/SvGridCellEditor-C7uQXYds.js +0 -4
  358. package/dist/designer/assets/SvGridChartBuilder-kvyIU_Rl.js +0 -1
  359. package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
  360. package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
  361. package/dist/designer/assets/index-CMFgAoVV.css +0 -1
  362. package/dist/designer/assets/row-resize-DLktcqUK.js +0 -1
  363. package/dist/designer/assets/src-EdI3Xqds.js +0 -58
  364. package/dist/designer/assets/validate-h-aslRV9.js +0 -1
package/dist/index.js CHANGED
@@ -1,7 +1,10 @@
1
1
  export { setLicenseKey, clearLicenseKey, getLicenseKey, isLicenseKeySet, hasValidLicense, assertEnterpriseLicensed, nudgeEnterprise, checkLicenseKey,
2
2
  // Trial expiry. The built-in card already appears on its own once a trial
3
3
  // lapses; these are for hosts that would rather render their own banner.
4
- isLicenseExpired, getLicenseExpiry, } from './license.js';
4
+ isLicenseExpired, getLicenseExpiry,
5
+ // Editions. `licenseCovers` is the one most apps want: hide a Suite-only
6
+ // entry point rather than let it nudge.
7
+ licenseCovers, getLicenseEdition, nudgeEnterpriseFor, editionCovers, } from './license.js';
5
8
  export { parseLicenseExpiry } from './license-core.js';
6
9
  export { exportGrid, copyExportToClipboard, } from './export.js';
7
10
  export { default as SvExportMenu } from './SvExportMenu.svelte';
@@ -17,6 +20,12 @@ export { enableSchedulerView, SvGridScheduler } from './scheduler.js';
17
20
  // Kanban board view (Pro). `enableBoardView()` registers the renderer so
18
21
  // `<SvGrid board={...}>` shows lanes of cards. Config types live in @svgrid/grid.
19
22
  export { enableBoardView, SvGridBoard } from './board.js';
23
+ // Gantt view (Pro). `enableGanttView()` registers the renderer so
24
+ // `<SvGrid gantt={...}>` shows a task table beside a time chart. The `gantt`
25
+ // prop and its config types live in @svgrid/grid; the layout model, the
26
+ // planning helpers and the renderer are here. Also its own entry point,
27
+ // `@svgrid/enterprise/gantt`.
28
+ export * from './gantt/index.js';
20
29
  // Bulk-action bar over the row selection (Pro). `enableSelectionBar()` registers
21
30
  // the renderer so `<SvGrid selectionBar={...}>` floats a bar over the grid while
22
31
  // rows are selected. The prop + its config types live in @svgrid/grid.
@@ -30,16 +39,21 @@ export { default as SvGridBulkEditDrawer } from './SvGridBulkEditDrawer.svelte';
30
39
  export { enablePivot } from './pivot-enable.js';
31
40
  export { enableSheet } from './sheet-enable.js';
32
41
  export { createTableRegistry, isValidTableName, resolveTableRange, columnIndexOf, rowCountOf, } from './sheet/tables.js';
42
+ export { TABLE_STYLES, DEFAULT_TABLE_STYLE, NO_TABLE_STYLE, findTableStyle, tableStyleColours, tableStyleLabel, } from './sheet/table-styles.js';
33
43
  export { goalSeek, goalSeekCell, } from './sheet/goal-seek.js';
44
+ export { evaluationSteps, printNode, printValue, } from './sheet/evaluate-steps.js';
45
+ export { checkSheet, describeFinding, ERROR_MEANINGS, } from './sheet/error-check.js';
46
+ export { imageCall, isDrawableImageSource } from './sheet/cell-images.js';
47
+ export { livePresence, presenceOnSheet, presenceAnchor, presenceColour, presenceInitials, PRESENCE_COLOURS, } from './sheet/presence.js';
34
48
  export { default as SvSheetTabs } from './SvSheetTabs.svelte';
35
- export { createWorkbook, isValidSheetName, } from './sheet/workbook.js';
49
+ export { createWorkbook, isValidSheetName, cleanIteration, DEFAULT_ITERATION, } from './sheet/workbook.js';
36
50
  export { setWorkbook, getWorkbook } from './sheet/shortcuts.js';
37
51
  export { createSheetDocument, } from './sheet/document.js';
38
52
  export { shiftRect, shiftRects, subtractRect, rectContains, rectsIntersect, remapNotes, lineShift } from './sheet/rects.js';
39
- export { isLocked, rectsHaveLocked, rectsMixLocked, PROTECTED_MESSAGE } from './sheet/protection.js';
40
- export { commentAt, withComment, listComments, nextComment } from './sheet/comments.js';
53
+ export { isLocked, cellLocked, inEditRange, rectsHaveLocked, rectsMixLocked, PROTECTED_MESSAGE, PROTECTION_PERMISSIONS, defaultProtection, copyProtection, newEditRangeId, parseRangeText, rangeText, } from './sheet/protection.js';
54
+ export { commentAt, withComment, withThread, threadAt, threadOf, threadText, notesOf, isThreaded, listComments, nextComment, } from './sheet/comments.js';
41
55
  export { ruleAt, rulesIn, checkEntry, listChoices, shiftValidation, removeValidation, describeRule, dateValue, validationId, DEFAULT_ALERT_MESSAGE, OPERATOR_LABELS, } from './sheet/validation.js';
42
- export { ruleStats, evaluateCf, shiftCf, removeCf, cfIn, describeCf, scaleColor, iconIndex, hasStyle, cfId, CF_PRESET_STYLES, COLOR_SCALES, DATA_BAR_COLOR, } from './sheet/conditional-formats.js';
56
+ export { ruleStats, evaluateCf, shiftCf, removeCf, cfIn, describeCf, scaleColor, iconIndex, hasStyle, cfId, CF_PRESET_STYLES, COLOR_SCALES, DATA_BAR_COLOR, DATA_BAR_NEGATIVE_COLOR, } from './sheet/conditional-formats.js';
43
57
  export { mergePlan, unmergePlan, mergeDropsValues, mergesIn, mergeAt as sheetMergeAt, isCoveredCell, selectionMerged, toGridMerges, sortBlockedByMerges, reorderMerges, normalRect, } from './sheet/merges.js';
44
58
  export { distinctValues, hiddenRowsFor, passesFilter, isFiltering, withColumnFilter, valuesFilter, shiftAutoFilter, describeFilter, } from './sheet/auto-filter.js';
45
59
  export { splitText, textToColumns, guessDelimiter, findDuplicates, removeDuplicates, } from './sheet/transforms.js';
@@ -67,15 +81,34 @@ export { default as SvSheetNameManager } from './SvSheetNameManager.svelte';
67
81
  export { default as SvSheetGoalSeek } from './SvSheetGoalSeek.svelte';
68
82
  export { default as SvSheetTextToColumns } from './SvSheetTextToColumns.svelte';
69
83
  export { default as SvSheetRemoveDuplicates } from './SvSheetRemoveDuplicates.svelte';
84
+ export { default as SvSheetSort } from './SvSheetSort.svelte';
85
+ export { sortOrder, guessHeaderRow } from './sheet/sort.js';
86
+ export { documentToXlsxParts, documentFromXlsxParts, documentToXlsx, documentFromXlsx } from './sheet/xlsx-document.js';
87
+ export { csvText, csvRows, guessCsvSeparator, sheetStateFromCsv } from './sheet/csv.js';
88
+ export { sheetStateFromOds, documentFromOds, documentToOds, documentToOdsParts, formulaFromOdf, formulaToOdf } from './sheet/ods-document.js';
89
+ export { sheetStateFromXls, documentFromXls, documentToXls, isXlsFile } from './sheet/xls-document.js';
90
+ export { formulaFromRpn, rpnFromFormula } from './sheet/xls-formula.js';
91
+ export { documentFromFile, readSpreadsheetFile } from './sheet/open-file.js';
92
+ export { defaultPageSetup, copyPageSetup, marginPresetOf, shiftPageSetup, marginsCss, MARGIN_PRESETS, PAPER_SIZES, } from './sheet/page-setup.js';
93
+ export { sheetPrintHtml, printAreas } from './sheet/print.js';
94
+ export { sheetCellsFromRows, cellTextOf } from './sheet/from-rows.js';
95
+ export { builtinEngine } from './sheet/engine.js';
96
+ export { chartSpecOf, chartFromRange, shiftObject, shiftObjects, objectAt, copyObject, objectId, SHEET_CHART_TYPES, } from './sheet/objects.js';
97
+ export { sparklineSeries, sparklineAt, sparklineScale, sparklinesFromRange, clearSparklines, shiftSparkline, shiftSparklines, copySparkline, sparklineId, isColumnLocation, SPARKLINE_TYPES, } from './sheet/sparklines.js';
98
+ export { pivotFields, pivotFieldValues, pivotRecords, filteredRecords, pivotBlock, pivotLayout, pivotDrill, pivotFromRange, pivotWrittenRect, flattenPivotColumns, ALL_VALUES, shiftPivot, shiftPivots, copyPivot, pivotId, SHEET_PIVOT_AGGS, } from './sheet/pivot-range.js';
99
+ export { createDeltaStream, applySheetDelta, partsOfReasons, } from './sheet/delta.js';
100
+ export { linkAt, setLink, removeLink, listLinks, shiftLinks, copyLinks, parseLinkTarget, isSafeLinkTarget, linkTitle, } from './sheet/links.js';
70
101
  export { functionCatalog, FUNCTION_GROUPS } from './sheet/function-catalog.js';
71
102
  export { parseEntry, completeEntry } from './sheet/entry.js';
72
103
  export { cycleReference } from './sheet/edit-keys.js';
73
104
  export { RIBBON_TABS, ribbonItems, withDecimals, applyBorders, } from './sheet/ribbon.js';
74
105
  export { RIBBON_ICONS, RIBBON_ICON_NAMES } from './sheet/ribbon-icons.js';
75
106
  export { THEME_COLOURS, STANDARD_COLOURS, ALL_COLOURS, tint } from './sheet/palette.js';
107
+ export { defaultSheetMessages, defaultSheetTextMessages, defaultDialogMessages, ribbonMessageDefaults, resolveSheetMessages, formatMessage, } from './sheet/messages.js';
108
+ export { provideSheetText, useSheetText } from './sheet-text.js';
76
109
  export { default as SvRibbonIcon } from './SvRibbonIcon.svelte';
77
110
  export { move, selectRegion, selectLine, applyFormat, toggleFormat, preset, autoSum, structural, switchSheet, gridOf, } from './sheet/shortcuts.js';
78
- export { compileNumberFormat, formatWithPattern, FORMAT_PRESETS, } from './sheet/number-format.js';
111
+ export { compileNumberFormat, formatWithPattern, FORMAT_PRESETS, FORMAT_CATEGORY_PATTERNS, SPECIAL_FORMATS, formatCategory, accountingPattern, accountingParts, } from './sheet/number-format.js';
79
112
  export { createFormatStore, entryToStyle, borderShadows, } from './sheet/format-store.js';
80
113
  export { createNames, isValidName, } from './sheet/names.js';
81
114
  export { suggestFunctions, applySuggestion, signatureAt, partialAt, SIGNATURES, } from './sheet/autocomplete.js';
@@ -87,6 +120,7 @@ export { setFormatTarget, getFormatTarget, setFormatDialogHandler, } from './she
87
120
  export { parseFormula, parse as parseFormulaTokens } from './sheet/parse.js';
88
121
  export { tokenize as tokenizeFormula } from './sheet/tokenize.js';
89
122
  export { evaluate as evaluateFormula, formatValue as formatCellValue, } from './sheet/evaluate.js';
123
+ export { ARRAY_FUNCTIONS } from './sheet/packs/array.js';
90
124
  export { FUNCTIONS as SHEET_FUNCTIONS, withCustomFunctions, } from './sheet/functions.js';
91
125
  export { translateFormula, fixupReferences, renameSheetReferences, formatFormula, referenceSpans, REFERENCE_COLOURS, } from './sheet/refs.js';
92
126
  export { createDependencyGraph as createSheetDependencyGraph, precedentsOf, cellKey, parseCellKey, } from './sheet/deps.js';
@@ -114,7 +148,10 @@ export { dismissUnlicensedNudge } from './watermark.js';
114
148
  export { showUpgradePrompt, dismissUpgradePrompt, } from './upgrade-prompt.js';
115
149
  export { createPivotModel, pivotAggregators, filterCollapsedPivotRows, } from './pivot.js';
116
150
  export { titleCase, resolveIdField, schemaToColumns, schemaToFormFields, isFieldHidden, validateField, applyComputed, validateEntity, } from './schema.js';
117
- export { planQuery, coerce, createInMemoryDataSource, createKitDataSource, createKitHandlers, createSqlDataSource, planToSql, } from './sveltekit/index.js';
151
+ export { planQuery, coerce, createInMemoryDataSource, createKitDataSource, createKitHandlers, createSqlDataSource, planToSql, BUILTIN_AGGREGATORS, } from './sveltekit/index.js';
152
+ // Server-Side Row Model: lazy server-side grouping and tree data over the
153
+ // free grid's datasource contract. Also available as '@svgrid/enterprise/server'.
154
+ export { createServerRowModel, serverRowModelRows, serverRowModelNav, serverGroupText, defaultServerGroupMessages, resolveServerGroupMessages, GRAND_TOTAL_ROW_ID, GROUP_TOTAL_ROW_ID_PREFIX, createServerSelectionModel, buildPivotResultColumns, adaptCallbackDatasource, toCallbackDatasource, fromCallbackRequest, toCallbackRequest, fromCallbackFilterModel, toCallbackFilterModel, fromCallbackSelectionState, toCallbackSelectionState, isCallbackSelectionState, createServerGroupModel, serverGroupRows, serverGroupNav, enableServerRowModel, SvGroupCell, SvRowGroupPanel, } from './server/index.js';
118
155
  export { createSupabaseDataSource, createRestDataSource, offsetLimitAdapter, dummyJsonAdapter, jsonServerAdapter, introspectSupabaseTable, listSupabaseTables, createSupabaseRealtime, createRelationLookup, createSupabaseAuth, aggregateRows, chartFieldsFromSchema, normalizeFilters, buildEntitySchema, pickLabelField, linkRelationLabels, withEntityRules, withRelationLabels, reduceValue, kpiSeries, sparklinePoints, seriesDelta, formatKpiValue, dashboardFromSchema, } from './sources/index.js';
119
156
  export { buildInitialValues, controlKind, editMode, evalValidationRules, fieldState, sectionVisible, hasFieldConditions, rowId, stripHiddenValues, toSubmitValues, validateAll, visibleFormFields, } from './edit-panel.js';
120
157
  export { default as SvGridEditPanel } from './SvGridEditPanel.svelte';
package/dist/install.js CHANGED
@@ -9,10 +9,12 @@ import { aiFilter, aiSmartFill, aiSummarize, aiClassify, aiExport, aiFindAnomali
9
9
  import { createPivotModel, } from './pivot.js';
10
10
  import { enableSchedulerView } from './scheduler.js';
11
11
  import { enableBoardView } from './board.js';
12
+ import { enableGanttView } from './gantt/gantt.js';
12
13
  import { enableSelectionBar } from './selection-bar.js';
13
14
  import { enableAdvancedFilter } from './advanced-filter-enable.js';
14
15
  import { enablePivot } from './pivot-enable.js';
15
16
  import { enableSheet } from './sheet-enable.js';
17
+ import { enableServerRowModel } from './server/enable.js';
16
18
  /**
17
19
  * Augment a SvGridApi instance with Pro methods (`exportData`, `print`,
18
20
  * `ai.*`). Mutates and returns the same object so existing references
@@ -44,6 +46,8 @@ export function installEnterprise(api) {
44
46
  enableSchedulerView();
45
47
  // Register the Kanban board view (no-op without the `board` prop).
46
48
  enableBoardView();
49
+ // Register the Gantt view (no-op without the `gantt` prop).
50
+ enableGanttView();
47
51
  enableSelectionBar();
48
52
  // Register the export engine so built-in AI exports (aiExport) can write the
49
53
  // enterprise formats (xlsx / pdf / ...); free grids without it get the plan only.
@@ -54,6 +58,9 @@ export function installEnterprise(api) {
54
58
  // grid interprets a key itself only when nothing claims it, so a free grid
55
59
  // is unaffected.
56
60
  enableSheet();
61
+ // Raise the unlicensed nudge for the server-side row model. No registry to fill -
62
+ // the model hands the grid ordinary rows - so this only nudges when unlicensed.
63
+ enableServerRowModel();
57
64
  pro.pivot = {
58
65
  build: (config) => createPivotModel(pro.getData(), config),
59
66
  buildFrom: (data, config) =>
@@ -62,7 +69,7 @@ export function installEnterprise(api) {
62
69
  // the caller-side generic enforces.
63
70
  createPivotModel(data, config),
64
71
  };
65
- // Surface the soft-gate state at install time so the watermark appears
72
+ // Surface the unlicensed state at install time so the watermark appears
66
73
  // alongside the grid, not just after the user clicks Export.
67
74
  if (!isLicenseKeySet())
68
75
  emitUnlicensedNudge();
@@ -1,16 +1,32 @@
1
1
  export declare const VALID_PREFIX = "SVENTERPRISE-";
2
+ /**
3
+ * What an order bought. `grid` is the enterprise grid on its own; `suite` adds
4
+ * the spreadsheet and the Studio. Keys issued before editions existed carry no
5
+ * edition segment and read as `suite`, so nothing an existing customer already
6
+ * ships changes when this lands.
7
+ */
8
+ export type LicenseEdition = 'grid' | 'suite';
9
+ /** The three things an edition can gate. */
10
+ export type LicensedProduct = 'grid' | 'spreadsheet' | 'studio';
11
+ /** Does `edition` cover `product`? Pure, and the only place the answer lives. */
12
+ export declare function editionCovers(edition: LicenseEdition, product: LicensedProduct): boolean;
2
13
  export type LicenseStatus = 'unset' | 'invalid' | 'revoked' | 'dev' | 'eval' | 'licensed';
3
14
  export type LicenseInfo = {
4
15
  status: LicenseStatus;
5
16
  /** True when the key permits use (dev / eval / licensed). */
6
17
  valid: boolean;
18
+ /**
19
+ * What the key covers. Always `suite` for dev and eval keys, so a trial sees
20
+ * everything, and for any key that names no edition.
21
+ */
22
+ edition: LicenseEdition;
7
23
  /** Expiry encoded in the key, when it carries one. Undefined otherwise. */
8
24
  expiresAt?: Date;
9
25
  /**
10
26
  * True once `expiresAt` has passed. Deliberately does NOT clear `valid`:
11
27
  * an expired trial keeps working and the callers nudge instead. Turning a
12
28
  * lapsed key into a hard stop would break a running app on a date boundary,
13
- * which is exactly what a soft gate exists to avoid.
29
+ * which is exactly what the evaluation model exists to avoid.
14
30
  */
15
31
  expired?: boolean;
16
32
  };
@@ -4,10 +4,14 @@
4
4
  // "what a valid key is," so the two contexts can never drift.
5
5
  //
6
6
  // This is deliberately NOT crypto (see license.ts). It classifies a key string;
7
- // callers decide what to do with the result. The Studio is soft-gate only:
7
+ // callers decide what to do with the result. The Studio never blocks:
8
8
  // unlicensed use still works, it just nudges.
9
9
  import { REVOKED_KEYS } from './revoked.js';
10
10
  export const VALID_PREFIX = 'SVENTERPRISE-';
11
+ /** Does `edition` cover `product`? Pure, and the only place the answer lives. */
12
+ export function editionCovers(edition, product) {
13
+ return edition === 'suite' || product === 'grid';
14
+ }
11
15
  /**
12
16
  * Pull the expiry out of a key.
13
17
  *
@@ -62,12 +66,15 @@ export function parseLicenseExpiry(key) {
62
66
  /** Classify a license key string. Pure and side-effect-free.
63
67
  * `now` is injectable so expiry behaviour is testable without faking clocks. */
64
68
  export function checkLicenseKey(key, now = new Date()) {
69
+ // An unusable key reports `suite` rather than a narrower edition on purpose:
70
+ // callers branch on `valid` first, and an edition on a rejected key would
71
+ // read as though something had been granted.
65
72
  if (key == null || key === '')
66
- return { status: 'unset', valid: false };
73
+ return { status: 'unset', valid: false, edition: 'suite' };
67
74
  if (!key.startsWith(VALID_PREFIX))
68
- return { status: 'invalid', valid: false };
75
+ return { status: 'invalid', valid: false, edition: 'suite' };
69
76
  if (REVOKED_KEYS.has(key))
70
- return { status: 'revoked', valid: false };
77
+ return { status: 'revoked', valid: false, edition: 'suite' };
71
78
  const expiresAt = parseLicenseExpiry(key) ?? undefined;
72
79
  // Left undefined rather than false when the key encodes no date, so callers
73
80
  // can tell "not expired" apart from "no expiry to check".
@@ -77,5 +84,9 @@ export function checkLicenseKey(key, now = new Date()) {
77
84
  : key.startsWith('SVENTERPRISE-EVAL')
78
85
  ? 'eval'
79
86
  : 'licensed';
80
- return { status, valid: true, expiresAt, expired };
87
+ // Only a paid key can be narrowed: a trial evaluates the whole product, and
88
+ // `SVENTERPRISE-GRID` is an edition marker rather than a kind, so it lands in
89
+ // the same segment DEV and EVAL use.
90
+ const edition = status === 'licensed' && key.startsWith(`${VALID_PREFIX}GRID-`) ? 'grid' : 'suite';
91
+ return { status, valid: true, edition, expiresAt, expired };
81
92
  }
package/dist/license.d.ts CHANGED
@@ -1,5 +1,6 @@
1
+ import { type LicenseInfo, type LicensedProduct } from './license-core.js';
1
2
  import { type EnterpriseFeatureLabel } from './upgrade-prompt.js';
2
- export { checkLicenseKey, type LicenseInfo, type LicenseStatus } from './license-core.js';
3
+ export { checkLicenseKey, editionCovers, type LicenseInfo, type LicenseStatus, type LicenseEdition, type LicensedProduct, } from './license-core.js';
3
4
  export { dismissUnlicensedNudge } from './watermark.js';
4
5
  export declare function setLicenseKey(key: string): void;
5
6
  export declare function clearLicenseKey(): void;
@@ -21,11 +22,26 @@ export declare function isLicenseExpired(): boolean;
21
22
  /** When the current key lapses, or null if it encodes no expiry. */
22
23
  export declare function getLicenseExpiry(): Date | null;
23
24
  /**
24
- * Soft-gate a Pro surface: if the current key isn't valid, nudge (watermark +
25
+ * Gate a Pro surface: if the current key isn't valid, nudge (watermark +
25
26
  * one-time console log + a moment-of-intent upgrade card naming `feature`) and
26
27
  * return. NEVER throws and NEVER blocks - the feature always runs. This is the
27
28
  * gate the Studio uses, and it's safe to call on the server (the nudges no-op
28
29
  * without a DOM). Idempotent/self-throttling, so call it freely at chokepoints.
29
30
  */
30
31
  export declare function nudgeEnterprise(feature?: EnterpriseFeatureLabel): void;
32
+ /**
33
+ * True when the current key covers `product`. Use it to hide a Suite-only entry
34
+ * point in your own UI instead of letting it nudge. An unlicensed app returns
35
+ * false for everything, which keeps "no key" and "wrong edition" on the same
36
+ * side of the branch for UI purposes.
37
+ */
38
+ export declare function licenseCovers(product: LicensedProduct): boolean;
39
+ /** The edition the current key names, or null when no usable key is set. */
40
+ export declare function getLicenseEdition(): LicenseInfo['edition'] | null;
41
+ /**
42
+ * Gate a surface that an edition can exclude. Same contract as
43
+ * {@link nudgeEnterprise} - never throws, never blocks, safe on the server -
44
+ * but it also nudges a valid key that simply does not reach this product.
45
+ */
46
+ export declare function nudgeEnterpriseFor(product: LicensedProduct, feature?: EnterpriseFeatureLabel): void;
31
47
  export declare function assertEnterpriseLicensed(feature?: EnterpriseFeatureLabel): void;
package/dist/license.js CHANGED
@@ -6,7 +6,7 @@
6
6
  //
7
7
  // currentKey state -> result
8
8
  // ────────────────────────────────────────────────────────────────────
9
- // null (no key set) -> soft-gate: watermark + console.log,
9
+ // null (no key set) -> evaluation: watermark + console.log,
10
10
  // feature still runs
11
11
  // does not start with "SVENTERPRISE-" -> throws (programmer error)
12
12
  // in REVOKED_KEYS -> throws (revoked / leaked / expired)
@@ -15,13 +15,18 @@
15
15
  // an EXPIRED dev/eval key -> still works, but stops looking
16
16
  // licensed: watermark + a one-time
17
17
  // console notice naming the expiry date
18
- // + the upgrade card. Stays a soft gate
18
+ // + the upgrade card. Never blocks,
19
19
  // so a trial ending cannot break a build.
20
20
  // any other "SVENTERPRISE-..." -> works silently (paid production)
21
- import { checkLicenseKey, VALID_PREFIX } from './license-core.js';
21
+ //
22
+ // Editions cut across that matrix. A paid key names GRID or SUITE (and a key
23
+ // issued before editions existed reads as SUITE). `nudgeEnterpriseFor` is the
24
+ // gate for a surface a GRID key does not reach: same never-blocks contract, with
25
+ // its own console notice saying which edition covers it.
26
+ import { checkLicenseKey, editionCovers, VALID_PREFIX, } from './license-core.js';
22
27
  import { emitUnlicensedNudge } from './watermark.js';
23
28
  import { showUpgradePrompt } from './upgrade-prompt.js';
24
- export { checkLicenseKey } from './license-core.js';
29
+ export { checkLicenseKey, editionCovers, } from './license-core.js';
25
30
  // The nudge the key silences, on the same subpath as the key: an app that only
26
31
  // wants to set its licence imports `@svgrid/enterprise/license` and never
27
32
  // pulls the component barrel (the package has no `sideEffects` flag, so a
@@ -30,6 +35,9 @@ export { dismissUnlicensedNudge } from './watermark.js';
30
35
  let currentKey = null;
31
36
  let noticedDev = false;
32
37
  let noticedExpired = false;
38
+ /** One notice per product, not per call site: reaching four Studio seams on a
39
+ * Grid key is one licensing fact, not four. */
40
+ const noticedEdition = new Set();
33
41
  /** One-time console notice for a trial that has run out. Separate from the
34
42
  * dev/eval notice: that one says "not for production", this one says the
35
43
  * evaluation is over and names the date, which is the actionable part. */
@@ -50,11 +58,13 @@ export function setLicenseKey(key) {
50
58
  currentKey = key;
51
59
  noticedDev = false;
52
60
  noticedExpired = false;
61
+ noticedEdition.clear();
53
62
  }
54
63
  export function clearLicenseKey() {
55
64
  currentKey = null;
56
65
  noticedDev = false;
57
66
  noticedExpired = false;
67
+ noticedEdition.clear();
58
68
  }
59
69
  export function getLicenseKey() {
60
70
  return currentKey;
@@ -84,7 +94,7 @@ export function getLicenseExpiry() {
84
94
  return checkLicenseKey(currentKey).expiresAt ?? null;
85
95
  }
86
96
  /**
87
- * Soft-gate a Pro surface: if the current key isn't valid, nudge (watermark +
97
+ * Gate a Pro surface: if the current key isn't valid, nudge (watermark +
88
98
  * one-time console log + a moment-of-intent upgrade card naming `feature`) and
89
99
  * return. NEVER throws and NEVER blocks - the feature always runs. This is the
90
100
  * gate the Studio uses, and it's safe to call on the server (the nudges no-op
@@ -105,11 +115,66 @@ export function nudgeEnterprise(feature) {
105
115
  noticeExpired(info);
106
116
  showUpgradePrompt(feature, { expired: lapsedTrial });
107
117
  }
118
+ /** Human name for a product, for the console notice. */
119
+ const PRODUCT_LABEL = {
120
+ grid: 'the enterprise grid',
121
+ spreadsheet: 'the spreadsheet',
122
+ studio: 'the Studio',
123
+ };
124
+ /** One-time console notice for a feature the current edition does not cover.
125
+ * Distinct from the unlicensed nudge: the key is real and paid, it just does
126
+ * not reach this far, so the actionable part is which edition to move to. */
127
+ function noticeEdition(product) {
128
+ if (noticedEdition.has(product))
129
+ return;
130
+ noticedEdition.add(product);
131
+ // eslint-disable-next-line no-console
132
+ console.info(`@svgrid/enterprise: your Grid license does not cover ${PRODUCT_LABEL[product]}. ` +
133
+ 'Everything still works, but the watermark and upgrade notice stay until the ' +
134
+ 'license is upgraded to Suite. Contact sales@jqwidgets.com or see ' +
135
+ 'https://svgrid.com/pricing');
136
+ }
137
+ /**
138
+ * True when the current key covers `product`. Use it to hide a Suite-only entry
139
+ * point in your own UI instead of letting it nudge. An unlicensed app returns
140
+ * false for everything, which keeps "no key" and "wrong edition" on the same
141
+ * side of the branch for UI purposes.
142
+ */
143
+ export function licenseCovers(product) {
144
+ const info = checkLicenseKey(currentKey);
145
+ return info.valid && editionCovers(info.edition, product);
146
+ }
147
+ /** The edition the current key names, or null when no usable key is set. */
148
+ export function getLicenseEdition() {
149
+ const info = checkLicenseKey(currentKey);
150
+ return info.valid ? info.edition : null;
151
+ }
152
+ /**
153
+ * Gate a surface that an edition can exclude. Same contract as
154
+ * {@link nudgeEnterprise} - never throws, never blocks, safe on the server -
155
+ * but it also nudges a valid key that simply does not reach this product.
156
+ */
157
+ export function nudgeEnterpriseFor(product, feature) {
158
+ const info = checkLicenseKey(currentKey);
159
+ const covered = info.valid && editionCovers(info.edition, product);
160
+ if (covered && !info.expired)
161
+ return;
162
+ // A key that is valid, unexpired and merely out of edition is a different
163
+ // message from an unlicensed or lapsed one, so it gets its own notice. The
164
+ // watermark and the card are the same either way.
165
+ const outOfEdition = info.valid && info.expired !== true && !covered;
166
+ emitUnlicensedNudge();
167
+ if (outOfEdition)
168
+ noticeEdition(product);
169
+ else if (info.valid && info.expired === true)
170
+ noticeExpired(info);
171
+ showUpgradePrompt(feature, { expired: info.valid && info.expired === true });
172
+ }
108
173
  export function assertEnterpriseLicensed(feature) {
109
174
  const info = checkLicenseKey(currentKey);
110
175
  switch (info.status) {
111
176
  case 'unset':
112
- // Soft-gate: the feature still runs, but the user gets a watermark +
177
+ // Evaluation: the feature still runs, but the user gets a watermark +
113
178
  // a one-time console.log nudge directing them to pricing, plus a
114
179
  // contextual moment-of-intent upgrade card naming the feature they
115
180
  // just reached for.