snice 7.8.0 → 7.9.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 (302) hide show
  1. package/README.md +1 -1
  2. package/adapters/react/SniceProvider.js +1 -1
  3. package/adapters/react/SniceRouter.js +1 -1
  4. package/adapters/react/matchRoute.js +1 -1
  5. package/adapters/react/table.d.ts +1 -0
  6. package/adapters/react/table.d.ts.map +1 -1
  7. package/adapters/react/table.js +1 -1
  8. package/adapters/react/table.js.map +1 -1
  9. package/adapters/react/table.tsx +2 -1
  10. package/adapters/react/useRequestHandler.js +1 -1
  11. package/bin/analyzer-contracts.js +17 -1
  12. package/custom-elements.json +57 -3
  13. package/dist/cdn/accordion/snice-accordion.js +1 -1
  14. package/dist/cdn/action-bar/snice-action-bar.js +1 -1
  15. package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
  16. package/dist/cdn/alert/snice-alert.js +1 -1
  17. package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
  18. package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
  19. package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
  20. package/dist/cdn/availability/snice-availability.js +1 -1
  21. package/dist/cdn/avatar/snice-avatar.js +1 -1
  22. package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
  23. package/dist/cdn/badge/snice-badge.js +1 -1
  24. package/dist/cdn/banner/snice-banner.js +1 -1
  25. package/dist/cdn/binpack/snice-binpack.js +1 -1
  26. package/dist/cdn/book/snice-book.js +1 -1
  27. package/dist/cdn/booking/snice-booking.js +1 -1
  28. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
  29. package/dist/cdn/button/snice-button.js +1 -1
  30. package/dist/cdn/calendar/README.md +2 -2
  31. package/dist/cdn/calendar/snice-calendar.js +537 -44
  32. package/dist/cdn/calendar/snice-calendar.js.map +1 -1
  33. package/dist/cdn/calendar/snice-calendar.min.js +2 -2
  34. package/dist/cdn/calendar/snice-calendar.min.js.map +1 -1
  35. package/dist/cdn/camera/snice-camera.js +1 -1
  36. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  37. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  38. package/dist/cdn/card/snice-card.js +1 -1
  39. package/dist/cdn/carousel/snice-carousel.js +1 -1
  40. package/dist/cdn/cart/snice-cart.js +1 -1
  41. package/dist/cdn/chart/snice-chart.js +1 -1
  42. package/dist/cdn/chat/snice-chat.js +1 -1
  43. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  44. package/dist/cdn/chip/snice-chip.js +1 -1
  45. package/dist/cdn/code-block/README.md +2 -2
  46. package/dist/cdn/code-block/snice-code-block.js +177 -167
  47. package/dist/cdn/code-block/snice-code-block.js.map +1 -1
  48. package/dist/cdn/code-block/snice-code-block.min.js +2 -2
  49. package/dist/cdn/code-block/snice-code-block.min.js.map +1 -1
  50. package/dist/cdn/color-display/snice-color-display.js +1 -1
  51. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  52. package/dist/cdn/command-palette/README.md +1 -1
  53. package/dist/cdn/command-palette/snice-command-palette.js +2 -2
  54. package/dist/cdn/command-palette/snice-command-palette.js.map +1 -1
  55. package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
  56. package/dist/cdn/command-palette/snice-command-palette.min.js.map +1 -1
  57. package/dist/cdn/comments/snice-comments.js +1 -1
  58. package/dist/cdn/countdown/snice-countdown.js +1 -1
  59. package/dist/cdn/cropper/snice-cropper.js +1 -1
  60. package/dist/cdn/data-card/snice-data-card.js +1 -1
  61. package/dist/cdn/date-picker/snice-date-picker.js +1 -1
  62. package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
  63. package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
  64. package/dist/cdn/diff/snice-diff.js +1 -1
  65. package/dist/cdn/divider/snice-divider.js +1 -1
  66. package/dist/cdn/doc/snice-doc.js +1 -1
  67. package/dist/cdn/draw/snice-draw.js +1 -1
  68. package/dist/cdn/drawer/snice-drawer.js +1 -1
  69. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  70. package/dist/cdn/estimate/snice-estimate.js +1 -1
  71. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  72. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  73. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  74. package/dist/cdn/flow/snice-flow.js +1 -1
  75. package/dist/cdn/form-layout/snice-form-layout.js +1 -1
  76. package/dist/cdn/funnel/snice-funnel.js +1 -1
  77. package/dist/cdn/gantt/snice-gantt.js +1 -1
  78. package/dist/cdn/gauge/snice-gauge.js +1 -1
  79. package/dist/cdn/grid/snice-grid.js +1 -1
  80. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  81. package/dist/cdn/image/snice-image.js +1 -1
  82. package/dist/cdn/input/snice-input.js +1 -1
  83. package/dist/cdn/invoice/snice-invoice.js +1 -1
  84. package/dist/cdn/kanban/snice-kanban.js +1 -1
  85. package/dist/cdn/key-value/snice-key-value.js +1 -1
  86. package/dist/cdn/kpi/snice-kpi.js +1 -1
  87. package/dist/cdn/layout/snice-layout.js +1 -1
  88. package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
  89. package/dist/cdn/link/snice-link.js +1 -1
  90. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  91. package/dist/cdn/list/snice-list.js +1 -1
  92. package/dist/cdn/location/snice-location.js +1 -1
  93. package/dist/cdn/login/snice-login.js +1 -1
  94. package/dist/cdn/map/snice-map.js +1 -1
  95. package/dist/cdn/markdown/snice-markdown.js +1 -1
  96. package/dist/cdn/masonry/snice-masonry.js +1 -1
  97. package/dist/cdn/menu/snice-menu.js +1 -1
  98. package/dist/cdn/message-strip/snice-message-strip.js +1 -1
  99. package/dist/cdn/modal/snice-modal.js +1 -1
  100. package/dist/cdn/music-player/snice-music-player.js +1 -1
  101. package/dist/cdn/nav/snice-nav.js +1 -1
  102. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  103. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  104. package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
  105. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  106. package/dist/cdn/pagination/snice-pagination.js +1 -1
  107. package/dist/cdn/paint/snice-paint.js +1 -1
  108. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  109. package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
  110. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  111. package/dist/cdn/popover/snice-popover.js +1 -1
  112. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  113. package/dist/cdn/product-card/snice-product-card.js +1 -1
  114. package/dist/cdn/progress/snice-progress.js +2 -2
  115. package/dist/cdn/progress/snice-progress.js.map +1 -1
  116. package/dist/cdn/progress/snice-progress.min.js +1 -1
  117. package/dist/cdn/progress/snice-progress.min.js.map +1 -1
  118. package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
  119. package/dist/cdn/qr-code/README.md +2 -2
  120. package/dist/cdn/qr-code/snice-qr-code.js +19 -3
  121. package/dist/cdn/qr-code/snice-qr-code.js.map +1 -1
  122. package/dist/cdn/qr-code/snice-qr-code.min.js +2 -2
  123. package/dist/cdn/qr-code/snice-qr-code.min.js.map +1 -1
  124. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  125. package/dist/cdn/radio/snice-radio.js +1 -1
  126. package/dist/cdn/range-slider/snice-range-slider.js +1 -1
  127. package/dist/cdn/rating/snice-rating.js +1 -1
  128. package/dist/cdn/receipt/snice-receipt.js +5 -2
  129. package/dist/cdn/receipt/snice-receipt.js.map +1 -1
  130. package/dist/cdn/receipt/snice-receipt.min.js +1 -1
  131. package/dist/cdn/receipt/snice-receipt.min.js.map +1 -1
  132. package/dist/cdn/recipe/snice-recipe.js +1 -1
  133. package/dist/cdn/runtime/snice-runtime.esm.js +4 -4
  134. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  135. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  136. package/dist/cdn/runtime/snice-runtime.js +4 -4
  137. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  138. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  139. package/dist/cdn/sankey/snice-sankey.js +1 -1
  140. package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
  141. package/dist/cdn/select/README.md +2 -2
  142. package/dist/cdn/select/snice-select.js +6 -9
  143. package/dist/cdn/select/snice-select.js.map +1 -1
  144. package/dist/cdn/select/snice-select.min.js +2 -2
  145. package/dist/cdn/select/snice-select.min.js.map +1 -1
  146. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  147. package/dist/cdn/slider/snice-slider.js +1 -1
  148. package/dist/cdn/sortable/snice-sortable.js +1 -1
  149. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  150. package/dist/cdn/spinner/snice-spinner.js +1 -1
  151. package/dist/cdn/split-button/snice-split-button.js +1 -1
  152. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  153. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  154. package/dist/cdn/stat-group/snice-stat-group.js +1 -1
  155. package/dist/cdn/step-input/snice-step-input.js +1 -1
  156. package/dist/cdn/stepper/snice-stepper.js +1 -1
  157. package/dist/cdn/switch/snice-switch.js +1 -1
  158. package/dist/cdn/table/README.md +2 -2
  159. package/dist/cdn/table/snice-table.esm.js +1940 -407
  160. package/dist/cdn/table/snice-table.esm.js.map +1 -1
  161. package/dist/cdn/table/snice-table.esm.min.js +242 -53
  162. package/dist/cdn/table/snice-table.esm.min.js.map +1 -1
  163. package/dist/cdn/table/snice-table.js +1940 -407
  164. package/dist/cdn/table/snice-table.js.map +1 -1
  165. package/dist/cdn/table/snice-table.min.js +234 -45
  166. package/dist/cdn/table/snice-table.min.js.map +1 -1
  167. package/dist/cdn/tabs/snice-tabs.js +1 -1
  168. package/dist/cdn/tag/snice-tag.js +1 -1
  169. package/dist/cdn/tag-input/snice-tag-input.js +1 -1
  170. package/dist/cdn/terminal/snice-terminal.js +1 -1
  171. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  172. package/dist/cdn/textarea/snice-textarea.js +1 -1
  173. package/dist/cdn/time-picker/snice-time-picker.js +1 -1
  174. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  175. package/dist/cdn/timeline/snice-timeline.js +1 -1
  176. package/dist/cdn/timer/snice-timer.js +1 -1
  177. package/dist/cdn/toast/snice-toast.js +1 -1
  178. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  179. package/dist/cdn/tree/snice-tree.js +1 -1
  180. package/dist/cdn/treemap/snice-treemap.js +1 -1
  181. package/dist/cdn/user-card/snice-user-card.js +1 -1
  182. package/dist/cdn/video-player/snice-video-player.js +1 -1
  183. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  184. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  185. package/dist/cdn/weather/snice-weather.js +1 -1
  186. package/dist/cdn/work-order/snice-work-order.js +1 -1
  187. package/dist/components/calendar/snice-calendar.d.ts +187 -5
  188. package/dist/components/calendar/snice-calendar.js +537 -44
  189. package/dist/components/calendar/snice-calendar.js.map +1 -1
  190. package/dist/components/calendar/snice-calendar.types.d.ts +2 -1
  191. package/dist/components/code-block/formatter.d.ts +6 -0
  192. package/dist/components/code-block/formatter.js +174 -164
  193. package/dist/components/code-block/formatter.js.map +1 -1
  194. package/dist/components/code-block/grammars/snice.json +1 -1
  195. package/dist/components/code-block/grammars/typescript.json +1 -1
  196. package/dist/components/command-palette/snice-command-palette.js +1 -1
  197. package/dist/components/command-palette/snice-command-palette.js.map +1 -1
  198. package/dist/components/progress/snice-progress.js +1 -1
  199. package/dist/components/progress/snice-progress.js.map +1 -1
  200. package/dist/components/qr-code/qrcode.d.ts +1 -1
  201. package/dist/components/qr-code/qrcode.js +18 -2
  202. package/dist/components/qr-code/qrcode.js.map +1 -1
  203. package/dist/components/receipt/snice-receipt.js +4 -1
  204. package/dist/components/receipt/snice-receipt.js.map +1 -1
  205. package/dist/components/select/snice-select.d.ts +1 -1
  206. package/dist/components/select/snice-select.js +5 -8
  207. package/dist/components/select/snice-select.js.map +1 -1
  208. package/dist/components/table/snice-cell-actions.js +1 -1
  209. package/dist/components/table/snice-cell-actions.js.map +1 -1
  210. package/dist/components/table/snice-cell-color.js +1 -1
  211. package/dist/components/table/snice-cell-color.js.map +1 -1
  212. package/dist/components/table/snice-cell-date.js +20 -8
  213. package/dist/components/table/snice-cell-date.js.map +1 -1
  214. package/dist/components/table/snice-cell-email.js +1 -1
  215. package/dist/components/table/snice-cell-email.js.map +1 -1
  216. package/dist/components/table/snice-cell-image.js +1 -1
  217. package/dist/components/table/snice-cell-image.js.map +1 -1
  218. package/dist/components/table/snice-cell-json.js +1 -1
  219. package/dist/components/table/snice-cell-json.js.map +1 -1
  220. package/dist/components/table/snice-cell-link.js +1 -1
  221. package/dist/components/table/snice-cell-link.js.map +1 -1
  222. package/dist/components/table/snice-cell-location.js +1 -1
  223. package/dist/components/table/snice-cell-location.js.map +1 -1
  224. package/dist/components/table/snice-cell-phone.js +1 -1
  225. package/dist/components/table/snice-cell-phone.js.map +1 -1
  226. package/dist/components/table/snice-cell-status.js +1 -1
  227. package/dist/components/table/snice-cell-status.js.map +1 -1
  228. package/dist/components/table/snice-cell.d.ts +10 -0
  229. package/dist/components/table/snice-cell.js +59 -13
  230. package/dist/components/table/snice-cell.js.map +1 -1
  231. package/dist/components/table/snice-row.d.ts +0 -1
  232. package/dist/components/table/snice-row.js +4 -10
  233. package/dist/components/table/snice-row.js.map +1 -1
  234. package/dist/components/table/snice-table.d.ts +170 -2
  235. package/dist/components/table/snice-table.js +868 -189
  236. package/dist/components/table/snice-table.js.map +1 -1
  237. package/dist/components/table/snice-table.types.d.ts +17 -0
  238. package/dist/components/table/table-cell-presentation.d.ts +17 -4
  239. package/dist/components/table/table-cell-presentation.js +37 -11
  240. package/dist/components/table/table-cell-presentation.js.map +1 -1
  241. package/dist/components/table/table-column-manager.d.ts +153 -2
  242. package/dist/components/table/table-column-manager.js +364 -43
  243. package/dist/components/table/table-column-manager.js.map +1 -1
  244. package/dist/components/table/table-date.d.ts +29 -0
  245. package/dist/components/table/table-date.js +78 -0
  246. package/dist/components/table/table-date.js.map +1 -0
  247. package/dist/components/table/table-export.js +6 -2
  248. package/dist/components/table/table-export.js.map +1 -1
  249. package/dist/components/table/table-filter-engine.d.ts +9 -0
  250. package/dist/components/table/table-filter-engine.js +58 -14
  251. package/dist/components/table/table-filter-engine.js.map +1 -1
  252. package/dist/components/table/table-keyboard.d.ts +8 -0
  253. package/dist/components/table/table-keyboard.js +14 -3
  254. package/dist/components/table/table-keyboard.js.map +1 -1
  255. package/dist/components/table/table-toolbar.js +1 -0
  256. package/dist/components/table/table-toolbar.js.map +1 -1
  257. package/dist/components/table/table-tree-data.d.ts +2 -0
  258. package/dist/components/table/table-tree-data.js +35 -9
  259. package/dist/components/table/table-tree-data.js.map +1 -1
  260. package/dist/components/table/table-virtualizer.d.ts +44 -7
  261. package/dist/components/table/table-virtualizer.js +101 -54
  262. package/dist/components/table/table-virtualizer.js.map +1 -1
  263. package/dist/components/theme/theme.css +9 -0
  264. package/dist/index.cjs +1 -1
  265. package/dist/index.esm.js +1 -1
  266. package/dist/index.iife.js +1 -1
  267. package/dist/react/SniceProvider.js +1 -1
  268. package/dist/react/SniceRouter.js +1 -1
  269. package/dist/react/index.js +1 -1
  270. package/dist/react/matchRoute.js +1 -1
  271. package/dist/react/useRequestHandler.js +1 -1
  272. package/dist/symbols.cjs +1 -1
  273. package/dist/symbols.esm.js +1 -1
  274. package/dist/testing-dom.cjs +1 -1
  275. package/dist/testing-dom.esm.js +1 -1
  276. package/dist/transitions.cjs +1 -1
  277. package/dist/transitions.esm.js +1 -1
  278. package/docs/ai/DEVELOPMENT.md +93 -2
  279. package/docs/ai/components/calendar.md +113 -10
  280. package/docs/ai/components/code-block.md +4 -0
  281. package/docs/ai/components/doc.md +1 -1
  282. package/docs/ai/components/progress.md +1 -0
  283. package/docs/ai/components/receipt.md +1 -1
  284. package/docs/ai/components/table.md +29 -30
  285. package/docs/ai/components/theme.md +1 -0
  286. package/docs/ai/events.md +30 -0
  287. package/docs/ai/theme.md +1 -0
  288. package/docs/components/calendar.md +171 -11
  289. package/docs/components/code-block.md +2 -0
  290. package/docs/components/doc.md +1 -1
  291. package/docs/components/progress.md +13 -0
  292. package/docs/components/receipt.md +1 -0
  293. package/docs/components/table.md +274 -15
  294. package/docs/components/theme.md +5 -0
  295. package/docs/events.md +49 -0
  296. package/docs/plans/2026-03-06-date-range-picker-plan.md +4 -4
  297. package/docs/plans/2026-03-07-table-mui-parity-design.md +1 -1
  298. package/docs/plans/2026-03-09-action-bar-plan.md +11 -11
  299. package/docs/superpowers/specs/2026-07-09-table-incredible-design.md +1 -1
  300. package/docs/superpowers/specs/2026-07-09-table-phase0-implementation.md +2 -2
  301. package/package.json +3 -1
  302. package/vscode.html-custom-data.json +13 -1
