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.
- package/README.md +1 -1
- package/adapters/react/SniceProvider.js +1 -1
- package/adapters/react/SniceRouter.js +1 -1
- package/adapters/react/matchRoute.js +1 -1
- package/adapters/react/table.d.ts +1 -0
- package/adapters/react/table.d.ts.map +1 -1
- package/adapters/react/table.js +1 -1
- package/adapters/react/table.js.map +1 -1
- package/adapters/react/table.tsx +2 -1
- package/adapters/react/useRequestHandler.js +1 -1
- package/bin/analyzer-contracts.js +17 -1
- package/custom-elements.json +57 -3
- package/dist/cdn/accordion/snice-accordion.js +1 -1
- package/dist/cdn/action-bar/snice-action-bar.js +1 -1
- package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
- package/dist/cdn/alert/snice-alert.js +1 -1
- package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
- package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
- package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
- package/dist/cdn/availability/snice-availability.js +1 -1
- package/dist/cdn/avatar/snice-avatar.js +1 -1
- package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
- package/dist/cdn/badge/snice-badge.js +1 -1
- package/dist/cdn/banner/snice-banner.js +1 -1
- package/dist/cdn/binpack/snice-binpack.js +1 -1
- package/dist/cdn/book/snice-book.js +1 -1
- package/dist/cdn/booking/snice-booking.js +1 -1
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
- package/dist/cdn/button/snice-button.js +1 -1
- package/dist/cdn/calendar/README.md +2 -2
- package/dist/cdn/calendar/snice-calendar.js +537 -44
- package/dist/cdn/calendar/snice-calendar.js.map +1 -1
- package/dist/cdn/calendar/snice-calendar.min.js +2 -2
- package/dist/cdn/calendar/snice-calendar.min.js.map +1 -1
- package/dist/cdn/camera/snice-camera.js +1 -1
- package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
- package/dist/cdn/candlestick/snice-candlestick.js +1 -1
- package/dist/cdn/card/snice-card.js +1 -1
- package/dist/cdn/carousel/snice-carousel.js +1 -1
- package/dist/cdn/cart/snice-cart.js +1 -1
- package/dist/cdn/chart/snice-chart.js +1 -1
- package/dist/cdn/chat/snice-chat.js +1 -1
- package/dist/cdn/checkbox/snice-checkbox.js +1 -1
- package/dist/cdn/chip/snice-chip.js +1 -1
- package/dist/cdn/code-block/README.md +2 -2
- package/dist/cdn/code-block/snice-code-block.js +177 -167
- package/dist/cdn/code-block/snice-code-block.js.map +1 -1
- package/dist/cdn/code-block/snice-code-block.min.js +2 -2
- package/dist/cdn/code-block/snice-code-block.min.js.map +1 -1
- package/dist/cdn/color-display/snice-color-display.js +1 -1
- package/dist/cdn/color-picker/snice-color-picker.js +1 -1
- package/dist/cdn/command-palette/README.md +1 -1
- package/dist/cdn/command-palette/snice-command-palette.js +2 -2
- package/dist/cdn/command-palette/snice-command-palette.js.map +1 -1
- package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
- package/dist/cdn/command-palette/snice-command-palette.min.js.map +1 -1
- package/dist/cdn/comments/snice-comments.js +1 -1
- package/dist/cdn/countdown/snice-countdown.js +1 -1
- package/dist/cdn/cropper/snice-cropper.js +1 -1
- package/dist/cdn/data-card/snice-data-card.js +1 -1
- package/dist/cdn/date-picker/snice-date-picker.js +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
- package/dist/cdn/diff/snice-diff.js +1 -1
- package/dist/cdn/divider/snice-divider.js +1 -1
- package/dist/cdn/doc/snice-doc.js +1 -1
- package/dist/cdn/draw/snice-draw.js +1 -1
- package/dist/cdn/drawer/snice-drawer.js +1 -1
- package/dist/cdn/empty-state/snice-empty-state.js +1 -1
- package/dist/cdn/estimate/snice-estimate.js +1 -1
- package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
- package/dist/cdn/file-upload/snice-file-upload.js +1 -1
- package/dist/cdn/flip-card/snice-flip-card.js +1 -1
- package/dist/cdn/flow/snice-flow.js +1 -1
- package/dist/cdn/form-layout/snice-form-layout.js +1 -1
- package/dist/cdn/funnel/snice-funnel.js +1 -1
- package/dist/cdn/gantt/snice-gantt.js +1 -1
- package/dist/cdn/gauge/snice-gauge.js +1 -1
- package/dist/cdn/grid/snice-grid.js +1 -1
- package/dist/cdn/heatmap/snice-heatmap.js +1 -1
- package/dist/cdn/image/snice-image.js +1 -1
- package/dist/cdn/input/snice-input.js +1 -1
- package/dist/cdn/invoice/snice-invoice.js +1 -1
- package/dist/cdn/kanban/snice-kanban.js +1 -1
- package/dist/cdn/key-value/snice-key-value.js +1 -1
- package/dist/cdn/kpi/snice-kpi.js +1 -1
- package/dist/cdn/layout/snice-layout.js +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
- package/dist/cdn/link/snice-link.js +1 -1
- package/dist/cdn/link-preview/snice-link-preview.js +1 -1
- package/dist/cdn/list/snice-list.js +1 -1
- package/dist/cdn/location/snice-location.js +1 -1
- package/dist/cdn/login/snice-login.js +1 -1
- package/dist/cdn/map/snice-map.js +1 -1
- package/dist/cdn/markdown/snice-markdown.js +1 -1
- package/dist/cdn/masonry/snice-masonry.js +1 -1
- package/dist/cdn/menu/snice-menu.js +1 -1
- package/dist/cdn/message-strip/snice-message-strip.js +1 -1
- package/dist/cdn/modal/snice-modal.js +1 -1
- package/dist/cdn/music-player/snice-music-player.js +1 -1
- package/dist/cdn/nav/snice-nav.js +1 -1
- package/dist/cdn/network-graph/snice-network-graph.js +1 -1
- package/dist/cdn/notification-center/snice-notification-center.js +1 -1
- package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
- package/dist/cdn/org-chart/snice-org-chart.js +1 -1
- package/dist/cdn/pagination/snice-pagination.js +1 -1
- package/dist/cdn/paint/snice-paint.js +1 -1
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
- package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
- package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
- package/dist/cdn/popover/snice-popover.js +1 -1
- package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
- package/dist/cdn/product-card/snice-product-card.js +1 -1
- package/dist/cdn/progress/snice-progress.js +2 -2
- package/dist/cdn/progress/snice-progress.js.map +1 -1
- package/dist/cdn/progress/snice-progress.min.js +1 -1
- package/dist/cdn/progress/snice-progress.min.js.map +1 -1
- package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
- package/dist/cdn/qr-code/README.md +2 -2
- package/dist/cdn/qr-code/snice-qr-code.js +19 -3
- package/dist/cdn/qr-code/snice-qr-code.js.map +1 -1
- package/dist/cdn/qr-code/snice-qr-code.min.js +2 -2
- package/dist/cdn/qr-code/snice-qr-code.min.js.map +1 -1
- package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
- package/dist/cdn/radio/snice-radio.js +1 -1
- package/dist/cdn/range-slider/snice-range-slider.js +1 -1
- package/dist/cdn/rating/snice-rating.js +1 -1
- package/dist/cdn/receipt/snice-receipt.js +5 -2
- package/dist/cdn/receipt/snice-receipt.js.map +1 -1
- package/dist/cdn/receipt/snice-receipt.min.js +1 -1
- package/dist/cdn/receipt/snice-receipt.min.js.map +1 -1
- package/dist/cdn/recipe/snice-recipe.js +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.js +4 -4
- package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.js +4 -4
- package/dist/cdn/runtime/snice-runtime.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
- package/dist/cdn/sankey/snice-sankey.js +1 -1
- package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
- package/dist/cdn/select/README.md +2 -2
- package/dist/cdn/select/snice-select.js +6 -9
- package/dist/cdn/select/snice-select.js.map +1 -1
- package/dist/cdn/select/snice-select.min.js +2 -2
- package/dist/cdn/select/snice-select.min.js.map +1 -1
- package/dist/cdn/skeleton/snice-skeleton.js +1 -1
- package/dist/cdn/slider/snice-slider.js +1 -1
- package/dist/cdn/sortable/snice-sortable.js +1 -1
- package/dist/cdn/sparkline/snice-sparkline.js +1 -1
- package/dist/cdn/spinner/snice-spinner.js +1 -1
- package/dist/cdn/split-button/snice-split-button.js +1 -1
- package/dist/cdn/split-pane/snice-split-pane.js +1 -1
- package/dist/cdn/spotlight/snice-spotlight.js +1 -1
- package/dist/cdn/stat-group/snice-stat-group.js +1 -1
- package/dist/cdn/step-input/snice-step-input.js +1 -1
- package/dist/cdn/stepper/snice-stepper.js +1 -1
- package/dist/cdn/switch/snice-switch.js +1 -1
- package/dist/cdn/table/README.md +2 -2
- package/dist/cdn/table/snice-table.esm.js +1940 -407
- package/dist/cdn/table/snice-table.esm.js.map +1 -1
- package/dist/cdn/table/snice-table.esm.min.js +242 -53
- package/dist/cdn/table/snice-table.esm.min.js.map +1 -1
- package/dist/cdn/table/snice-table.js +1940 -407
- package/dist/cdn/table/snice-table.js.map +1 -1
- package/dist/cdn/table/snice-table.min.js +234 -45
- package/dist/cdn/table/snice-table.min.js.map +1 -1
- package/dist/cdn/tabs/snice-tabs.js +1 -1
- package/dist/cdn/tag/snice-tag.js +1 -1
- package/dist/cdn/tag-input/snice-tag-input.js +1 -1
- package/dist/cdn/terminal/snice-terminal.js +1 -1
- package/dist/cdn/testimonial/snice-testimonial.js +1 -1
- package/dist/cdn/textarea/snice-textarea.js +1 -1
- package/dist/cdn/time-picker/snice-time-picker.js +1 -1
- package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
- package/dist/cdn/timeline/snice-timeline.js +1 -1
- package/dist/cdn/timer/snice-timer.js +1 -1
- package/dist/cdn/toast/snice-toast.js +1 -1
- package/dist/cdn/tooltip/snice-tooltip.js +1 -1
- package/dist/cdn/tree/snice-tree.js +1 -1
- package/dist/cdn/treemap/snice-treemap.js +1 -1
- package/dist/cdn/user-card/snice-user-card.js +1 -1
- package/dist/cdn/video-player/snice-video-player.js +1 -1
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
- package/dist/cdn/waterfall/snice-waterfall.js +1 -1
- package/dist/cdn/weather/snice-weather.js +1 -1
- package/dist/cdn/work-order/snice-work-order.js +1 -1
- package/dist/components/calendar/snice-calendar.d.ts +187 -5
- package/dist/components/calendar/snice-calendar.js +537 -44
- package/dist/components/calendar/snice-calendar.js.map +1 -1
- package/dist/components/calendar/snice-calendar.types.d.ts +2 -1
- package/dist/components/code-block/formatter.d.ts +6 -0
- package/dist/components/code-block/formatter.js +174 -164
- package/dist/components/code-block/formatter.js.map +1 -1
- package/dist/components/code-block/grammars/snice.json +1 -1
- package/dist/components/code-block/grammars/typescript.json +1 -1
- package/dist/components/command-palette/snice-command-palette.js +1 -1
- package/dist/components/command-palette/snice-command-palette.js.map +1 -1
- package/dist/components/progress/snice-progress.js +1 -1
- package/dist/components/progress/snice-progress.js.map +1 -1
- package/dist/components/qr-code/qrcode.d.ts +1 -1
- package/dist/components/qr-code/qrcode.js +18 -2
- package/dist/components/qr-code/qrcode.js.map +1 -1
- package/dist/components/receipt/snice-receipt.js +4 -1
- package/dist/components/receipt/snice-receipt.js.map +1 -1
- package/dist/components/select/snice-select.d.ts +1 -1
- package/dist/components/select/snice-select.js +5 -8
- package/dist/components/select/snice-select.js.map +1 -1
- package/dist/components/table/snice-cell-actions.js +1 -1
- package/dist/components/table/snice-cell-actions.js.map +1 -1
- package/dist/components/table/snice-cell-color.js +1 -1
- package/dist/components/table/snice-cell-color.js.map +1 -1
- package/dist/components/table/snice-cell-date.js +20 -8
- package/dist/components/table/snice-cell-date.js.map +1 -1
- package/dist/components/table/snice-cell-email.js +1 -1
- package/dist/components/table/snice-cell-email.js.map +1 -1
- package/dist/components/table/snice-cell-image.js +1 -1
- package/dist/components/table/snice-cell-image.js.map +1 -1
- package/dist/components/table/snice-cell-json.js +1 -1
- package/dist/components/table/snice-cell-json.js.map +1 -1
- package/dist/components/table/snice-cell-link.js +1 -1
- package/dist/components/table/snice-cell-link.js.map +1 -1
- package/dist/components/table/snice-cell-location.js +1 -1
- package/dist/components/table/snice-cell-location.js.map +1 -1
- package/dist/components/table/snice-cell-phone.js +1 -1
- package/dist/components/table/snice-cell-phone.js.map +1 -1
- package/dist/components/table/snice-cell-status.js +1 -1
- package/dist/components/table/snice-cell-status.js.map +1 -1
- package/dist/components/table/snice-cell.d.ts +10 -0
- package/dist/components/table/snice-cell.js +59 -13
- package/dist/components/table/snice-cell.js.map +1 -1
- package/dist/components/table/snice-row.d.ts +0 -1
- package/dist/components/table/snice-row.js +4 -10
- package/dist/components/table/snice-row.js.map +1 -1
- package/dist/components/table/snice-table.d.ts +170 -2
- package/dist/components/table/snice-table.js +868 -189
- package/dist/components/table/snice-table.js.map +1 -1
- package/dist/components/table/snice-table.types.d.ts +17 -0
- package/dist/components/table/table-cell-presentation.d.ts +17 -4
- package/dist/components/table/table-cell-presentation.js +37 -11
- package/dist/components/table/table-cell-presentation.js.map +1 -1
- package/dist/components/table/table-column-manager.d.ts +153 -2
- package/dist/components/table/table-column-manager.js +364 -43
- package/dist/components/table/table-column-manager.js.map +1 -1
- package/dist/components/table/table-date.d.ts +29 -0
- package/dist/components/table/table-date.js +78 -0
- package/dist/components/table/table-date.js.map +1 -0
- package/dist/components/table/table-export.js +6 -2
- package/dist/components/table/table-export.js.map +1 -1
- package/dist/components/table/table-filter-engine.d.ts +9 -0
- package/dist/components/table/table-filter-engine.js +58 -14
- package/dist/components/table/table-filter-engine.js.map +1 -1
- package/dist/components/table/table-keyboard.d.ts +8 -0
- package/dist/components/table/table-keyboard.js +14 -3
- package/dist/components/table/table-keyboard.js.map +1 -1
- package/dist/components/table/table-toolbar.js +1 -0
- package/dist/components/table/table-toolbar.js.map +1 -1
- package/dist/components/table/table-tree-data.d.ts +2 -0
- package/dist/components/table/table-tree-data.js +35 -9
- package/dist/components/table/table-tree-data.js.map +1 -1
- package/dist/components/table/table-virtualizer.d.ts +44 -7
- package/dist/components/table/table-virtualizer.js +101 -54
- package/dist/components/table/table-virtualizer.js.map +1 -1
- package/dist/components/theme/theme.css +9 -0
- package/dist/index.cjs +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.iife.js +1 -1
- package/dist/react/SniceProvider.js +1 -1
- package/dist/react/SniceRouter.js +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/matchRoute.js +1 -1
- package/dist/react/useRequestHandler.js +1 -1
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/testing-dom.cjs +1 -1
- package/dist/testing-dom.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/docs/ai/DEVELOPMENT.md +93 -2
- package/docs/ai/components/calendar.md +113 -10
- package/docs/ai/components/code-block.md +4 -0
- package/docs/ai/components/doc.md +1 -1
- package/docs/ai/components/progress.md +1 -0
- package/docs/ai/components/receipt.md +1 -1
- package/docs/ai/components/table.md +29 -30
- package/docs/ai/components/theme.md +1 -0
- package/docs/ai/events.md +30 -0
- package/docs/ai/theme.md +1 -0
- package/docs/components/calendar.md +171 -11
- package/docs/components/code-block.md +2 -0
- package/docs/components/doc.md +1 -1
- package/docs/components/progress.md +13 -0
- package/docs/components/receipt.md +1 -0
- package/docs/components/table.md +274 -15
- package/docs/components/theme.md +5 -0
- package/docs/events.md +49 -0
- package/docs/plans/2026-03-06-date-range-picker-plan.md +4 -4
- package/docs/plans/2026-03-07-table-mui-parity-design.md +1 -1
- package/docs/plans/2026-03-09-action-bar-plan.md +11 -11
- package/docs/superpowers/specs/2026-07-09-table-incredible-design.md +1 -1
- package/docs/superpowers/specs/2026-07-09-table-phase0-implementation.md +2 -2
- package/package.json +3 -1
- 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
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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
|
|
49
|
+
let inBlockComment = false;
|
|
33
50
|
let inLineComment = false;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
//
|
|
58
|
-
if (
|
|
59
|
-
if (
|
|
60
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
136
|
+
appendContent(ch);
|
|
81
137
|
continue;
|
|
82
138
|
}
|
|
83
139
|
if (ch === '/' && next === '*') {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
lineStart = false;
|
|
87
|
-
}
|
|
88
|
-
inComment = true;
|
|
89
|
-
result += ch;
|
|
140
|
+
inBlockComment = true;
|
|
141
|
+
appendContent(ch);
|
|
90
142
|
continue;
|
|
91
143
|
}
|
|
92
144
|
}
|
|
93
|
-
//
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
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
|
-
|
|
124
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
|
136
|
-
if (trimTrailing) {
|
|
137
|
-
|
|
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
|
-
|
|
227
|
+
out = collapseBlankLinesArr(out, rules.collapseBlankLines);
|
|
141
228
|
}
|
|
142
229
|
// Trim leading/trailing blank lines
|
|
143
|
-
while (
|
|
144
|
-
|
|
145
|
-
while (
|
|
146
|
-
|
|
147
|
-
return
|
|
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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"}
|
|
@@ -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{
|
|
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')];
|