diff --git a/binspec-visualizer/app/components/data-segment-details.hbs b/binspec-visualizer/app/components/data-segment-details.hbs index 7774d14..68309f9 100644 --- a/binspec-visualizer/app/components/data-segment-details.hbs +++ b/binspec-visualizer/app/components/data-segment-details.hbs @@ -1,6 +1,7 @@
+ {{#if @segment.explanationMarkdown}} +
+ {{markdown-to-html @segment.explanationMarkdown}} +
+ {{/if}} + {{#if (gt @segment.children.length 0)}} {{/if}} - {{#if @segment.explanationMarkdown}} -
- {{markdown-to-html @segment.explanationMarkdown}} -
- {{/if}} - {{#if @segment.isLeafSegment}}
{{@segment.lengthInBytes}} diff --git a/binspec-visualizer/app/components/data-segment-details.ts b/binspec-visualizer/app/components/data-segment-details.ts index 8567c13..a51ab4e 100644 --- a/binspec-visualizer/app/components/data-segment-details.ts +++ b/binspec-visualizer/app/components/data-segment-details.ts @@ -7,6 +7,7 @@ type Signature = { Args: { data: Uint8Array; segment: DataSegment; + highlightedSegment?: DataSegment; onSegmentSelect: (segment: DataSegment) => void; onSegmentMouseEnter: ( section: NonNullable, diff --git a/binspec-visualizer/app/components/data-segment-details/title-with-breadcrumbs.ts b/binspec-visualizer/app/components/data-segment-details/title-with-breadcrumbs.ts index 16f7406..b024e2b 100644 --- a/binspec-visualizer/app/components/data-segment-details/title-with-breadcrumbs.ts +++ b/binspec-visualizer/app/components/data-segment-details/title-with-breadcrumbs.ts @@ -7,6 +7,7 @@ import type HoverStateService from 'binspec-visualizer/services/hover-state'; type Signature = { Args: { + highlightedSegment?: DataSegment; segment: DataSegment; onSegmentSelect: (segment: DataSegment) => void; onSegmentMouseEnter: ( @@ -29,9 +30,15 @@ export default class TitleWithBreadcrumbsComponent extends Component } get titleTextColorClasses(): string { - return this.hoveredSegment === this.args.segment - ? 'text-blue-400' - : 'text-yellow-300'; + if (this.hoveredSegment?.equals(this.args.segment)) { + return 'text-sky-400'; + } + + if (this.args.highlightedSegment?.equals(this.args.segment)) { + return 'text-yellow-300'; + } + + return 'text-zinc-100'; } get visibleAncestors(): DataSegment[] { diff --git a/binspec-visualizer/app/components/format-documentation.hbs b/binspec-visualizer/app/components/format-documentation.hbs new file mode 100644 index 0000000..945683a --- /dev/null +++ b/binspec-visualizer/app/components/format-documentation.hbs @@ -0,0 +1,12 @@ +
+ {{#each @segments as |segment|}} + + {{/each}} +
\ No newline at end of file diff --git a/binspec-visualizer/app/components/format-documentation.ts b/binspec-visualizer/app/components/format-documentation.ts new file mode 100644 index 0000000..f095398 --- /dev/null +++ b/binspec-visualizer/app/components/format-documentation.ts @@ -0,0 +1,27 @@ +import Component from '@glimmer/component'; +import type { DataSegment } from 'binspec-visualizer/lib/data-segment'; +import type HoverStateService from 'binspec-visualizer/services/hover-state'; + +type Signature = { + Args: { + data: Uint8Array; + segments: DataSegment[]; + highlightedSegment?: DataSegment; + onSegmentSelect: (segment: DataSegment) => void; + onSegmentMouseEnter: ( + section: NonNullable, + segment: DataSegment, + byteIndex?: number, + event?: MouseEvent, + ) => void; + onSegmentMouseLeave: () => void; + }; +}; + +export default class FormatDocumentation extends Component {} + +declare module '@glint/environment-ember-loose/registry' { + export default interface Registry { + FormatDocumentation: typeof FormatDocumentation; + } +} diff --git a/binspec-visualizer/app/components/format-documentation/segment.hbs b/binspec-visualizer/app/components/format-documentation/segment.hbs new file mode 100644 index 0000000..5759554 --- /dev/null +++ b/binspec-visualizer/app/components/format-documentation/segment.hbs @@ -0,0 +1,91 @@ +
+
+
+ + + {{#if (has-block "topRight")}} +
+ {{yield to="topRight"}} +
+ {{/if}} +
+ + {{#if @segment.explanationMarkdown}} +
+ {{markdown-to-html @segment.explanationMarkdown}} +
+ {{/if}} + + {{#if (gt @segment.children.length 0)}} + + {{/if}} + + {{#if + (and @segment.isLeafSegment (segment-eq @segment @highlightedSegment)) + }} +
+ {{@segment.lengthInBytes}} + {{if (eq @segment.lengthInBytes 1) "byte" "bytes"}}: +
+ + + <:lastBytePreview> + {{#if this.previewIsTruncated}} +
+ +
+ {{/if}} + +
+ {{/if}} +
+ +
+ {{#each @segment.children as |child|}} + + {{/each}} +
+
\ No newline at end of file diff --git a/binspec-visualizer/app/components/format-documentation/segment.ts b/binspec-visualizer/app/components/format-documentation/segment.ts new file mode 100644 index 0000000..f15d4db --- /dev/null +++ b/binspec-visualizer/app/components/format-documentation/segment.ts @@ -0,0 +1,55 @@ +import { service } from '@ember/service'; +import Component from '@glimmer/component'; +import type { DataSegment } from 'binspec-visualizer/lib/data-segment'; +import type HoverStateService from 'binspec-visualizer/services/hover-state'; + +type Signature = { + Args: { + data: Uint8Array; + segment: DataSegment; + highlightedSegment?: DataSegment; + onSegmentSelect: (segment: DataSegment) => void; + onSegmentMouseEnter: ( + section: NonNullable, + segment: DataSegment, + byteIndex?: number, + event?: MouseEvent, + ) => void; + onSegmentMouseLeave: () => void; + }; + + Element: HTMLDivElement; + + Blocks: { + topRight?: []; + }; +}; + +export default class FormatDocumentationSegment extends Component { + @service declare hoverState: HoverStateService; + + get hoveredSegment(): DataSegment | undefined { + return this.hoverState.segment; + } + + get titleTextColorClasses(): string { + return 'text-yellow-300'; + } + + get previewEndByteIndex(): number { + return Math.min( + this.args.segment.endByteIndex, + this.args.segment.startByteIndex + 14, + ); + } + + get previewIsTruncated(): boolean { + return this.args.segment.endByteIndex > this.previewEndByteIndex; + } +} + +declare module '@glint/environment-ember-loose/registry' { + export default interface Registry { + 'FormatDocumentation::Segment': typeof FormatDocumentationSegment; + } +} diff --git a/binspec-visualizer/app/controllers/format.ts b/binspec-visualizer/app/controllers/format.ts index 3eecde4..5d7afa9 100644 --- a/binspec-visualizer/app/controllers/format.ts +++ b/binspec-visualizer/app/controllers/format.ts @@ -26,7 +26,7 @@ export default class FormatController extends Controller { get highlightedSegment(): DataSegment | undefined { if (!this.highlightQueryParam) { - return this.model.format.segments[0]!.firstLeafSegment!; + return this.model.format.segments[0]!; } const startByteIndexStr = this.highlightQueryParam.split('-')[0]; diff --git a/binspec-visualizer/app/templates/format.hbs b/binspec-visualizer/app/templates/format.hbs index 0a612bb..03e718c 100644 --- a/binspec-visualizer/app/templates/format.hbs +++ b/binspec-visualizer/app/templates/format.hbs @@ -7,95 +7,15 @@

{{@model.format.name}}

-
-
- {{#if this.highlightedSegment}} - - <:topRight> - - - - {{/if}} -
-
- {{#if this.hoveredSegment}} - {{#if (eq this.hoveredSegment.lengthInBytes 1)}} - 1 byte - {{else}} - {{this.hoveredSegment.lengthInBytes}} - bytes - {{/if}} - {{else if this.highlightedSegment}} - {{#if (eq this.highlightedSegment.lengthInBytes 1)}} - 1 byte - {{else}} - {{this.highlightedSegment.lengthInBytes}} - bytes - {{/if}} - {{else}} - {{this.data.length}} - bytes - {{/if}} -
-
-
-
-
- Raw Bytes -
-
- - <:interstitial> - {{#if this.highlightedSegment}} -
-
- {{/if}} - -
-
-
+
+
\ No newline at end of file