@@ -4,6 +4,12 @@
4
4
  * Rules are defined in grammar JSON files under "formatters" section.
5
5
  * The engine scans code char by char, tracks string/comment context,
6
6
  * and applies newline/space/indent rules based on regex char classes.
7
+ *
8
+ * Semantics: a code display formats authored code — it does not re-flow it.
9
+ * Author line breaks are preserved; rule-driven newlines fire only where
10
+ * they do not duplicate an author break and are suppressed inside
11
+ * parentheses/bracket depth. Leading indentation is renormalized from the
12
+ * indent/dedent char-class depth.
7
13
  */
8
14
  /**
9
15
  * Format code using declarative rules.
@@ -12,7 +18,6 @@ function formatCode(code, rules) {
12
18
  const tabSize = rules.tabSize ?? 2;
13
19
  const useTabs = rules.useTabs ?? false;
14
20
  const indentUnit = useTabs ? '\t' : ' '.repeat(tabSize);
15
- const trimTrailing = rules.trimTrailing ?? true;
16
21
  const skipStrings = rules.skipStrings ?? true;
17
22
  const skipComments = rules.skipComments ?? true;
18
23
  const newlineAfter = rules.newlineAfter ? new RegExp(rules.newlineAfter) : null;
@@ -22,206 +27,211 @@ function formatCode(code, rules) {
22
27
  const spaceAround = rules.spaceAround ? new RegExp(rules.spaceAround) : null;
23
28
  const indentRe = rules.indent ? new RegExp(rules.indent) : null;
24
29
  const dedentRe = rules.dedent ? new RegExp(rules.dedent) : null;
25
- // Strip existing formatting: collapse whitespace outside strings/comments
26
- const stripped = stripWhitespace(code, skipStrings, skipComments);
27
- // Build formatted output
28
- let result = '';
30
+ // Chars whose newline rules stay active inside […] depth: JSON-style
31
+ // structural brackets and separators must keep exploding one-liners.
32
+ const bracketExemptRe = /[[\],]/;
33
+ const lines = [];
34
+ let line = '';
35
+ let lineHasContent = false;
36
+ let needIndent = false;
37
+ // True while the current line begins inside a string/block comment: its
38
+ // content is emitted verbatim, never re-indented or rule-processed.
39
+ let inContinuation = false;
40
+ let pendingSpace = false;
29
41
  let depth = 0;
30
- let lineStart = true;
42
+ let parenDepth = 0;
43
+ let bracketDepth = 0;
44
+ // One flag per open indent group: did a line break occur inside it? A
45
+ // closing char only starts its own line when the group it closes is
46
+ // multi-line, so `import { a } from 'x'` never breaks.
47
+ const brokenGroups = [];
31
48
  let inString = null;
32
- let inComment = false; // block comment
49
+ let inBlockComment = false;
33
50
  let inLineComment = false;
34
- for (let i = 0; i < stripped.length; i++) {
35
- const ch = stripped[i];
36
- const prev = i > 0 ? stripped[i - 1] : '';
37
- const next = i + 1 < stripped.length ? stripped[i + 1] : '';
38
- // Track string context
39
- if (!inComment && !inLineComment && skipStrings) {
40
- if (inString) {
41
- result += ch;
42
- if (ch === inString && prev !== '\\') {
43
- inString = null;
44
- }
45
- continue;
51
+ /** Rule-driven newlines are suppressed inside () or (for non-bracket
52
+ * chars) inside [], so `({ ... })`, `f([a, b])` and `for (;;)` never
53
+ * explode. */
54
+ const newlineSuppressed = (ch) => {
55
+ if (parenDepth > 0)
56
+ return true;
57
+ if (bracketDepth > 0 && !bracketExemptRe.test(ch))
58
+ return true;
59
+ return false;
60
+ };
61
+ const beginLine = () => {
62
+ line = '';
63
+ lineHasContent = false;
64
+ needIndent = true;
65
+ pendingSpace = false;
66
+ inContinuation = inString !== null || inBlockComment;
67
+ if (brokenGroups.length > 0)
68
+ brokenGroups[brokenGroups.length - 1] = true;
69
+ };
70
+ const endLine = () => {
71
+ lines.push(line.replace(/[ \t]+$/, ''));
72
+ beginLine();
73
+ };
74
+ const appendContent = (ch) => {
75
+ if (needIndent) {
76
+ needIndent = false;
77
+ // Current depth, not a line-start snapshot: a dedent char re-indents
78
+ // its own line (the closing brace drops back before being written).
79
+ if (!inContinuation)
80
+ line += indentUnit.repeat(depth);
81
+ }
82
+ if (pendingSpace) {
83
+ line += ' ';
84
+ pendingSpace = false;
85
+ }
86
+ line += ch;
87
+ lineHasContent = true;
88
+ };
89
+ beginLine();
90
+ for (let i = 0; i < code.length; i++) {
91
+ const ch = code[i];
92
+ const next = i + 1 < code.length ? code[i + 1] : '';
93
+ // Line comment content: verbatim until the author newline
94
+ if (inLineComment) {
95
+ if (ch === '\n') {
96
+ inLineComment = false;
97
+ endLine();
46
98
  }
47
- if (ch === '"' || ch === "'" || ch === '`') {
48
- inString = ch;
49
- if (lineStart) {
50
- result += indentUnit.repeat(depth);
51
- lineStart = false;
52
- }
53
- result += ch;
54
- continue;
99
+ else {
100
+ appendContent(ch);
55
101
  }
102
+ continue;
56
103
  }
57
- // Track comment context
58
- if (skipComments) {
59
- if (inLineComment) {
60
- result += ch;
61
- if (ch === '\n') {
62
- inLineComment = false;
63
- lineStart = true;
64
- }
104
+ // Block comment content: verbatim, may span lines
105
+ if (inBlockComment) {
106
+ if (ch === '\n') {
107
+ endLine();
65
108
  continue;
66
109
  }
67
- if (inComment) {
68
- result += ch;
69
- if (ch === '/' && prev === '*') {
70
- inComment = false;
71
- }
110
+ appendContent(ch);
111
+ if (ch === '/' && code[i - 1] === '*')
112
+ inBlockComment = false;
113
+ continue;
114
+ }
115
+ // String content: verbatim, may span lines (template literals)
116
+ if (inString) {
117
+ if (ch === '\n') {
118
+ endLine();
72
119
  continue;
73
120
  }
121
+ appendContent(ch);
122
+ if (ch === inString && code[i - 1] !== '\\')
123
+ inString = null;
124
+ continue;
125
+ }
126
+ // Entering a string
127
+ if (skipStrings && (ch === '"' || ch === "'" || ch === '`')) {
128
+ inString = ch;
129
+ appendContent(ch);
130
+ continue;
131
+ }
132
+ // Entering a comment
133
+ if (skipComments) {
74
134
  if (ch === '/' && next === '/') {
75
- if (lineStart) {
76
- result += indentUnit.repeat(depth);
77
- lineStart = false;
78
- }
79
135
  inLineComment = true;
80
- result += ch;
136
+ appendContent(ch);
81
137
  continue;
82
138
  }
83
139
  if (ch === '/' && next === '*') {
84
- if (lineStart) {
85
- result += indentUnit.repeat(depth);
86
- lineStart = false;
87
- }
88
- inComment = true;
89
- result += ch;
140
+ inBlockComment = true;
141
+ appendContent(ch);
90
142
  continue;
91
143
  }
92
144
  }
93
- // Dedent before the char
145
+ // Author newline: preserved
146
+ if (ch === '\n') {
147
+ endLine();
148
+ continue;
149
+ }
150
+ if (ch === '\r') {
151
+ if (next !== '\n')
152
+ endLine();
153
+ continue;
154
+ }
155
+ // Whitespace within a line: collapsed to a single pending space;
156
+ // leading indentation is dropped (renormalized from depth)
157
+ if (ch === ' ' || ch === '\t') {
158
+ if (lineHasContent)
159
+ pendingSpace = true;
160
+ continue;
161
+ }
162
+ // Bracket/paren depth (outside strings/comments)
163
+ if (ch === '(')
164
+ parenDepth++;
165
+ else if (ch === ')')
166
+ parenDepth = Math.max(0, parenDepth - 1);
167
+ else if (ch === '[')
168
+ bracketDepth++;
169
+ else if (ch === ']')
170
+ bracketDepth = Math.max(0, bracketDepth - 1);
171
+ // Dedent before the char; a closer pops its group's multi-line flag
172
+ let closesBrokenGroup = false;
94
173
  if (dedentRe && dedentRe.test(ch)) {
95
174
  depth = Math.max(0, depth - 1);
175
+ closesBrokenGroup = brokenGroups.pop() ?? false;
96
176
  }
97
- // Newline before
98
- if (newlineBefore && newlineBefore.test(ch)) {
99
- if (!lineStart) {
100
- result = trimTrailingSpaces(result);
101
- result += '\n';
102
- lineStart = true;
103
- }
177
+ // Newline before (only where it does not duplicate an author break, and
178
+ // for closers only when the group being closed is multi-line)
179
+ if (newlineBefore && newlineBefore.test(ch) && lineHasContent &&
180
+ !newlineSuppressed(ch) && (!dedentRe || !dedentRe.test(ch) || closesBrokenGroup)) {
181
+ endLine();
104
182
  }
105
- // Space before (including spaceAround)
106
- if ((spaceBefore && spaceBefore.test(ch)) || (spaceAround && spaceAround.test(ch))) {
107
- if (!lineStart && result.length > 0 && result[result.length - 1] !== ' ' && result[result.length - 1] !== '\n') {
108
- result += ' ';
109
- }
183
+ // Space before (including spaceAround). A rule char glued to a
184
+ // preceding operator char is a compound operator (`+=`, `===`), not a
185
+ // fresh token it keeps its left side.
186
+ const prevRaw = i > 0 ? code[i - 1] : '';
187
+ const partOfOperator = prevRaw !== '' && !/[ \t\n\r]/.test(prevRaw) && /[+\-*/%=<>!&|^~?:]/.test(prevRaw);
188
+ if (((spaceBefore && spaceBefore.test(ch)) || (spaceAround && spaceAround.test(ch))) &&
189
+ lineHasContent && !partOfOperator) {
190
+ pendingSpace = true;
110
191
  }
111
- // Write indent if at line start
112
- if (lineStart && ch !== '\n') {
113
- result += indentUnit.repeat(depth);
114
- lineStart = false;
115
- }
116
- result += ch;
192
+ appendContent(ch);
117
193
  // Indent after the char
118
194
  if (indentRe && indentRe.test(ch)) {
119
195
  depth++;
196
+ brokenGroups.push(false);
120
197
  }
121
- // Space after (including spaceAround)
198
+ // Space after (including spaceAround). An `=` directly followed by
199
+ // another `=` is an equality chain and `=>` is an arrow — not two tokens.
122
200
  if ((spaceAfter && spaceAfter.test(ch)) || (spaceAround && spaceAround.test(ch))) {
123
- if (next && next !== '\n' && next !== ' ') {
124
- result += ' ';
201
+ const continuesOperator = ch === '=' && (next === '=' || next === '>');
202
+ if (next && next !== ' ' && next !== '\t' && next !== '\n' && next !== '\r' && !continuesOperator) {
203
+ pendingSpace = true;
125
204
  }
126
205
  }
127
- // Newline after
128
- if (newlineAfter && newlineAfter.test(ch)) {
129
- result = trimTrailingSpaces(result);
130
- result += '\n';
131
- lineStart = true;
206
+ // Newline after: fires only where it does not duplicate an author
207
+ // break or detach a same-line trailing comment
208
+ if (newlineAfter && newlineAfter.test(ch) && !newlineSuppressed(ch)) {
209
+ let j = i + 1;
210
+ while (j < code.length && (code[j] === ' ' || code[j] === '\t'))
211
+ j++;
212
+ const ahead = j < code.length ? code[j] : '';
213
+ const atAuthorBreak = ahead === '' || ahead === '\n' || ahead === '\r';
214
+ const atTrailingComment = ahead === '/' && (code[j + 1] === '/' || code[j + 1] === '*');
215
+ if (!atAuthorBreak && !atTrailingComment) {
216
+ endLine();
217
+ }
132
218
  }
133
219
  }
220
+ lines.push(line.replace(/[ \t]+$/, ''));
134
221
  // Post-processing
135
- let lines = result.split('\n');
136
- if (trimTrailing) {
137
- lines = lines.map(l => l.replace(/\s+$/, ''));
222
+ let out = lines;
223
+ if (rules.trimTrailing ?? true) {
224
+ out = out.map(l => l.replace(/[ \t]+$/, ''));
138
225
  }
139
226
  if (rules.collapseBlankLines !== undefined) {
140
- lines = collapseBlankLinesArr(lines, rules.collapseBlankLines);
227
+ out = collapseBlankLinesArr(out, rules.collapseBlankLines);
141
228
  }
142
229
  // Trim leading/trailing blank lines
143
- while (lines.length > 0 && lines[0].trim() === '')
144
- lines.shift();
145
- while (lines.length > 0 && lines[lines.length - 1].trim() === '')
146
- lines.pop();
147
- return lines.join('\n');
148
- }
149
- /**
150
- * Strip existing whitespace: replace runs of whitespace (outside strings/comments)
151
- * with a single space, and remove all newlines.
152
- */
153
- function stripWhitespace(code, skipStrings, skipComments) {
154
- let result = '';
155
- let inString = null;
156
- let inComment = false;
157
- let inLineComment = false;
158
- for (let i = 0; i < code.length; i++) {
159
- const ch = code[i];
160
- const prev = i > 0 ? code[i - 1] : '';
161
- const next = i + 1 < code.length ? code[i + 1] : '';
162
- // Track strings
163
- if (!inComment && !inLineComment && skipStrings) {
164
- if (inString) {
165
- result += ch;
166
- if (ch === inString && prev !== '\\') {
167
- inString = null;
168
- }
169
- continue;
170
- }
171
- if (ch === '"' || ch === "'" || ch === '`') {
172
- inString = ch;
173
- result += ch;
174
- continue;
175
- }
176
- }
177
- // Track comments
178
- if (skipComments) {
179
- if (inLineComment) {
180
- if (ch === '\n') {
181
- inLineComment = false;
182
- // Emit the newline so line comments stay separate
183
- result += ch;
184
- }
185
- else {
186
- result += ch;
187
- }
188
- continue;
189
- }
190
- if (inComment) {
191
- result += ch;
192
- if (ch === '/' && prev === '*') {
193
- inComment = false;
194
- }
195
- continue;
196
- }
197
- if (ch === '/' && next === '/') {
198
- inLineComment = true;
199
- result += ch;
200
- continue;
201
- }
202
- if (ch === '/' && next === '*') {
203
- inComment = true;
204
- result += ch;
205
- continue;
206
- }
207
- }
208
- // Collapse whitespace
209
- if (/\s/.test(ch)) {
210
- if (result.length > 0 && !/\s/.test(result[result.length - 1])) {
211
- result += ' ';
212
- }
213
- }
214
- else {
215
- result += ch;
216
- }
217
- }
218
- return result;
219
- }
220
- function trimTrailingSpaces(s) {
221
- let end = s.length;
222
- while (end > 0 && s[end - 1] === ' ')
223
- end--;
224
- return s.slice(0, end);
230
+ while (out.length > 0 && out[0].trim() === '')
231
+ out.shift();
232
+ while (out.length > 0 && out[out.length - 1].trim() === '')
233
+ out.pop();
234
+ return out.join('\n');
225
235
  }
226
236
  function collapseBlankLinesArr(lines, max) {
227
237
  const result = [];
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.js","sources":["../../../../components/code-block/formatter.ts"],"sourcesContent":["/**\n * Declarative grammar-based code formatter for snice-code-block.\n *\n * Rules are defined in grammar JSON files under \"formatters\" section.\n * The engine scans code char by char, tracks string/comment context,\n * and applies newline/space/indent rules based on regex char classes.\n */\n\nexport interface FormatRules {\n tabSize?: number;\n useTabs?: boolean;\n newlineAfter?: string;\n newlineBefore?: string;\n spaceAfter?: string;\n spaceBefore?: string;\n spaceAround?: string;\n indent?: string;\n dedent?: string;\n trimTrailing?: boolean;\n collapseBlankLines?: number;\n skipStrings?: boolean;\n skipComments?: boolean;\n}\n\n/**\n * Format code using declarative rules.\n */\nexport function formatCode(code: string, rules: FormatRules): string {\n const tabSize = rules.tabSize ?? 2;\n const useTabs = rules.useTabs ?? false;\n const indentUnit = useTabs ? '\\t' : ' '.repeat(tabSize);\n const trimTrailing = rules.trimTrailing ?? true;\n const skipStrings = rules.skipStrings ?? true;\n const skipComments = rules.skipComments ?? true;\n\n const newlineAfter = rules.newlineAfter ? new RegExp(rules.newlineAfter) : null;\n const newlineBefore = rules.newlineBefore ? new RegExp(rules.newlineBefore) : null;\n const spaceAfter = rules.spaceAfter ? new RegExp(rules.spaceAfter) : null;\n const spaceBefore = rules.spaceBefore ? new RegExp(rules.spaceBefore) : null;\n const spaceAround = rules.spaceAround ? new RegExp(rules.spaceAround) : null;\n const indentRe = rules.indent ? new RegExp(rules.indent) : null;\n const dedentRe = rules.dedent ? new RegExp(rules.dedent) : null;\n\n // Strip existing formatting: collapse whitespace outside strings/comments\n const stripped = stripWhitespace(code, skipStrings, skipComments);\n\n // Build formatted output\n let result = '';\n let depth = 0;\n let lineStart = true;\n let inString: string | null = null;\n let inComment = false; // block comment\n let inLineComment = false;\n\n for (let i = 0; i < stripped.length; i++) {\n const ch = stripped[i];\n const prev = i > 0 ? stripped[i - 1] : '';\n const next = i + 1 < stripped.length ? stripped[i + 1] : '';\n\n // Track string context\n if (!inComment && !inLineComment && skipStrings) {\n if (inString) {\n result += ch;\n if (ch === inString && prev !== '\\\\') {\n inString = null;\n }\n continue;\n }\n if (ch === '\"' || ch === \"'\" || ch === '`') {\n inString = ch;\n if (lineStart) {\n result += indentUnit.repeat(depth);\n lineStart = false;\n }\n result += ch;\n continue;\n }\n }\n\n // Track comment context\n if (skipComments) {\n if (inLineComment) {\n result += ch;\n if (ch === '\\n') {\n inLineComment = false;\n lineStart = true;\n }\n continue;\n }\n if (inComment) {\n result += ch;\n if (ch === '/' && prev === '*') {\n inComment = false;\n }\n continue;\n }\n if (ch === '/' && next === '/') {\n if (lineStart) {\n result += indentUnit.repeat(depth);\n lineStart = false;\n }\n inLineComment = true;\n result += ch;\n continue;\n }\n if (ch === '/' && next === '*') {\n if (lineStart) {\n result += indentUnit.repeat(depth);\n lineStart = false;\n }\n inComment = true;\n result += ch;\n continue;\n }\n }\n\n // Dedent before the char\n if (dedentRe && dedentRe.test(ch)) {\n depth = Math.max(0, depth - 1);\n }\n\n // Newline before\n if (newlineBefore && newlineBefore.test(ch)) {\n if (!lineStart) {\n result = trimTrailingSpaces(result);\n result += '\\n';\n lineStart = true;\n }\n }\n\n // Space before (including spaceAround)\n if ((spaceBefore && spaceBefore.test(ch)) || (spaceAround && spaceAround.test(ch))) {\n if (!lineStart && result.length > 0 && result[result.length - 1] !== ' ' && result[result.length - 1] !== '\\n') {\n result += ' ';\n }\n }\n\n // Write indent if at line start\n if (lineStart && ch !== '\\n') {\n result += indentUnit.repeat(depth);\n lineStart = false;\n }\n\n result += ch;\n\n // Indent after the char\n if (indentRe && indentRe.test(ch)) {\n depth++;\n }\n\n // Space after (including spaceAround)\n if ((spaceAfter && spaceAfter.test(ch)) || (spaceAround && spaceAround.test(ch))) {\n if (next && next !== '\\n' && next !== ' ') {\n result += ' ';\n }\n }\n\n // Newline after\n if (newlineAfter && newlineAfter.test(ch)) {\n result = trimTrailingSpaces(result);\n result += '\\n';\n lineStart = true;\n }\n }\n\n // Post-processing\n let lines = result.split('\\n');\n\n if (trimTrailing) {\n lines = lines.map(l => l.replace(/\\s+$/, ''));\n }\n\n if (rules.collapseBlankLines !== undefined) {\n lines = collapseBlankLinesArr(lines, rules.collapseBlankLines);\n }\n\n // Trim leading/trailing blank lines\n while (lines.length > 0 && lines[0].trim() === '') lines.shift();\n while (lines.length > 0 && lines[lines.length - 1].trim() === '') lines.pop();\n\n return lines.join('\\n');\n}\n\n/**\n * Strip existing whitespace: replace runs of whitespace (outside strings/comments)\n * with a single space, and remove all newlines.\n */\nfunction stripWhitespace(code: string, skipStrings: boolean, skipComments: boolean): string {\n let result = '';\n let inString: string | null = null;\n let inComment = false;\n let inLineComment = false;\n\n for (let i = 0; i < code.length; i++) {\n const ch = code[i];\n const prev = i > 0 ? code[i - 1] : '';\n const next = i + 1 < code.length ? code[i + 1] : '';\n\n // Track strings\n if (!inComment && !inLineComment && skipStrings) {\n if (inString) {\n result += ch;\n if (ch === inString && prev !== '\\\\') {\n inString = null;\n }\n continue;\n }\n if (ch === '\"' || ch === \"'\" || ch === '`') {\n inString = ch;\n result += ch;\n continue;\n }\n }\n\n // Track comments\n if (skipComments) {\n if (inLineComment) {\n if (ch === '\\n') {\n inLineComment = false;\n // Emit the newline so line comments stay separate\n result += ch;\n } else {\n result += ch;\n }\n continue;\n }\n if (inComment) {\n result += ch;\n if (ch === '/' && prev === '*') {\n inComment = false;\n }\n continue;\n }\n if (ch === '/' && next === '/') {\n inLineComment = true;\n result += ch;\n continue;\n }\n if (ch === '/' && next === '*') {\n inComment = true;\n result += ch;\n continue;\n }\n }\n\n // Collapse whitespace\n if (/\\s/.test(ch)) {\n if (result.length > 0 && !/\\s/.test(result[result.length - 1])) {\n result += ' ';\n }\n } else {\n result += ch;\n }\n }\n\n return result;\n}\n\nfunction trimTrailingSpaces(s: string): string {\n let end = s.length;\n while (end > 0 && s[end - 1] === ' ') end--;\n return s.slice(0, end);\n}\n\nfunction collapseBlankLinesArr(lines: string[], max: number): string[] {\n const result: string[] = [];\n let blankCount = 0;\n\n for (const line of lines) {\n if (line.trim() === '') {\n blankCount++;\n if (blankCount <= max) {\n result.push(line);\n }\n } else {\n blankCount = 0;\n result.push(line);\n }\n }\n\n return result;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formatter.js","sources":["../../../../components/code-block/formatter.ts"],"sourcesContent":["/**\n * Declarative grammar-based code formatter for snice-code-block.\n *\n * Rules are defined in grammar JSON files under \"formatters\" section.\n * The engine scans code char by char, tracks string/comment context,\n * and applies newline/space/indent rules based on regex char classes.\n *\n * Semantics: a code display formats authored code — it does not re-flow it.\n * Author line breaks are preserved; rule-driven newlines fire only where\n * they do not duplicate an author break and are suppressed inside\n * parentheses/bracket depth. Leading indentation is renormalized from the\n * indent/dedent char-class depth.\n */\n\nexport interface FormatRules {\n tabSize?: number;\n useTabs?: boolean;\n newlineAfter?: string;\n newlineBefore?: string;\n spaceAfter?: string;\n spaceBefore?: string;\n spaceAround?: string;\n indent?: string;\n dedent?: string;\n trimTrailing?: boolean;\n collapseBlankLines?: number;\n skipStrings?: boolean;\n skipComments?: boolean;\n}\n\n/**\n * Format code using declarative rules.\n */\nexport function formatCode(code: string, rules: FormatRules): string {\n const tabSize = rules.tabSize ?? 2;\n const useTabs = rules.useTabs ?? false;\n const indentUnit = useTabs ? '\\t' : ' '.repeat(tabSize);\n const skipStrings = rules.skipStrings ?? true;\n const skipComments = rules.skipComments ?? true;\n\n const newlineAfter = rules.newlineAfter ? new RegExp(rules.newlineAfter) : null;\n const newlineBefore = rules.newlineBefore ? new RegExp(rules.newlineBefore) : null;\n const spaceAfter = rules.spaceAfter ? new RegExp(rules.spaceAfter) : null;\n const spaceBefore = rules.spaceBefore ? new RegExp(rules.spaceBefore) : null;\n const spaceAround = rules.spaceAround ? new RegExp(rules.spaceAround) : null;\n const indentRe = rules.indent ? new RegExp(rules.indent) : null;\n const dedentRe = rules.dedent ? new RegExp(rules.dedent) : null;\n\n // Chars whose newline rules stay active inside […] depth: JSON-style\n // structural brackets and separators must keep exploding one-liners.\n const bracketExemptRe = /[[\\],]/;\n\n const lines: string[] = [];\n let line = '';\n let lineHasContent = false;\n let needIndent = false;\n // True while the current line begins inside a string/block comment: its\n // content is emitted verbatim, never re-indented or rule-processed.\n let inContinuation = false;\n let pendingSpace = false;\n let depth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n // One flag per open indent group: did a line break occur inside it? A\n // closing char only starts its own line when the group it closes is\n // multi-line, so `import { a } from 'x'` never breaks.\n const brokenGroups: boolean[] = [];\n\n let inString: string | null = null;\n let inBlockComment = false;\n let inLineComment = false;\n\n /** Rule-driven newlines are suppressed inside () or (for non-bracket\n * chars) inside [], so `({ ... })`, `f([a, b])` and `for (;;)` never\n * explode. */\n const newlineSuppressed = (ch: string): boolean => {\n if (parenDepth > 0) return true;\n if (bracketDepth > 0 && !bracketExemptRe.test(ch)) return true;\n return false;\n };\n\n const beginLine = (): void => {\n line = '';\n lineHasContent = false;\n needIndent = true;\n pendingSpace = false;\n inContinuation = inString !== null || inBlockComment;\n if (brokenGroups.length > 0) brokenGroups[brokenGroups.length - 1] = true;\n };\n\n const endLine = (): void => {\n lines.push(line.replace(/[ \\t]+$/, ''));\n beginLine();\n };\n\n const appendContent = (ch: string): void => {\n if (needIndent) {\n needIndent = false;\n // Current depth, not a line-start snapshot: a dedent char re-indents\n // its own line (the closing brace drops back before being written).\n if (!inContinuation) line += indentUnit.repeat(depth);\n }\n if (pendingSpace) {\n line += ' ';\n pendingSpace = false;\n }\n line += ch;\n lineHasContent = true;\n };\n\n beginLine();\n\n for (let i = 0; i < code.length; i++) {\n const ch = code[i];\n const next = i + 1 < code.length ? code[i + 1] : '';\n\n // Line comment content: verbatim until the author newline\n if (inLineComment) {\n if (ch === '\\n') {\n inLineComment = false;\n endLine();\n } else {\n appendContent(ch);\n }\n continue;\n }\n\n // Block comment content: verbatim, may span lines\n if (inBlockComment) {\n if (ch === '\\n') {\n endLine();\n continue;\n }\n appendContent(ch);\n if (ch === '/' && code[i - 1] === '*') inBlockComment = false;\n continue;\n }\n\n // String content: verbatim, may span lines (template literals)\n if (inString) {\n if (ch === '\\n') {\n endLine();\n continue;\n }\n appendContent(ch);\n if (ch === inString && code[i - 1] !== '\\\\') inString = null;\n continue;\n }\n\n // Entering a string\n if (skipStrings && (ch === '\"' || ch === \"'\" || ch === '`')) {\n inString = ch;\n appendContent(ch);\n continue;\n }\n\n // Entering a comment\n if (skipComments) {\n if (ch === '/' && next === '/') {\n inLineComment = true;\n appendContent(ch);\n continue;\n }\n if (ch === '/' && next === '*') {\n inBlockComment = true;\n appendContent(ch);\n continue;\n }\n }\n\n // Author newline: preserved\n if (ch === '\\n') {\n endLine();\n continue;\n }\n if (ch === '\\r') {\n if (next !== '\\n') endLine();\n continue;\n }\n\n // Whitespace within a line: collapsed to a single pending space;\n // leading indentation is dropped (renormalized from depth)\n if (ch === ' ' || ch === '\\t') {\n if (lineHasContent) pendingSpace = true;\n continue;\n }\n\n // Bracket/paren depth (outside strings/comments)\n if (ch === '(') parenDepth++;\n else if (ch === ')') parenDepth = Math.max(0, parenDepth - 1);\n else if (ch === '[') bracketDepth++;\n else if (ch === ']') bracketDepth = Math.max(0, bracketDepth - 1);\n\n // Dedent before the char; a closer pops its group's multi-line flag\n let closesBrokenGroup = false;\n if (dedentRe && dedentRe.test(ch)) {\n depth = Math.max(0, depth - 1);\n closesBrokenGroup = brokenGroups.pop() ?? false;\n }\n\n // Newline before (only where it does not duplicate an author break, and\n // for closers only when the group being closed is multi-line)\n if (\n newlineBefore && newlineBefore.test(ch) && lineHasContent &&\n !newlineSuppressed(ch) && (!dedentRe || !dedentRe.test(ch) || closesBrokenGroup)\n ) {\n endLine();\n }\n\n // Space before (including spaceAround). A rule char glued to a\n // preceding operator char is a compound operator (`+=`, `===`), not a\n // fresh token — it keeps its left side.\n const prevRaw = i > 0 ? code[i - 1] : '';\n const partOfOperator = prevRaw !== '' && !/[ \\t\\n\\r]/.test(prevRaw) && /[+\\-*/%=<>!&|^~?:]/.test(prevRaw);\n if (\n ((spaceBefore && spaceBefore.test(ch)) || (spaceAround && spaceAround.test(ch))) &&\n lineHasContent && !partOfOperator\n ) {\n pendingSpace = true;\n }\n\n appendContent(ch);\n\n // Indent after the char\n if (indentRe && indentRe.test(ch)) {\n depth++;\n brokenGroups.push(false);\n }\n\n // Space after (including spaceAround). An `=` directly followed by\n // another `=` is an equality chain and `=>` is an arrow — not two tokens.\n if ((spaceAfter && spaceAfter.test(ch)) || (spaceAround && spaceAround.test(ch))) {\n const continuesOperator = ch === '=' && (next === '=' || next === '>');\n if (next && next !== ' ' && next !== '\\t' && next !== '\\n' && next !== '\\r' && !continuesOperator) {\n pendingSpace = true;\n }\n }\n\n // Newline after: fires only where it does not duplicate an author\n // break or detach a same-line trailing comment\n if (newlineAfter && newlineAfter.test(ch) && !newlineSuppressed(ch)) {\n let j = i + 1;\n while (j < code.length && (code[j] === ' ' || code[j] === '\\t')) j++;\n const ahead = j < code.length ? code[j] : '';\n const atAuthorBreak = ahead === '' || ahead === '\\n' || ahead === '\\r';\n const atTrailingComment = ahead === '/' && (code[j + 1] === '/' || code[j + 1] === '*');\n if (!atAuthorBreak && !atTrailingComment) {\n endLine();\n }\n }\n }\n\n lines.push(line.replace(/[ \\t]+$/, ''));\n\n // Post-processing\n let out = lines;\n\n if (rules.trimTrailing ?? true) {\n out = out.map(l => l.replace(/[ \\t]+$/, ''));\n }\n\n if (rules.collapseBlankLines !== undefined) {\n out = collapseBlankLinesArr(out, rules.collapseBlankLines);\n }\n\n // Trim leading/trailing blank lines\n while (out.length > 0 && out[0].trim() === '') out.shift();\n while (out.length > 0 && out[out.length - 1].trim() === '') out.pop();\n\n return out.join('\\n');\n}\n\nfunction collapseBlankLinesArr(lines: string[], max: number): string[] {\n const result: string[] = [];\n let blankCount = 0;\n\n for (const line of lines) {\n if (line.trim() === '') {\n blankCount++;\n if (blankCount <= max) {\n result.push(line);\n }\n } else {\n blankCount = 0;\n result.push(line);\n }\n }\n\n return result;\n}\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  "pretty": {
7
7
  "tabSize": 2,
8
8
  "useTabs": false,
9
- "newlineAfter": "[{;]",
9
+ "newlineAfter": "[;]",
10
10
  "newlineBefore": "[}]",
11
11
  "spaceAfter": "[,]",
12
12
  "spaceAround": "[=]",
@@ -6,7 +6,7 @@
6
6
  "pretty": {
7
7
  "tabSize": 2,
8
8
  "useTabs": false,
9
- "newlineAfter": "[{;]",
9
+ "newlineAfter": "[;]",
10
10
  "newlineBefore": "[}]",
11
11
  "spaceAfter": "[,]",
12
12
  "spaceAround": "[=]",
@@ -3,7 +3,7 @@ import { element, property, query, ready, watch, dispatch, render, styles, html,
3
3
  import { renderIcon } from '../utils.js';
4
4
  import '../icons/index.js';
5
5
 
6
- var cssContent = ":host([hidden]){display:none}:host{display:contents}.command-palette{position:fixed;top:0;left:0;right:0;bottom:0;z-index:var(--snice-z-scrim,1000);display:none}.command-palette--open{display:flex;align-items:flex-start;justify-content:center;padding-top:15vh}.command-palette__backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgb(0 0 0 / .6);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);animation:.2s fadeIn}.command-palette__container{position:relative;width:90%;max-width:40rem;background-color:var(--snice-color-surface-container-highest,var(--snice-color-surface,rgb(255 255 255)));border:1px solid var(--snice-color-border-subtle,transparent);border-radius:var(--snice-border-radius-lg,.5rem);box-shadow:var(--snice-shadow-2xl,var(--snice-shadow-xl,0 20px 32px -5px hsl(0 0% 0% / .06),0 8px 16px -6px hsl(0 0% 0% / .08)));animation:.2s slideDown;overflow:hidden;max-height:70vh;display:flex;flex-direction:column;z-index:1}.command-palette__search{padding:var(--snice-spacing-md,1rem);border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.command-palette__input{width:100%;padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem);font-size:var(--snice-font-size-md, 1rem);font-family:var(--snice-font-family, system-ui);border:none;outline:0;background:0 0;color:var(--snice-color-text,rgb(23 23 23))}.command-palette__input::placeholder{color:var(--snice-color-text-tertiary,rgb(115 115 115))}.command-palette__results{overflow-y:auto;max-height:calc(70vh - 80px)}.command-palette__category{padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-md,1rem);font-size:var(--snice-font-size-sm, .875rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text-secondary,rgb(82 82 82));background-color:var(--snice-color-surface-container-low,hsl(0 0% 98%));border-top:1px solid var(--snice-color-border,rgb(226 226 226))}.command-palette__category:first-child{border-top:none}.command-palette__item{display:flex;align-items:center;gap:var(--snice-spacing-sm,.75rem);padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem);cursor:pointer;transition:background-color .15s;border:none;background:0 0;width:100%;text-align:left;font-family:var(--snice-font-family, system-ui)}.command-palette__item:hover{background-color:var(--snice-color-surface-hover,rgb(242 242 242))}.command-palette__item--active{background-color:var(--snice-color-primary-subtle,hsl(214 100% 97%))}.command-palette__item--active:hover{background-color:var(--snice-color-primary-subtle-hover,hsl(214 95% 93%))}.command-palette__item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.command-palette__item-icon{flex-shrink:0;width:1.25rem;height:1.25rem;display:flex;align-items:center;justify-content:center;font-size:1.125rem}.command-palette__item-icon-glyph svg{width:1.125rem;height:1.125rem;display:block}.command-palette__item-icon-image{width:100%;height:100%;object-fit:contain}.command-palette__item-content{flex:1;min-width:0}.command-palette__item-label{font-size:var(--snice-font-size-md, 1rem);color:var(--snice-color-text,rgb(23 23 23));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.command-palette__item-description{font-size:var(--snice-font-size-sm, .875rem);color:var(--snice-color-text-secondary,rgb(82 82 82));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}.command-palette__item-shortcut{flex-shrink:0;display:flex;gap:4px;font-size:var(--snice-font-size-xs, .75rem);font-family:var(--snice-font-family-mono, monospace);color:var(--snice-color-text-secondary,rgb(82 82 82));padding:2px 6px;background-color:var(--snice-color-surface-container-low,hsl(0 0% 98%));border-radius:var(--snice-border-radius-sm,.25rem);border:1px solid var(--snice-color-border,rgb(226 226 226))}.command-palette__empty{padding:var(--snice-spacing-xl,2rem);text-align:center;color:var(--snice-color-text-secondary,rgb(82 82 82));font-size:var(--snice-font-size-sm, .875rem)}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes slideDown{from{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
6
+ var cssContent = ":host([hidden]){display:none}:host{display:contents}.command-palette{position:fixed;top:0;left:0;right:0;bottom:0;z-index:var(--snice-z-scrim,1000);display:none}.command-palette--open{display:flex;align-items:flex-start;justify-content:center;padding-top:15vh}.command-palette__backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgb(0 0 0 / .6);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);animation:.2s fadeIn}.command-palette__container{position:relative;width:90%;max-width:40rem;background-color:var(--snice-color-surface-container-highest,var(--snice-color-surface,rgb(255 255 255)));border:1px solid var(--snice-color-border-subtle,transparent);border-radius:var(--snice-border-radius-lg,.5rem);box-shadow:var(--snice-shadow-2xl,var(--snice-shadow-xl,0 20px 32px -5px hsl(0 0% 0% / .06),0 8px 16px -6px hsl(0 0% 0% / .08)));animation:.2s slideDown;overflow:hidden;max-height:70vh;display:flex;flex-direction:column;z-index:1}.command-palette__search{border-bottom:1px solid var(--snice-color-border-subtle,var(--snice-color-border,rgb(226 226 226)))}.command-palette__input{box-sizing:border-box;width:100%;padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem);font-size:var(--snice-font-size-md, 1rem);font-family:var(--snice-font-family, system-ui);border:none;outline:0;background:0 0;color:var(--snice-color-text,rgb(23 23 23))}.command-palette__input::placeholder{color:var(--snice-color-text-tertiary,rgb(115 115 115))}.command-palette__results{overflow-y:auto;flex:1;min-height:0}.command-palette__category{padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-md,1rem);font-size:var(--snice-font-size-sm, .875rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text-secondary,rgb(82 82 82));background-color:var(--snice-color-surface-container-low,hsl(0 0% 98%));border-top:1px solid var(--snice-color-border,rgb(226 226 226))}.command-palette__category:first-child{border-top:none}.command-palette__item{display:flex;align-items:center;gap:var(--snice-spacing-sm,.75rem);padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-md,1rem);cursor:pointer;transition:background-color .15s;border:none;background:0 0;width:100%;text-align:left;font-family:var(--snice-font-family, system-ui)}.command-palette__item:hover{background-color:var(--snice-color-surface-hover,rgb(242 242 242))}.command-palette__item--active{background-color:var(--snice-color-primary-subtle,hsl(214 100% 97%))}.command-palette__item--active:hover{background-color:var(--snice-color-primary-subtle-hover,hsl(214 95% 93%))}.command-palette__item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.command-palette__item-icon{flex-shrink:0;width:1.25rem;height:1.25rem;display:flex;align-items:center;justify-content:center;font-size:1.125rem}.command-palette__item-icon-glyph svg{width:1.125rem;height:1.125rem;display:block}.command-palette__item-icon-image{width:100%;height:100%;object-fit:contain}.command-palette__item-content{flex:1;min-width:0}.command-palette__item-label{font-size:var(--snice-font-size-md, 1rem);color:var(--snice-color-text,rgb(23 23 23));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.command-palette__item-description{font-size:var(--snice-font-size-sm, .875rem);color:var(--snice-color-text-secondary,rgb(82 82 82));white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}.command-palette__item-shortcut{flex-shrink:0;display:flex;gap:4px;font-size:var(--snice-font-size-xs, .75rem);font-family:var(--snice-font-family-mono, monospace);color:var(--snice-color-text-secondary,rgb(82 82 82));padding:2px 6px;background-color:var(--snice-color-surface-container-low,hsl(0 0% 98%));border-radius:var(--snice-border-radius-sm,.25rem);border:1px solid var(--snice-color-border,rgb(226 226 226))}.command-palette__empty{padding:var(--snice-spacing-xl,2rem);text-align:center;color:var(--snice-color-text-secondary,rgb(82 82 82));font-size:var(--snice-font-size-sm, .875rem)}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes slideDown{from{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}";
7
7
 
8
8
  let SniceCommandPalette = (() => {
9
9
  let _classDecorators = [element('snice-command-palette')];