@slotted/angular 0.1.0-beta.0 → 0.1.0-beta.2
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 +4 -0
- package/docs/AGENTS.snippet.md +10 -0
- package/docs/checkbox.json +7 -0
- package/docs/checkbox.md +1 -0
- package/docs/event-calendar.json +7 -0
- package/docs/event-calendar.md +1 -0
- package/docs/guidelines/README.md +27 -0
- package/docs/guidelines/async-feedback.md +108 -0
- package/docs/guidelines/browsing.md +74 -0
- package/docs/guidelines/builders.md +97 -0
- package/docs/guidelines/composition.md +129 -0
- package/docs/guidelines/conversations.md +59 -0
- package/docs/guidelines/errors-and-conflicts.md +71 -0
- package/docs/guidelines/forms.md +192 -0
- package/docs/guidelines/index.md +121 -0
- package/docs/guidelines/layout-alignment.md +95 -0
- package/docs/guidelines/ledgers.md +45 -0
- package/docs/guidelines/list-pages.md +165 -0
- package/docs/guidelines/overviews.md +66 -0
- package/docs/guidelines/own-elements.md +115 -0
- package/docs/guidelines/reading-permissions.md +55 -0
- package/docs/guidelines/record-pages.md +178 -0
- package/docs/guidelines/reports.md +123 -0
- package/docs/guidelines/shell-composition.md +94 -0
- package/docs/guidelines/workspaces.md +46 -0
- package/docs/index.md +12 -0
- package/docs/progress-indicator.json +1 -2
- package/docs/progress-indicator.md +2 -2
- package/docs/skills/build-own-element/SKILL.md +90 -0
- package/docs/skills/compose-screen/SKILL.md +76 -0
- package/docs/skills/index.md +9 -0
- package/docs/skills/review-screen/SKILL.md +70 -0
- package/docs/skills/theme-app/SKILL.md +74 -0
- package/docs/skills/waiting-states/SKILL.md +139 -0
- package/docs/stat-card.json +1 -0
- package/docs/stat-card.md +1 -1
- package/docs/tabs.json +1 -4
- package/docs/tabs.md +1 -1
- package/docs/tokens.md +424 -0
- package/fesm2022/slotted-angular-app-shell.mjs +2 -2
- package/fesm2022/slotted-angular-app-shell.mjs.map +1 -1
- package/fesm2022/slotted-angular-checkbox.mjs +11 -2
- package/fesm2022/slotted-angular-checkbox.mjs.map +1 -1
- package/fesm2022/slotted-angular-column-manager.mjs +1 -1
- package/fesm2022/slotted-angular-column-manager.mjs.map +1 -1
- package/fesm2022/slotted-angular-combobox.mjs +12 -6
- package/fesm2022/slotted-angular-combobox.mjs.map +1 -1
- package/fesm2022/slotted-angular-dashboard-grid.mjs +18 -22
- package/fesm2022/slotted-angular-dashboard-grid.mjs.map +1 -1
- package/fesm2022/slotted-angular-data-grid.mjs +6 -2
- package/fesm2022/slotted-angular-data-grid.mjs.map +1 -1
- package/fesm2022/slotted-angular-data-list.mjs +1 -1
- package/fesm2022/slotted-angular-data-list.mjs.map +1 -1
- package/fesm2022/slotted-angular-drawer.mjs +5 -1
- package/fesm2022/slotted-angular-drawer.mjs.map +1 -1
- package/fesm2022/slotted-angular-event-calendar.mjs +17 -7
- package/fesm2022/slotted-angular-event-calendar.mjs.map +1 -1
- package/fesm2022/slotted-angular-loading-overlay.mjs +2 -2
- package/fesm2022/slotted-angular-markdown.mjs +1 -1
- package/fesm2022/slotted-angular-markdown.mjs.map +1 -1
- package/fesm2022/slotted-angular-multi-select.mjs +32 -27
- package/fesm2022/slotted-angular-multi-select.mjs.map +1 -1
- package/fesm2022/slotted-angular-number-field.mjs +2 -2
- package/fesm2022/slotted-angular-number-field.mjs.map +1 -1
- package/fesm2022/slotted-angular-progress-indicator.mjs +6 -6
- package/fesm2022/slotted-angular-select.mjs +1 -25
- package/fesm2022/slotted-angular-select.mjs.map +1 -1
- package/fesm2022/slotted-angular-stat-card.mjs +2 -2
- package/fesm2022/slotted-angular-stat-card.mjs.map +1 -1
- package/fesm2022/slotted-angular-table.mjs +3 -3
- package/fesm2022/slotted-angular-table.mjs.map +1 -1
- package/fesm2022/slotted-angular-tabs.mjs +2 -2
- package/fesm2022/slotted-angular-tabs.mjs.map +1 -1
- package/fesm2022/slotted-angular-transfer.mjs +1 -1
- package/fesm2022/slotted-angular-transfer.mjs.map +1 -1
- package/fesm2022/slotted-angular-upload.mjs +2 -2
- package/package.json +3 -3
- package/types/slotted-angular-checkbox.d.ts +7 -1
- package/types/slotted-angular-checkbox.d.ts.map +1 -1
- package/types/slotted-angular-combobox.d.ts.map +1 -1
- package/types/slotted-angular-dashboard-grid.d.ts.map +1 -1
- package/types/slotted-angular-data-grid.d.ts.map +1 -1
- package/types/slotted-angular-drawer.d.ts.map +1 -1
- package/types/slotted-angular-event-calendar.d.ts +9 -2
- package/types/slotted-angular-event-calendar.d.ts.map +1 -1
- package/types/slotted-angular-multi-select.d.ts +10 -0
- package/types/slotted-angular-multi-select.d.ts.map +1 -1
- package/types/slotted-angular-select.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slotted-angular-markdown.mjs","sources":["../../markdown/src/markdown-defaults.ts","../../markdown/src/markdown.ts","../../markdown/src/slotted-angular-markdown.ts"],"sourcesContent":["import { inject, InjectionToken } from '@angular/core';\nimport type { MarkdownNode, MarkdownUrlKind } from '@slotted/core/markdown';\n\n/** Where a link that leaves the application opens. */\nexport type MarkdownExternal = 'new-tab' | 'same-tab';\n\n/** What an application sets once for every document under it. */\nexport interface MarkdownDefaults {\n alerts?: boolean | undefined;\n allow?: readonly string[] | undefined;\n external?: MarkdownExternal | undefined;\n headingAnchors?: boolean | undefined;\n isExternal?: ((href: string) => boolean) | undefined;\n transformUrl?:\n ((url: string, kind: MarkdownUrlKind, node: MarkdownNode) => string | null) | undefined;\n}\n\nexport const MARKDOWN_DEFAULTS = new InjectionToken<MarkdownDefaults>('slotted markdown defaults', {\n providedIn: 'root',\n factory: (): MarkdownDefaults => ({}),\n});\n\n/**\n * An application decides once how its documents treat links, alerts, anchors\n * and URLs. A document that states any of them itself still wins. Its words\n * come from the language in force (`provideSlotted`).\n */\nexport function provideMarkdownDefaults(defaults: MarkdownDefaults) {\n return { provide: MARKDOWN_DEFAULTS, useValue: defaults };\n}\n\nexport function injectMarkdownDefaults(): MarkdownDefaults {\n return inject(MARKDOWN_DEFAULTS);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n Directive,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { SlGlyph, SlIcon } from '@slotted/angular/icon';\nimport { initialLoadingVisibility, nextLoadingVisibility } from '@slotted/core/loading';\nimport { prepareMarkdown } from '@slotted/core/markdown';\nimport type {\n MarkdownAlertElement,\n MarkdownElement,\n MarkdownFootnote,\n MarkdownItemElement,\n MarkdownKind,\n MarkdownNode,\n MarkdownUrlKind,\n} from '@slotted/core/markdown';\nimport type { ChangeRequest } from '@slotted/core/state';\nimport { injectMessages } from '@slotted/angular/i18n';\nimport { markdownMessages, type MarkdownMessages, type PartialMessages } from '@slotted/core/i18n';\nimport { SlAlert, SlAlertContent, SlAlertDescription, SlAlertTitle } from '@slotted/angular/alert';\nimport { SlButton } from '@slotted/angular/button';\nimport { SlCheckbox } from '@slotted/angular/checkbox';\nimport { SlCodeBlock } from '@slotted/angular/code-block';\nimport { SlInlineMessage } from '@slotted/angular/inline-message';\nimport { SlLink } from '@slotted/angular/link';\nimport type { ProseFlow, ProseSize } from '@slotted/angular/prose';\nimport {\n injectProseDefaults,\n SlProse,\n SlProseAnchor,\n SlProseFootnotes,\n SlProseScroll,\n} from '@slotted/angular/prose';\nimport {\n injectSkeletonDefaults,\n SlSkeletonRegion,\n SlSkeletonText,\n} from '@slotted/angular/skeleton';\nimport { SlVisuallyHidden } from '@slotted/angular/visually-hidden';\n\nimport { injectMarkdownDefaults, type MarkdownExternal } from './markdown-defaults';\n\n/** Whether the source arrived. `loading` is separate, because a refresh keeps what is on screen. */\nexport type MarkdownStatus = 'ready' | 'error';\n\n/** What a task checkbox asks for; the box moves when the consumer's tree does. */\nexport interface MarkdownTaskChange {\n index: number;\n checked: boolean;\n offset: number | null;\n request: ChangeRequest<boolean>;\n}\n\n/** Whether the retry was a press with a pointer or with a key. */\nexport type MarkdownRetryReason = 'pointer' | 'keyboard';\n\ntype KeysOf<U> = U extends unknown ? keyof U : never;\ntype ValueOf<U, K extends PropertyKey> = U extends unknown\n ? K extends keyof U\n ? U[K]\n : never\n : never;\n\n/**\n * A prepared element as a template reads it: every field any kind carries,\n * optional. A template names one kind, and Angular's type checker cannot\n * narrow a union on the string the directive was given, so the fields of the\n * kind it names have to be reachable without a cast.\n */\nexport type MarkdownTemplateElement = { readonly kind: MarkdownKind; readonly key: string } & {\n readonly [K in Exclude<KeysOf<MarkdownElement>, 'kind' | 'key'>]?: ValueOf<MarkdownElement, K>;\n};\n\n/** What a node template receives. */\nexport interface MarkdownNodeContext {\n $implicit: MarkdownTemplateElement;\n}\n\n/**\n * Replaces the family's element for one kind — `link`, `code`, `image` — or\n * renders a node type the family does not know — `math`, `html`, a directive\n * — by the node's own `type`. The template receives the prepared element; its\n * children are rendered with `slMarkdownChildren`.\n */\n@Directive({ selector: 'ng-template[slMarkdownNode]', standalone: true })\nexport class SlMarkdownNode {\n readonly kind = input.required<string>({ alias: 'slMarkdownNode' });\n readonly template = inject<TemplateRef<MarkdownNodeContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SlMarkdownNode,\n context: unknown,\n ): context is MarkdownNodeContext {\n return context !== null;\n }\n}\n\n/** The empty part's content, projected in place of `messages.empty`. */\n@Directive({ selector: '[slMarkdownEmpty]', standalone: true })\nexport class SlMarkdownEmpty {}\n\nconst KINDS = new Set<string>([\n 'heading',\n 'paragraph',\n 'blockquote',\n 'alert',\n 'list',\n 'item',\n 'code',\n 'thematicBreak',\n 'table',\n 'text',\n 'emphasis',\n 'strong',\n 'delete',\n 'inlineCode',\n 'break',\n 'link',\n 'image',\n 'footnoteReference',\n] satisfies MarkdownKind[]);\n\n/**\n * A document rendered from a tree, in `prose`'s typography.\n *\n * The family never receives HTML. It takes mdast — remark's output as it is,\n * or marked's through `fromMarkedTokens` — and `prepareMarkdown` from\n * `@slotted/core/markdown` decides everything that is not an element. This\n * component maps each prepared kind to an element, or to the family that\n * already owns it: `slLink`, `slCodeBlock`, `slAlert`, `slCheckbox`.\n *\n * The document is one recursive `ng-template` rendered through\n * `NgTemplateOutlet`, never a recursive component: a component host between\n * a `ul` and its `li`, or between the region and its first block, would break\n * `prose`'s child combinators.\n */\n@Component({\n selector: '[slMarkdown]',\n standalone: true,\n exportAs: 'slMarkdown',\n imports: [\n NgTemplateOutlet,\n SlAlert,\n SlAlertContent,\n SlAlertDescription,\n SlAlertTitle,\n SlButton,\n SlCheckbox,\n SlCodeBlock,\n SlGlyph,\n SlIcon,\n SlInlineMessage,\n SlLink,\n SlProse,\n SlProseAnchor,\n SlProseFootnotes,\n SlProseScroll,\n SlSkeletonRegion,\n SlSkeletonText,\n SlVisuallyHidden,\n ],\n template: `\n @if (status() === 'error') {\n <div data-part=\"error\">\n <p slInlineMessage tone=\"danger\">{{ t('error') }}</p>\n @if (retryable()) {\n <button\n slButton\n type=\"button\"\n size=\"sm\"\n tone=\"secondary\"\n variant=\"outline\"\n (click)=\"retry.emit($event.detail === 0 ? 'keyboard' : 'pointer')\"\n >\n {{ t('retry') }}\n </button>\n }\n </div>\n } @else if (painted()) {\n <div slSkeletonRegion [delay]=\"0\" [minDuration]=\"0\" [messages]=\"{ label: t('loading') }\">\n <div slProse [flow]=\"resolvedFlow()\" [size]=\"size()\">\n <div slSkeletonText lastLineSize=\"62%\" [lines]=\"3\"></div>\n </div>\n </div>\n } @else if (document().empty) {\n @if (!loading()) {\n <p data-part=\"empty\">\n <ng-content select=\"[slMarkdownEmpty]\">{{ t('empty') }}</ng-content>\n </p>\n }\n } @else {\n <div slProse [flow]=\"resolvedFlow()\" [size]=\"size()\">\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: document().children }\" />\n @if (document().footnotes.length > 0) {\n <section slProseFootnotes>\n <h2 slVisuallyHidden [id]=\"document().footnoteLabelId\">\n {{ t('footnotes') }}\n </h2>\n <ol>\n @for (footnote of document().footnotes; track footnote.key) {\n <li [id]=\"footnote.id\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: footnoteLead(footnote) }\"\n />\n @if (footnoteTail(footnote); as last) {\n <p>\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: last.children }\"\n /><ng-container\n *ngTemplateOutlet=\"backrefs; context: { $implicit: footnote }\"\n />\n </p>\n } @else {\n <ng-container *ngTemplateOutlet=\"backrefs; context: { $implicit: footnote }\" />\n }\n </li>\n }\n </ol>\n </section>\n }\n </div>\n }\n\n <ng-template #backrefs let-footnote>\n @for (reference of footnote.references; track reference; let index = $index) {\n <a\n data-part=\"backref\"\n [href]=\"'#' + reference\"\n [attr.aria-label]=\"t('backReference', { number: footnote.number, occurrence: index + 1 })\"\n ><span slIcon><svg slGlyph name=\"arrow-left\"></svg></span\n ></a>\n }\n </ng-template>\n\n <ng-template #nodes let-elements>\n @for (element of elements; track element.key) {\n @if (templateFor(element); as custom) {\n <ng-container *ngTemplateOutlet=\"custom; context: { $implicit: element }\" />\n } @else {\n @switch (element.kind) {\n @case ('text') {\n <ng-container>{{ element.value }}</ng-container>\n }\n @case ('inlineCode') {\n <code>{{ element.value }}</code>\n }\n @case ('break') {\n <br />\n }\n @case ('thematicBreak') {\n <hr />\n }\n @case ('paragraph') {\n <p>\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\" />\n </p>\n }\n @case ('emphasis') {\n <em\n ><ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></em>\n }\n @case ('strong') {\n <strong\n ><ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></strong>\n }\n @case ('delete') {\n <del\n ><ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></del>\n }\n @case ('blockquote') {\n <blockquote>\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\" />\n </blockquote>\n }\n @case ('heading') {\n @switch (element.level) {\n @case (1) {\n <h1 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h1>\n }\n @case (2) {\n <h2 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h2>\n }\n @case (3) {\n <h3 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h3>\n }\n @case (4) {\n <h4 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h4>\n }\n @case (5) {\n <h5 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h5>\n }\n @default {\n <h6 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h6>\n }\n }\n }\n @case ('alert') {\n <div data-part=\"embed\">\n <section slAlert reach=\"section\" live=\"off\" [tone]=\"element.tone\">\n <div slAlertContent>\n <div slAlertTitle>{{ alertTitle(element) }}</div>\n <div slAlertDescription>\n <div data-part=\"alert-body\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </div>\n </div>\n </div>\n </section>\n </div>\n }\n @case ('list') {\n @if (element.ordered) {\n <ol\n [attr.data-part]=\"element.task ? 'task-list' : null\"\n [attr.start]=\"element.start\"\n >\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </ol>\n } @else {\n <ul [attr.data-part]=\"element.task ? 'task-list' : null\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </ul>\n }\n }\n @case ('item') {\n @if (element.checked === null) {\n <li>\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </li>\n } @else {\n <li data-part=\"task\">\n <div\n slCheckbox\n [checked]=\"element.checked\"\n [readOnly]=\"!editableTasks() || undefined\"\n (checkedChange)=\"onTask(element, $event)\"\n >\n <span slVisuallyHidden>{{ element.label }}</span>\n </div>\n <div data-part=\"task-body\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </div>\n </li>\n }\n }\n @case ('code') {\n <div data-part=\"embed\">\n <div\n slCodeBlock\n [code]=\"element.code\"\n [language]=\"element.language ?? 'text'\"\n [title]=\"element.title ?? undefined\"\n [lineNumbers]=\"element.lineNumbers || undefined\"\n [marks]=\"\n element.highlight === null ? undefined : { highlight: element.highlight }\n \"\n ></div>\n </div>\n }\n @case ('table') {\n <div slProseScroll>\n <table>\n <thead>\n <tr>\n @for (cell of element.head; track cell.key) {\n <th scope=\"col\" [attr.data-align]=\"cell.align\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: cell.children }\"\n />\n </th>\n }\n </tr>\n </thead>\n @if (element.rows.length > 0) {\n <tbody>\n @for (row of element.rows; track $index) {\n <tr>\n @for (cell of row; track cell.key) {\n <td [attr.data-align]=\"cell.align\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: cell.children }\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n }\n </table>\n </div>\n }\n @case ('link') {\n @if (element.external && resolvedExternal() === 'new-tab') {\n <a slLink external [href]=\"element.href\" [attr.title]=\"element.title\"\n ><ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></a>\n } @else {\n <a [href]=\"element.href\" [attr.title]=\"element.title\"\n ><ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></a>\n }\n }\n @case ('image') {\n <img\n [src]=\"element.src\"\n [alt]=\"element.alt\"\n [attr.title]=\"element.title\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n }\n @case ('footnoteReference') {\n <sup\n ><a\n data-footnote-ref=\"\"\n [id]=\"element.id\"\n [href]=\"'#' + element.target\"\n [attr.aria-describedby]=\"document().footnoteLabelId\"\n >{{ element.number }}</a\n ></sup\n >\n }\n @case ('custom') {\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\" />\n }\n }\n }\n }\n </ng-template>\n\n <ng-template #heading let-element>\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\" />\n @if (resolvedHeadingAnchors()) {\n <a\n slProseAnchor\n [href]=\"'#' + element.id\"\n [attr.aria-label]=\"t('anchor', { heading: element.text })\"\n >#</a\n >\n }\n </ng-template>\n `,\n styleUrl: '../../../styles/src/markdown/markdown.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'data-ui': 'markdown',\n 'data-part': 'root',\n '[attr.data-status]': 'status()',\n '[attr.data-flow]': 'resolvedFlow()',\n '[attr.data-loading]': \"painted() ? '' : null\",\n '[attr.data-empty]': \"status() === 'ready' && !painted() && document().empty ? '' : null\",\n '[attr.data-streaming]': \"streaming() ? '' : null\",\n '[attr.aria-busy]': \"streaming() || painted() ? 'true' : null\",\n },\n})\nexport class SlMarkdown {\n /** The document, as mdast — remark's `fromMarkdown`, or `fromMarkedTokens(marked.lexer(source))`. */\n readonly tree = input<MarkdownNode | null | undefined>(undefined);\n readonly size = input<ProseSize | undefined>(undefined);\n readonly flow = input<ProseFlow | undefined>(undefined);\n readonly status = input<MarkdownStatus>('ready');\n readonly loading = input(false, { transform: booleanAttribute });\n readonly streaming = input(false, { transform: booleanAttribute });\n readonly external = input<MarkdownExternal | undefined>(undefined);\n readonly headingAnchors = input<boolean | undefined, boolean | string | undefined>(undefined, {\n transform: (value) => (value === undefined ? undefined : booleanAttribute(value)),\n });\n readonly headingOffset = input(0, { transform: numberAttribute });\n readonly idPrefix = input('');\n readonly alerts = input<boolean | undefined, boolean | string | undefined>(undefined, {\n transform: (value) => (value === undefined ? undefined : booleanAttribute(value)),\n });\n readonly allow = input<readonly string[] | undefined>(undefined);\n readonly unwrapDisallowed = input(false, { transform: booleanAttribute });\n readonly transformUrl = input<\n ((url: string, kind: MarkdownUrlKind, node: MarkdownNode) => string | null) | undefined\n >(undefined);\n readonly isExternal = input<((href: string) => boolean) | undefined>(undefined);\n /**\n * Words laid over the catalog of the language in force, key by key: the\n * empty, error, retry and loading texts, the footnotes heading, the back\n * link, the heading permalink, and each alert's title (`alerts.note`).\n */\n readonly messages = input<PartialMessages<MarkdownMessages> | undefined>(undefined);\n /**\n * Enables the task checkboxes. React reads the presence of its handler; an\n * Angular output cannot tell whether anyone listens, so the template says so.\n */\n readonly editableTasks = input(false, { transform: booleanAttribute });\n /** Draws the retry button in the error part, for the same reason. */\n readonly retryable = input(false, { transform: booleanAttribute });\n\n /** A task the reader ticked, with its index; the box moves when the tree does. */\n readonly taskChange = output<MarkdownTaskChange>();\n readonly retry = output<MarkdownRetryReason>();\n\n private readonly templates = contentChildren(SlMarkdownNode);\n private readonly nodesTemplate = viewChild.required<TemplateRef<unknown>>('nodes');\n\n private readonly defaults = injectMarkdownDefaults();\n private readonly proseDefaults = injectProseDefaults();\n private readonly skeletonDefaults = injectSkeletonDefaults();\n\n protected readonly resolvedFlow = computed(() => this.flow() ?? this.proseDefaults.flow);\n protected readonly resolvedExternal = computed(\n () => this.external() ?? this.defaults.external ?? 'new-tab',\n );\n protected readonly resolvedHeadingAnchors = computed(\n () => this.headingAnchors() ?? this.defaults.headingAnchors ?? false,\n );\n /** The family's words in the language in force, with this document's `messages` laid over them. */\n readonly t = injectMessages(markdownMessages, this.messages);\n\n private readonly templateMap = computed(() => {\n const map = new Map<string, TemplateRef<MarkdownNodeContext>>();\n for (const node of this.templates()) map.set(node.kind(), node.template);\n return map;\n });\n\n /** The prepared document: headings, footnotes and the outline a table of contents reads. */\n readonly document = computed(() =>\n prepareMarkdown(this.tree(), {\n alerts: this.alerts() ?? this.defaults.alerts ?? true,\n allow: this.allow() ?? this.defaults.allow,\n custom: [...this.templateMap().keys()].filter((kind) => !KINDS.has(kind)),\n headingOffset: this.headingOffset(),\n idPrefix: this.idPrefix(),\n isExternal: this.isExternal() ?? this.defaults.isExternal,\n transformUrl: this.transformUrl() ?? this.defaults.transformUrl,\n unwrapDisallowed: this.unwrapDisallowed(),\n }),\n );\n\n /*\n * The placeholder and the document are two different trees, so the family\n * decides which one is on screen with the machine `skeleton` uses, reading\n * `skeleton`'s own defaults for how long to wait and how long to hold.\n */\n protected readonly painted = signal(false);\n private visibility = initialLoadingVisibility;\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n effect(() => {\n const loading = this.loading();\n untracked(() => this.tick(loading));\n });\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n /** @internal The template a node's children render through, for `slMarkdownChildren`. */\n childrenTemplate(): TemplateRef<unknown> {\n return this.nodesTemplate();\n }\n\n protected alertTitle(element: MarkdownAlertElement): string {\n return this.t(`alerts.${element.type}`);\n }\n\n protected templateFor(element: MarkdownElement): TemplateRef<MarkdownNodeContext> | undefined {\n return this.templateMap().get(element.kind === 'custom' ? element.type : element.kind);\n }\n\n protected footnoteLead(footnote: MarkdownFootnote): readonly MarkdownElement[] {\n return footnote.children.at(-1)?.kind === 'paragraph'\n ? footnote.children.slice(0, -1)\n : footnote.children;\n }\n\n protected footnoteTail(footnote: MarkdownFootnote) {\n const last = footnote.children.at(-1);\n return last?.kind === 'paragraph' ? last : null;\n }\n\n protected onTask(element: MarkdownItemElement, request: ChangeRequest<boolean>): void {\n this.taskChange.emit({\n checked: request.value,\n index: element.task ?? 0,\n offset: element.offset,\n request,\n });\n }\n\n private tick(loading: boolean): void {\n const answer = nextLoadingVisibility({\n delay: this.skeletonDefaults.delay ?? 0,\n loading,\n minDuration: this.skeletonDefaults.minDuration ?? 0,\n now: Date.now(),\n state: this.visibility,\n });\n this.visibility = answer.state;\n this.painted.set(answer.state.visible);\n clearTimeout(this.timer);\n if (answer.wait !== null) {\n this.timer = setTimeout(() => this.tick(this.loading()), answer.wait);\n }\n }\n}\n\n/**\n * Renders an element's children inside a node template, adding no element of\n * its own: `<ng-container [slMarkdownChildren]=\"element\" />`.\n */\n@Directive({ selector: '[slMarkdownChildren]', standalone: true })\nexport class SlMarkdownChildren {\n readonly element = input.required<{ readonly children?: readonly MarkdownElement[] }>({\n alias: 'slMarkdownChildren',\n });\n private readonly markdown = inject(SlMarkdown);\n private readonly container = inject(ViewContainerRef);\n\n constructor() {\n effect(() => {\n const children = this.element().children ?? [];\n untracked(() => {\n this.container.clear();\n this.container.createEmbeddedView(this.markdown.childrenTemplate(), {\n $implicit: children,\n });\n });\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slotted-angular-markdown.mjs","sources":["../../markdown/src/markdown-defaults.ts","../../markdown/src/markdown.ts","../../markdown/src/slotted-angular-markdown.ts"],"sourcesContent":["import { inject, InjectionToken } from '@angular/core';\nimport type { MarkdownNode, MarkdownUrlKind } from '@slotted/core/markdown';\n\n/** Where a link that leaves the application opens. */\nexport type MarkdownExternal = 'new-tab' | 'same-tab';\n\n/** What an application sets once for every document under it. */\nexport interface MarkdownDefaults {\n alerts?: boolean | undefined;\n allow?: readonly string[] | undefined;\n external?: MarkdownExternal | undefined;\n headingAnchors?: boolean | undefined;\n isExternal?: ((href: string) => boolean) | undefined;\n transformUrl?:\n ((url: string, kind: MarkdownUrlKind, node: MarkdownNode) => string | null) | undefined;\n}\n\nexport const MARKDOWN_DEFAULTS = new InjectionToken<MarkdownDefaults>('slotted markdown defaults', {\n providedIn: 'root',\n factory: (): MarkdownDefaults => ({}),\n});\n\n/**\n * An application decides once how its documents treat links, alerts, anchors\n * and URLs. A document that states any of them itself still wins. Its words\n * come from the language in force (`provideSlotted`).\n */\nexport function provideMarkdownDefaults(defaults: MarkdownDefaults) {\n return { provide: MARKDOWN_DEFAULTS, useValue: defaults };\n}\n\nexport function injectMarkdownDefaults(): MarkdownDefaults {\n return inject(MARKDOWN_DEFAULTS);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n Directive,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { SlGlyph, SlIcon } from '@slotted/angular/icon';\nimport { initialLoadingVisibility, nextLoadingVisibility } from '@slotted/core/loading';\nimport { prepareMarkdown } from '@slotted/core/markdown';\nimport type {\n MarkdownAlertElement,\n MarkdownElement,\n MarkdownFootnote,\n MarkdownItemElement,\n MarkdownKind,\n MarkdownNode,\n MarkdownUrlKind,\n} from '@slotted/core/markdown';\nimport type { ChangeRequest } from '@slotted/core/state';\nimport { injectMessages } from '@slotted/angular/i18n';\nimport { markdownMessages, type MarkdownMessages, type PartialMessages } from '@slotted/core/i18n';\nimport { SlAlert, SlAlertContent, SlAlertDescription, SlAlertTitle } from '@slotted/angular/alert';\nimport { SlButton } from '@slotted/angular/button';\nimport { SlCheckbox } from '@slotted/angular/checkbox';\nimport { SlCodeBlock } from '@slotted/angular/code-block';\nimport { SlInlineMessage } from '@slotted/angular/inline-message';\nimport { SlLink } from '@slotted/angular/link';\nimport type { ProseFlow, ProseSize } from '@slotted/angular/prose';\nimport {\n injectProseDefaults,\n SlProse,\n SlProseAnchor,\n SlProseFootnotes,\n SlProseScroll,\n} from '@slotted/angular/prose';\nimport {\n injectSkeletonDefaults,\n SlSkeletonRegion,\n SlSkeletonText,\n} from '@slotted/angular/skeleton';\nimport { SlVisuallyHidden } from '@slotted/angular/visually-hidden';\n\nimport { injectMarkdownDefaults, type MarkdownExternal } from './markdown-defaults';\n\n/** Whether the source arrived. `loading` is separate, because a refresh keeps what is on screen. */\nexport type MarkdownStatus = 'ready' | 'error';\n\n/** What a task checkbox asks for; the box moves when the consumer's tree does. */\nexport interface MarkdownTaskChange {\n index: number;\n checked: boolean;\n offset: number | null;\n request: ChangeRequest<boolean>;\n}\n\n/** Whether the retry was a press with a pointer or with a key. */\nexport type MarkdownRetryReason = 'pointer' | 'keyboard';\n\ntype KeysOf<U> = U extends unknown ? keyof U : never;\ntype ValueOf<U, K extends PropertyKey> = U extends unknown\n ? K extends keyof U\n ? U[K]\n : never\n : never;\n\n/**\n * A prepared element as a template reads it: every field any kind carries,\n * optional. A template names one kind, and Angular's type checker cannot\n * narrow a union on the string the directive was given, so the fields of the\n * kind it names have to be reachable without a cast.\n */\nexport type MarkdownTemplateElement = { readonly kind: MarkdownKind; readonly key: string } & {\n readonly [K in Exclude<KeysOf<MarkdownElement>, 'kind' | 'key'>]?: ValueOf<MarkdownElement, K>;\n};\n\n/** What a node template receives. */\nexport interface MarkdownNodeContext {\n $implicit: MarkdownTemplateElement;\n}\n\n/**\n * Replaces the family's element for one kind — `link`, `code`, `image` — or\n * renders a node type the family does not know — `math`, `html`, a directive\n * — by the node's own `type`. The template receives the prepared element; its\n * children are rendered with `slMarkdownChildren`.\n */\n@Directive({ selector: 'ng-template[slMarkdownNode]', standalone: true })\nexport class SlMarkdownNode {\n readonly kind = input.required<string>({ alias: 'slMarkdownNode' });\n readonly template = inject<TemplateRef<MarkdownNodeContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SlMarkdownNode,\n context: unknown,\n ): context is MarkdownNodeContext {\n return context !== null;\n }\n}\n\n/** The empty part's content, projected in place of `messages.empty`. */\n@Directive({ selector: '[slMarkdownEmpty]', standalone: true })\nexport class SlMarkdownEmpty {}\n\nconst KINDS = new Set<string>([\n 'heading',\n 'paragraph',\n 'blockquote',\n 'alert',\n 'list',\n 'item',\n 'code',\n 'thematicBreak',\n 'table',\n 'text',\n 'emphasis',\n 'strong',\n 'delete',\n 'inlineCode',\n 'break',\n 'link',\n 'image',\n 'footnoteReference',\n] satisfies MarkdownKind[]);\n\n/**\n * A document rendered from a tree, in `prose`'s typography.\n *\n * The family never receives HTML. It takes mdast — remark's output as it is,\n * or marked's through `fromMarkedTokens` — and `prepareMarkdown` from\n * `@slotted/core/markdown` decides everything that is not an element. This\n * component maps each prepared kind to an element, or to the family that\n * already owns it: `slLink`, `slCodeBlock`, `slAlert`, `slCheckbox`.\n *\n * The document is one recursive `ng-template` rendered through\n * `NgTemplateOutlet`, never a recursive component: a component host between\n * a `ul` and its `li`, or between the region and its first block, would break\n * `prose`'s child combinators.\n */\n@Component({\n selector: '[slMarkdown]',\n standalone: true,\n exportAs: 'slMarkdown',\n imports: [\n NgTemplateOutlet,\n SlAlert,\n SlAlertContent,\n SlAlertDescription,\n SlAlertTitle,\n SlButton,\n SlCheckbox,\n SlCodeBlock,\n SlGlyph,\n SlIcon,\n SlInlineMessage,\n SlLink,\n SlProse,\n SlProseAnchor,\n SlProseFootnotes,\n SlProseScroll,\n SlSkeletonRegion,\n SlSkeletonText,\n SlVisuallyHidden,\n ],\n template: `\n @if (status() === 'error') {\n <div data-part=\"error\">\n <p slInlineMessage tone=\"danger\">{{ t('error') }}</p>\n @if (retryable()) {\n <button\n slButton\n type=\"button\"\n size=\"sm\"\n tone=\"secondary\"\n variant=\"outline\"\n (click)=\"retry.emit($event.detail === 0 ? 'keyboard' : 'pointer')\"\n >\n {{ t('retry') }}\n </button>\n }\n </div>\n } @else if (painted()) {\n <div slSkeletonRegion [delay]=\"0\" [minDuration]=\"0\" [messages]=\"{ label: t('loading') }\">\n <div slProse [flow]=\"resolvedFlow()\" [size]=\"size()\">\n <div slSkeletonText lastLineSize=\"62%\" [lines]=\"3\"></div>\n </div>\n </div>\n } @else if (document().empty) {\n @if (!loading()) {\n <p data-part=\"empty\">\n <ng-content select=\"[slMarkdownEmpty]\">{{ t('empty') }}</ng-content>\n </p>\n }\n } @else {\n <div slProse [flow]=\"resolvedFlow()\" [size]=\"size()\">\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: document().children }\" />\n @if (document().footnotes.length > 0) {\n <section slProseFootnotes>\n <h2 slVisuallyHidden [id]=\"document().footnoteLabelId\">\n {{ t('footnotes') }}\n </h2>\n <ol>\n @for (footnote of document().footnotes; track footnote.key) {\n <li [id]=\"footnote.id\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: footnoteLead(footnote) }\"\n />\n @if (footnoteTail(footnote); as last) {\n <p>\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: last.children }\"\n /><ng-container\n *ngTemplateOutlet=\"backrefs; context: { $implicit: footnote }\"\n />\n </p>\n } @else {\n <ng-container *ngTemplateOutlet=\"backrefs; context: { $implicit: footnote }\" />\n }\n </li>\n }\n </ol>\n </section>\n }\n </div>\n }\n\n <ng-template #backrefs let-footnote>\n @for (reference of footnote.references; track reference; let index = $index) {\n <a\n data-part=\"backref\"\n [href]=\"'#' + reference\"\n [attr.aria-label]=\"t('backReference', { number: footnote.number, occurrence: index + 1 })\"\n ><span slIcon><svg slGlyph name=\"arrow-left\"></svg></span\n ></a>\n }\n </ng-template>\n\n <ng-template #nodes let-elements>\n @for (element of elements; track element.key) {\n @if (templateFor(element); as custom) {\n <ng-container *ngTemplateOutlet=\"custom; context: { $implicit: element }\" />\n } @else {\n @switch (element.kind) {\n @case ('text') {\n <ng-container>{{ element.value }}</ng-container>\n }\n @case ('inlineCode') {\n <code>{{ element.value }}</code>\n }\n @case ('break') {\n <br />\n }\n @case ('thematicBreak') {\n <hr />\n }\n @case ('paragraph') {\n <p>\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\" />\n </p>\n }\n @case ('emphasis') {\n <em\n ><ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></em>\n }\n @case ('strong') {\n <strong\n ><ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></strong>\n }\n @case ('delete') {\n <del\n ><ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></del>\n }\n @case ('blockquote') {\n <blockquote>\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\" />\n </blockquote>\n }\n @case ('heading') {\n @switch (element.level) {\n @case (1) {\n <h1 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h1>\n }\n @case (2) {\n <h2 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h2>\n }\n @case (3) {\n <h3 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h3>\n }\n @case (4) {\n <h4 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h4>\n }\n @case (5) {\n <h5 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h5>\n }\n @default {\n <h6 [id]=\"element.id\">\n <ng-container *ngTemplateOutlet=\"heading; context: { $implicit: element }\" />\n </h6>\n }\n }\n }\n @case ('alert') {\n <div data-part=\"embed\">\n <section slAlert reach=\"section\" live=\"off\" [tone]=\"element.tone\">\n <div slAlertContent>\n <div slAlertTitle>{{ alertTitle(element) }}</div>\n <div slAlertDescription>\n <div data-part=\"alert-body\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </div>\n </div>\n </div>\n </section>\n </div>\n }\n @case ('list') {\n @if (element.ordered) {\n <ol\n [attr.data-part]=\"element.task ? 'task-list' : null\"\n [attr.start]=\"element.start\"\n >\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </ol>\n } @else {\n <ul [attr.data-part]=\"element.task ? 'task-list' : null\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </ul>\n }\n }\n @case ('item') {\n @if (element.checked === null) {\n <li>\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </li>\n } @else {\n <li data-part=\"task\">\n <div\n slCheckbox\n [checked]=\"element.checked\"\n [readOnly]=\"!editableTasks() || undefined\"\n (checkedChange)=\"onTask(element, $event)\"\n >\n <span slVisuallyHidden>{{ element.label }}</span>\n </div>\n <div data-part=\"task-body\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n />\n </div>\n </li>\n }\n }\n @case ('code') {\n <div data-part=\"embed\">\n <div\n slCodeBlock\n [code]=\"element.code\"\n [language]=\"element.language ?? 'text'\"\n [title]=\"element.title ?? undefined\"\n [lineNumbers]=\"element.lineNumbers || undefined\"\n [marks]=\"\n element.highlight === null ? undefined : { highlight: element.highlight }\n \"\n ></div>\n </div>\n }\n @case ('table') {\n <div slProseScroll>\n <table>\n <thead>\n <tr>\n @for (cell of element.head; track cell.key) {\n <th scope=\"col\" [attr.data-align]=\"cell.align\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: cell.children }\"\n />\n </th>\n }\n </tr>\n </thead>\n @if (element.rows.length > 0) {\n <tbody>\n @for (row of element.rows; track $index) {\n <tr>\n @for (cell of row; track cell.key) {\n <td [attr.data-align]=\"cell.align\">\n <ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: cell.children }\"\n />\n </td>\n }\n </tr>\n }\n </tbody>\n }\n </table>\n </div>\n }\n @case ('link') {\n @if (element.external && resolvedExternal() === 'new-tab') {\n <a slLink external [href]=\"element.href\" [attr.title]=\"element.title\"\n ><ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></a>\n } @else {\n <a [href]=\"element.href\" [attr.title]=\"element.title\"\n ><ng-container\n *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\"\n /></a>\n }\n }\n @case ('image') {\n <img\n [src]=\"element.src\"\n [alt]=\"element.alt\"\n [attr.title]=\"element.title\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n }\n @case ('footnoteReference') {\n <sup\n ><a\n data-footnote-ref=\"\"\n [id]=\"element.id\"\n [href]=\"'#' + element.target\"\n [attr.aria-describedby]=\"document().footnoteLabelId\"\n >{{ element.number }}</a\n ></sup\n >\n }\n @case ('custom') {\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\" />\n }\n }\n }\n }\n </ng-template>\n\n <ng-template #heading let-element>\n <ng-container *ngTemplateOutlet=\"nodes; context: { $implicit: element.children }\" />\n @if (resolvedHeadingAnchors()) {\n <a\n slProseAnchor\n [href]=\"'#' + element.id\"\n [attr.aria-label]=\"t('anchor', { heading: element.text })\"\n >#</a\n >\n }\n </ng-template>\n `,\n styleUrl: '../../../styles/src/markdown/markdown.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'data-ui': 'markdown',\n 'data-part': 'root',\n '[attr.data-status]': 'status()',\n '[attr.data-flow]': 'resolvedFlow()',\n '[attr.data-loading]': \"painted() ? '' : null\",\n '[attr.data-empty]': \"status() === 'ready' && !painted() && document().empty ? '' : null\",\n '[attr.data-streaming]': \"streaming() ? '' : null\",\n '[attr.aria-busy]': \"streaming() || painted() ? 'true' : null\",\n },\n})\nexport class SlMarkdown {\n /** The document, as mdast — remark's `fromMarkdown`, or `fromMarkedTokens(marked.lexer(source))`. */\n readonly tree = input<MarkdownNode | null | undefined>(undefined);\n readonly size = input<ProseSize | undefined>(undefined);\n readonly flow = input<ProseFlow | undefined>(undefined);\n readonly status = input<MarkdownStatus>('ready');\n readonly loading = input(false, { transform: booleanAttribute });\n readonly streaming = input(false, { transform: booleanAttribute });\n readonly external = input<MarkdownExternal | undefined>(undefined);\n readonly headingAnchors = input<boolean | undefined, boolean | string | undefined>(undefined, {\n transform: (value) => (value === undefined ? undefined : booleanAttribute(value)),\n });\n readonly headingOffset = input(0, { transform: numberAttribute });\n readonly idPrefix = input('');\n readonly alerts = input<boolean | undefined, boolean | string | undefined>(undefined, {\n transform: (value) => (value === undefined ? undefined : booleanAttribute(value)),\n });\n readonly allow = input<readonly string[] | undefined>(undefined);\n readonly unwrapDisallowed = input(false, { transform: booleanAttribute });\n readonly transformUrl = input<\n ((url: string, kind: MarkdownUrlKind, node: MarkdownNode) => string | null) | undefined\n >(undefined);\n readonly isExternal = input<((href: string) => boolean) | undefined>(undefined);\n /**\n * Words laid over the catalog of the language in force, key by key: the\n * empty, error, retry and loading texts, the footnotes heading, the back\n * link, the heading permalink, and each alert's title (`alerts.note`).\n */\n readonly messages = input<PartialMessages<MarkdownMessages> | undefined>(undefined);\n /**\n * Enables the task checkboxes. React reads the presence of its handler; an\n * Angular output cannot tell whether anyone listens, so the template says so.\n */\n readonly editableTasks = input(false, { transform: booleanAttribute });\n /** Draws the retry button in the error part, for the same reason. */\n readonly retryable = input(false, { transform: booleanAttribute });\n\n /** A task the reader ticked, with its index; the box moves when the tree does. */\n readonly taskChange = output<MarkdownTaskChange>();\n readonly retry = output<MarkdownRetryReason>();\n\n private readonly templates = contentChildren(SlMarkdownNode);\n private readonly nodesTemplate = viewChild.required<TemplateRef<unknown>>('nodes');\n\n private readonly defaults = injectMarkdownDefaults();\n private readonly proseDefaults = injectProseDefaults();\n private readonly skeletonDefaults = injectSkeletonDefaults();\n\n protected readonly resolvedFlow = computed(() => this.flow() ?? this.proseDefaults.flow);\n protected readonly resolvedExternal = computed(\n () => this.external() ?? this.defaults.external ?? 'new-tab',\n );\n protected readonly resolvedHeadingAnchors = computed(\n () => this.headingAnchors() ?? this.defaults.headingAnchors ?? false,\n );\n /** The family's words in the language in force, with this document's `messages` laid over them. */\n readonly t = injectMessages(markdownMessages, this.messages);\n\n private readonly templateMap = computed(() => {\n const map = new Map<string, TemplateRef<MarkdownNodeContext>>();\n for (const node of this.templates()) map.set(node.kind(), node.template);\n return map;\n });\n\n /** The prepared document: headings, footnotes and the outline a table of contents reads. */\n readonly document = computed(() =>\n prepareMarkdown(this.tree(), {\n alerts: this.alerts() ?? this.defaults.alerts ?? true,\n allow: this.allow() ?? this.defaults.allow,\n custom: [...this.templateMap().keys()].filter((kind) => !KINDS.has(kind)),\n headingOffset: this.headingOffset(),\n idPrefix: this.idPrefix(),\n isExternal: this.isExternal() ?? this.defaults.isExternal,\n transformUrl: this.transformUrl() ?? this.defaults.transformUrl,\n unwrapDisallowed: this.unwrapDisallowed(),\n }),\n );\n\n /*\n * The placeholder and the document are two different trees, so the family\n * decides which one is on screen with the machine `skeleton` uses, reading\n * `skeleton`'s own defaults for how long to wait and how long to hold.\n */\n protected readonly painted = signal(false);\n private visibility = initialLoadingVisibility;\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n effect(() => {\n const loading = this.loading();\n untracked(() => this.tick(loading));\n });\n inject(DestroyRef).onDestroy(() => clearTimeout(this.timer));\n }\n\n /** @internal The template a node's children render through, for `slMarkdownChildren`. */\n childrenTemplate(): TemplateRef<unknown> {\n return this.nodesTemplate();\n }\n\n protected alertTitle(element: MarkdownAlertElement): string {\n return this.t(`alerts.${element.type}`);\n }\n\n protected templateFor(element: MarkdownElement): TemplateRef<MarkdownNodeContext> | undefined {\n return this.templateMap().get(element.kind === 'custom' ? element.type : element.kind);\n }\n\n protected footnoteLead(footnote: MarkdownFootnote): readonly MarkdownElement[] {\n return footnote.children.at(-1)?.kind === 'paragraph'\n ? footnote.children.slice(0, -1)\n : footnote.children;\n }\n\n protected footnoteTail(footnote: MarkdownFootnote) {\n const last = footnote.children.at(-1);\n return last?.kind === 'paragraph' ? last : null;\n }\n\n protected onTask(element: MarkdownItemElement, request: ChangeRequest<boolean>): void {\n this.taskChange.emit({\n checked: request.value,\n index: element.task ?? 0,\n offset: element.offset,\n request,\n });\n }\n\n private tick(loading: boolean): void {\n const answer = nextLoadingVisibility({\n delay: this.skeletonDefaults.delay ?? 0,\n loading,\n minDuration: this.skeletonDefaults.minDuration ?? 0,\n now: Date.now(),\n state: this.visibility,\n });\n this.visibility = answer.state;\n this.painted.set(answer.state.visible);\n clearTimeout(this.timer);\n if (answer.wait !== null) {\n this.timer = setTimeout(() => this.tick(this.loading()), answer.wait);\n }\n }\n}\n\n/**\n * Renders an element's children inside a node template, adding no element of\n * its own: `<ng-container [slMarkdownChildren]=\"element\" />`.\n */\n@Directive({ selector: '[slMarkdownChildren]', standalone: true })\nexport class SlMarkdownChildren {\n readonly element = input.required<{ readonly children?: readonly MarkdownElement[] }>({\n alias: 'slMarkdownChildren',\n });\n private readonly markdown = inject(SlMarkdown);\n private readonly container = inject(ViewContainerRef);\n\n constructor() {\n effect(() => {\n const children = this.element().children ?? [];\n untracked(() => {\n this.container.clear();\n this.container.createEmbeddedView(this.markdown.childrenTemplate(), {\n $implicit: children,\n });\n });\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createFilter, moveIndex } from '@slotted/core/collection';
|
|
1
|
+
import { createFilter, revealWithin, moveIndex } from '@slotted/core/collection';
|
|
2
2
|
import { pressOrigin, createDismissableLayer } from '@slotted/core/dismissable-layer';
|
|
3
3
|
import { createArrowNavigation, createRemovalFocus } from '@slotted/core/focus';
|
|
4
4
|
import { multiSelectMessages } from '@slotted/core/i18n';
|
|
@@ -81,30 +81,6 @@ function injectMultiSelectDefaults() {
|
|
|
81
81
|
* the result set, and every count and every move has to skip it.
|
|
82
82
|
*/
|
|
83
83
|
const OPTION_SELECTOR = "[data-part='item']:not([hidden])";
|
|
84
|
-
/**
|
|
85
|
-
* Brings an option into view without moving the page: the nearest scrolling
|
|
86
|
-
* box between the option and the popup surface is scrolled, by the least
|
|
87
|
-
* distance that shows the whole row, and nothing past it. `scrollIntoView`
|
|
88
|
-
* would scroll every ancestor too, and on the first open it runs before the
|
|
89
|
-
* popup is positioned — a control far down a page sent the page to its top.
|
|
90
|
-
*/
|
|
91
|
-
function revealWithin(option, surface) {
|
|
92
|
-
let box = surface;
|
|
93
|
-
for (let node = option.parentElement; node !== null && node !== surface; node = node.parentElement) {
|
|
94
|
-
const overflow = getComputedStyle(node).overflowY;
|
|
95
|
-
if (overflow === 'auto' || overflow === 'scroll') {
|
|
96
|
-
box = node;
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
const row = option.getBoundingClientRect();
|
|
101
|
-
const top = box.getBoundingClientRect().top + box.clientTop;
|
|
102
|
-
const bottom = top + box.clientHeight;
|
|
103
|
-
if (row.top < top)
|
|
104
|
-
box.scrollTop -= top - row.top;
|
|
105
|
-
else if (row.bottom > bottom)
|
|
106
|
-
box.scrollTop += Math.min(row.bottom - bottom, row.top - top);
|
|
107
|
-
}
|
|
108
84
|
/** The chips in the row, which are every cell but the one holding the caret. */
|
|
109
85
|
const CHIP_SELECTOR = "[data-part='chips'] > [role='gridcell']:not([data-part='field'])";
|
|
110
86
|
const isGroup = (entry) => 'options' in entry;
|
|
@@ -361,6 +337,23 @@ class SlMultiSelect {
|
|
|
361
337
|
...(ngDevMode ? [{ debugName: "showClear" }] : /* istanbul ignore next */ []));
|
|
362
338
|
gridLabel = computed(() => this.t('chosen', { count: this.value().length }), /* @ts-ignore */
|
|
363
339
|
...(ngDevMode ? [{ debugName: "gridLabel" }] : /* istanbul ignore next */ []));
|
|
340
|
+
chosenId = computed(() => `${this.controlId()}-chosen`, /* @ts-ignore */
|
|
341
|
+
...(ngDevMode ? [{ debugName: "chosenId" }] : /* istanbul ignore next */ []));
|
|
342
|
+
/**
|
|
343
|
+
* The contract's wiring: the grid carries the field's label and the count of
|
|
344
|
+
* chips. A label written as text is joined to the count; a field's label is
|
|
345
|
+
* read through `aria-labelledby` with the count beside it.
|
|
346
|
+
*/
|
|
347
|
+
gridName = computed(() => {
|
|
348
|
+
const written = this.ariaLabel();
|
|
349
|
+
if (written !== undefined)
|
|
350
|
+
return { label: `${written}, ${this.gridLabel()}`, labelledBy: null };
|
|
351
|
+
const field = this.field?.ids().label;
|
|
352
|
+
if (field !== undefined)
|
|
353
|
+
return { label: null, labelledBy: `${field} ${this.chosenId()}` };
|
|
354
|
+
return { label: this.gridLabel(), labelledBy: null };
|
|
355
|
+
}, /* @ts-ignore */
|
|
356
|
+
...(ngDevMode ? [{ debugName: "gridName" }] : /* istanbul ignore next */ []));
|
|
364
357
|
counterText = computed(() => {
|
|
365
358
|
const limit = this.resolvedMax();
|
|
366
359
|
if (limit !== null) {
|
|
@@ -1185,7 +1178,13 @@ class SlMultiSelect {
|
|
|
1185
1178
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SlMultiSelect), multi: true },
|
|
1186
1179
|
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => SlMultiSelect), multi: true },
|
|
1187
1180
|
], viewQueries: [{ propertyName: "template", first: true, predicate: ["layer"], descendants: true, isSignal: true }, { propertyName: "controlRef", first: true, predicate: ["control"], descendants: true, isSignal: true }, { propertyName: "rowRef", first: true, predicate: ["row"], descendants: true, isSignal: true }, { propertyName: "countRef", first: true, predicate: ["count"], descendants: true, isSignal: true }], exportAs: ["slMultiSelect"], ngImport: i0, template: `
|
|
1188
|
-
<
|
|
1181
|
+
<span hidden [id]="chosenId()">{{ gridLabel() }}</span>
|
|
1182
|
+
<div
|
|
1183
|
+
data-part="control"
|
|
1184
|
+
role="grid"
|
|
1185
|
+
[attr.aria-label]="gridName().label"
|
|
1186
|
+
[attr.aria-labelledby]="gridName().labelledBy"
|
|
1187
|
+
>
|
|
1189
1188
|
<div data-part="chips" role="row" #row>
|
|
1190
1189
|
@for (chip of value(); track chip; let index = $index) {
|
|
1191
1190
|
@if (editingValue() === chip) {
|
|
@@ -1450,7 +1449,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImpor
|
|
|
1450
1449
|
'[attr.data-complete]': "full() ? '' : null",
|
|
1451
1450
|
'[attr.data-narrow]': "narrow() ? '' : null",
|
|
1452
1451
|
}, template: `
|
|
1453
|
-
<
|
|
1452
|
+
<span hidden [id]="chosenId()">{{ gridLabel() }}</span>
|
|
1453
|
+
<div
|
|
1454
|
+
data-part="control"
|
|
1455
|
+
role="grid"
|
|
1456
|
+
[attr.aria-label]="gridName().label"
|
|
1457
|
+
[attr.aria-labelledby]="gridName().labelledBy"
|
|
1458
|
+
>
|
|
1454
1459
|
<div data-part="chips" role="row" #row>
|
|
1455
1460
|
@for (chip of value(); track chip; let index = $index) {
|
|
1456
1461
|
@if (editingValue() === chip) {
|