@refrakt-md/plan 0.15.0 → 0.16.1
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/dist/cli-plugin.js +1 -1
- package/dist/cli-plugin.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +5 -0
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/plan-behaviors.js +5 -4
- package/dist/commands/plan-behaviors.js.map +1 -1
- package/dist/commands/render-pipeline.d.ts.map +1 -1
- package/dist/commands/render-pipeline.js +24 -3
- package/dist/commands/render-pipeline.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +5 -0
- package/dist/commands/serve.js.map +1 -1
- package/dist/filter.d.ts +6 -11
- package/dist/filter.d.ts.map +1 -1
- package/dist/filter.js +7 -65
- package/dist/filter.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -7
- package/dist/index.js.map +1 -1
- package/dist/pipeline.d.ts +6 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +108 -458
- package/dist/pipeline.js.map +1 -1
- package/dist/scanner-core.d.ts.map +1 -1
- package/dist/scanner-core.js +10 -2
- package/dist/scanner-core.js.map +1 -1
- package/dist/tags/backlog.d.ts +0 -1
- package/dist/tags/backlog.d.ts.map +1 -1
- package/dist/tags/backlog.js +62 -39
- package/dist/tags/backlog.js.map +1 -1
- package/dist/tags/decision-log.d.ts +0 -1
- package/dist/tags/decision-log.d.ts.map +1 -1
- package/dist/tags/decision-log.js +54 -22
- package/dist/tags/decision-log.js.map +1 -1
- package/dist/tags/plan-activity.d.ts +0 -1
- package/dist/tags/plan-activity.d.ts.map +1 -1
- package/dist/tags/plan-activity.js +49 -18
- package/dist/tags/plan-activity.js.map +1 -1
- package/package.json +8 -8
- package/dist/cards.d.ts +0 -23
- package/dist/cards.d.ts.map +0 -1
- package/dist/cards.js +0 -150
- package/dist/cards.js.map +0 -1
- package/dist/entity-tabs-behavior.d.ts +0 -13
- package/dist/entity-tabs-behavior.d.ts.map +0 -1
- package/dist/entity-tabs-behavior.js +0 -94
- package/dist/entity-tabs-behavior.js.map +0 -1
|
@@ -1,29 +1,60 @@
|
|
|
1
1
|
import Markdoc from '@markdoc/markdoc';
|
|
2
2
|
const { Tag } = Markdoc;
|
|
3
|
-
import { createContentModelSchema, createComponentRenderable } from '@refrakt-md/runes';
|
|
4
|
-
|
|
3
|
+
import { createContentModelSchema, createComponentRenderable, readDeferredBody, COLLECTION_SENTINEL } from '@refrakt-md/runes';
|
|
4
|
+
/**
|
|
5
|
+
* `plan-activity` (SPEC-072 / WORK-284) — thin sugar for a `collection` query
|
|
6
|
+
* over all plan entity types, sorted by recent modification. Lowers to a
|
|
7
|
+
* `collection`-shaped renderable so the shared `resolveCollections` resolver
|
|
8
|
+
* handles selection, sorting, limit, and per-item rendering. The body is an
|
|
9
|
+
* optional override; absent → a default heading-template table (Item / Type /
|
|
10
|
+
* Status / Modified) — an "activity" feed reads as a scannable chronological
|
|
11
|
+
* list of changes, and the per-row Type column keeps mixed-entity rows
|
|
12
|
+
* self-explanatory.
|
|
13
|
+
*
|
|
14
|
+
* Legacy attribute preserved (`limit`, default 10) so existing
|
|
15
|
+
* `{% plan-activity %}` content keeps working. Entities without a `modified`
|
|
16
|
+
* date sort last under the shared sort (instead of being dropped entirely as
|
|
17
|
+
* the previous bespoke resolver did) — accepted per ADR-012.
|
|
18
|
+
*/
|
|
19
|
+
const DEFAULT_PLAN_ACTIVITY_BODY = `# Item
|
|
20
|
+
{% link href=$item.url %}**{% $item.id %}** — {% $item.data.title %}{% /link %}
|
|
21
|
+
# Type
|
|
22
|
+
{% humanize($item.type) %}
|
|
23
|
+
# Status
|
|
24
|
+
{% humanize($item.data.status) %}
|
|
25
|
+
# Modified
|
|
26
|
+
{% date($item.data.modified) %}
|
|
27
|
+
`;
|
|
5
28
|
export const planActivity = createContentModelSchema({
|
|
6
29
|
attributes: {
|
|
7
30
|
limit: { type: Number, required: false, default: 10, description: 'Maximum number of recent items to show.' },
|
|
8
31
|
},
|
|
9
|
-
|
|
10
|
-
contentModel: {
|
|
11
|
-
type: 'sequence',
|
|
12
|
-
fields: [],
|
|
13
|
-
},
|
|
32
|
+
deferBody: true,
|
|
33
|
+
contentModel: { type: 'sequence', fields: [] },
|
|
14
34
|
transform(_resolved, attrs) {
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
35
|
+
const meta = (field, content) => new Tag('meta', { 'data-field': field, content });
|
|
36
|
+
const bodySource = readDeferredBody(attrs) ?? DEFAULT_PLAN_ACTIVITY_BODY;
|
|
37
|
+
const limit = attrs.limit ?? 10;
|
|
38
|
+
const metas = [
|
|
39
|
+
meta('collection-type', 'work,bug,spec,decision,milestone'),
|
|
40
|
+
meta('collection-filter', ''),
|
|
41
|
+
meta('collection-sort', '-modified'),
|
|
42
|
+
meta('collection-group', ''),
|
|
43
|
+
meta('collection-limit', String(limit)),
|
|
44
|
+
meta('collection-fields', ''),
|
|
45
|
+
meta('collection-layout', 'table'),
|
|
46
|
+
meta('collection-group-display', 'headings'),
|
|
47
|
+
meta('collection-empty', ''),
|
|
48
|
+
meta(COLLECTION_SENTINEL, 'true'),
|
|
49
|
+
meta('collection-body', bodySource),
|
|
50
|
+
];
|
|
51
|
+
const placeholder = new Tag('div', { 'data-name': 'items' }, []);
|
|
52
|
+
return createComponentRenderable({
|
|
53
|
+
rune: 'collection',
|
|
19
54
|
tag: 'section',
|
|
20
|
-
properties: {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
refs: {
|
|
24
|
-
items: placeholder,
|
|
25
|
-
},
|
|
26
|
-
children: [limitMeta, sentinelMeta, placeholder],
|
|
55
|
+
properties: {},
|
|
56
|
+
refs: { items: placeholder },
|
|
57
|
+
children: [...metas, placeholder],
|
|
27
58
|
});
|
|
28
59
|
},
|
|
29
60
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-activity.js","sourceRoot":"","sources":["../../src/tags/plan-activity.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,
|
|
1
|
+
{"version":3,"file":"plan-activity.js","sourceRoot":"","sources":["../../src/tags/plan-activity.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE/H;;;;;;;;;;;;;;GAcG;AAEH,MAAM,0BAA0B,GAAG;;;;;;;;CAQlC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,wBAAwB,CAAC;IACpD,UAAU,EAAE;QACX,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,yCAAyC,EAAE;KAC7G;IACD,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;IAC9C,SAAS,CAAC,SAAS,EAAE,KAAK;QACzB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,OAAe,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACnG,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,0BAA0B,CAAC;QACzE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAEhC,MAAM,KAAK,GAAG;YACb,IAAI,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;YAC3D,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC;YACpC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC;YAClC,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC;YAC5C,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC;YACjC,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC;SACnC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAEjE,OAAO,yBAAyB,CAAC;YAChC,IAAI,EAAE,YAAY;YAClB,GAAG,EAAE,SAAS;YACd,UAAU,EAAE,EAAE;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;YAC5B,QAAQ,EAAE,CAAC,GAAG,KAAK,EAAE,WAAW,CAAC;SACjC,CAAC,CAAC;IACJ,CAAC;CACD,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refrakt-md/plan",
|
|
3
3
|
"description": "Planning runes for refrakt.md — specs, work items, bugs, decisions, and milestones",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.16.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -61,13 +61,13 @@
|
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@markdoc/markdoc": "0.4.0",
|
|
64
|
-
"@refrakt-md/behaviors": "0.
|
|
65
|
-
"@refrakt-md/content": "0.
|
|
66
|
-
"@refrakt-md/highlight": "0.
|
|
67
|
-
"@refrakt-md/html": "0.
|
|
68
|
-
"@refrakt-md/runes": "0.
|
|
69
|
-
"@refrakt-md/transform": "0.
|
|
70
|
-
"@refrakt-md/types": "0.
|
|
64
|
+
"@refrakt-md/behaviors": "0.16.1",
|
|
65
|
+
"@refrakt-md/content": "0.16.1",
|
|
66
|
+
"@refrakt-md/highlight": "0.16.1",
|
|
67
|
+
"@refrakt-md/html": "0.16.1",
|
|
68
|
+
"@refrakt-md/runes": "0.16.1",
|
|
69
|
+
"@refrakt-md/transform": "0.16.1",
|
|
70
|
+
"@refrakt-md/types": "0.16.1",
|
|
71
71
|
"reflect-metadata": "^0.2.0"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
package/dist/cards.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import Markdoc from '@markdoc/markdoc';
|
|
2
|
-
import type { EntityRegistration } from '@refrakt-md/types';
|
|
3
|
-
declare const Tag: typeof Markdoc.Tag;
|
|
4
|
-
export declare const WORK_STATUS_SENTIMENT: Record<string, string>;
|
|
5
|
-
export declare const BUG_STATUS_SENTIMENT: Record<string, string>;
|
|
6
|
-
export declare const PRIORITY_SENTIMENT: Record<string, string>;
|
|
7
|
-
export declare const SEVERITY_SENTIMENT: Record<string, string>;
|
|
8
|
-
export declare const SPEC_STATUS_SENTIMENT: Record<string, string>;
|
|
9
|
-
export declare const DECISION_STATUS_SENTIMENT: Record<string, string>;
|
|
10
|
-
export declare const MILESTONE_STATUS_SENTIMENT: Record<string, string>;
|
|
11
|
-
/** Build a metadata badge matching the dimension system output */
|
|
12
|
-
export declare function buildMetaBadge(label: string, value: string, opts: {
|
|
13
|
-
metaType: string;
|
|
14
|
-
metaRank: string;
|
|
15
|
-
sentiment?: string;
|
|
16
|
-
labelHidden?: boolean;
|
|
17
|
-
}): InstanceType<typeof Tag>;
|
|
18
|
-
/** Build a compact summary card Tag for any plan entity */
|
|
19
|
-
export declare function buildEntityCard(entity: EntityRegistration): InstanceType<typeof Tag>;
|
|
20
|
-
/** Build a decision log entry Tag */
|
|
21
|
-
export declare function buildDecisionEntry(entity: EntityRegistration): InstanceType<typeof Tag>;
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=cards.d.ts.map
|
package/dist/cards.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../src/cards.ts"],"names":[],"mappings":"AAIA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,QAAA,MAAQ,GAAG,oBAAY,CAAC;AAIxB,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGxD,CAAC;AACF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGvD,CAAC;AACF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAErD,CAAC;AACF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAErD,CAAC;AACF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAExD,CAAC;AACF,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE5D,CAAC;AACF,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE7D,CAAC;AAEF,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;IAClE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAC9E,GAAG,YAAY,CAAC,OAAO,GAAG,CAAC,CAW3B;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAAC,OAAO,GAAG,CAAC,CA8EpF;AAED,qCAAqC;AACrC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAAC,OAAO,GAAG,CAAC,CAyBvF"}
|
package/dist/cards.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
// ─── Entity Card Builders ───
|
|
2
|
-
// Construct summary card and entry Tag renderables for plan entities.
|
|
3
|
-
// No Node.js API dependencies — safe for edge runtimes.
|
|
4
|
-
import Markdoc from '@markdoc/markdoc';
|
|
5
|
-
const { Tag } = Markdoc;
|
|
6
|
-
// ─── Sentiment maps (matching rune configs in config.ts) ───
|
|
7
|
-
export const WORK_STATUS_SENTIMENT = {
|
|
8
|
-
draft: 'neutral', ready: 'neutral', 'in-progress': 'neutral',
|
|
9
|
-
review: 'caution', done: 'positive', blocked: 'negative',
|
|
10
|
-
};
|
|
11
|
-
export const BUG_STATUS_SENTIMENT = {
|
|
12
|
-
reported: 'neutral', confirmed: 'caution', 'in-progress': 'neutral',
|
|
13
|
-
fixed: 'positive', wontfix: 'neutral', duplicate: 'neutral',
|
|
14
|
-
};
|
|
15
|
-
export const PRIORITY_SENTIMENT = {
|
|
16
|
-
critical: 'negative', high: 'caution', medium: 'neutral', low: 'neutral',
|
|
17
|
-
};
|
|
18
|
-
export const SEVERITY_SENTIMENT = {
|
|
19
|
-
critical: 'negative', major: 'caution', minor: 'neutral', trivial: 'neutral',
|
|
20
|
-
};
|
|
21
|
-
export const SPEC_STATUS_SENTIMENT = {
|
|
22
|
-
draft: 'neutral', review: 'caution', accepted: 'positive', superseded: 'caution', deprecated: 'negative',
|
|
23
|
-
};
|
|
24
|
-
export const DECISION_STATUS_SENTIMENT = {
|
|
25
|
-
proposed: 'neutral', accepted: 'positive', superseded: 'caution', deprecated: 'negative',
|
|
26
|
-
};
|
|
27
|
-
export const MILESTONE_STATUS_SENTIMENT = {
|
|
28
|
-
planning: 'neutral', active: 'positive', complete: 'positive',
|
|
29
|
-
};
|
|
30
|
-
/** Build a metadata badge matching the dimension system output */
|
|
31
|
-
export function buildMetaBadge(label, value, opts) {
|
|
32
|
-
const labelAttrs = { 'data-meta-label': '' };
|
|
33
|
-
if (opts.labelHidden)
|
|
34
|
-
labelAttrs['data-meta-label-hidden'] = '';
|
|
35
|
-
const labelEl = new Tag('span', labelAttrs, [label]);
|
|
36
|
-
const valueEl = new Tag('span', { 'data-meta-value': '' }, [value]);
|
|
37
|
-
const attrs = {
|
|
38
|
-
'data-meta-type': opts.metaType,
|
|
39
|
-
'data-meta-rank': opts.metaRank,
|
|
40
|
-
};
|
|
41
|
-
if (opts.sentiment)
|
|
42
|
-
attrs['data-meta-sentiment'] = opts.sentiment;
|
|
43
|
-
return new Tag('span', attrs, [labelEl, valueEl]);
|
|
44
|
-
}
|
|
45
|
-
/** Build a compact summary card Tag for any plan entity */
|
|
46
|
-
export function buildEntityCard(entity) {
|
|
47
|
-
const type = entity.type;
|
|
48
|
-
const id = String(type === 'milestone' ? (entity.data.name ?? entity.id) : (entity.data.id ?? entity.id));
|
|
49
|
-
const title = String(entity.data.title ?? '');
|
|
50
|
-
const status = String(entity.data.status ?? '');
|
|
51
|
-
// Header: ID on the left, status + progress on the right
|
|
52
|
-
const headerLeft = [
|
|
53
|
-
buildMetaBadge('ID:', id, { metaType: 'id', metaRank: 'primary', labelHidden: true }),
|
|
54
|
-
];
|
|
55
|
-
const headerRight = [];
|
|
56
|
-
const statusSentiment = type === 'work' ? WORK_STATUS_SENTIMENT[status]
|
|
57
|
-
: type === 'bug' ? BUG_STATUS_SENTIMENT[status]
|
|
58
|
-
: type === 'spec' ? SPEC_STATUS_SENTIMENT[status]
|
|
59
|
-
: type === 'decision' ? DECISION_STATUS_SENTIMENT[status]
|
|
60
|
-
: type === 'milestone' ? MILESTONE_STATUS_SENTIMENT[status]
|
|
61
|
-
: undefined;
|
|
62
|
-
headerRight.push(buildMetaBadge('Status:', status, { metaType: 'status', metaRank: 'primary', sentiment: statusSentiment, labelHidden: true }));
|
|
63
|
-
// Progress in header (no circle indicator)
|
|
64
|
-
const checkedCount = Number(entity.data.checkedCount ?? 0);
|
|
65
|
-
const totalCount = Number(entity.data.totalCount ?? 0);
|
|
66
|
-
if (totalCount > 0) {
|
|
67
|
-
headerRight.push(new Tag('span', {
|
|
68
|
-
class: 'rf-backlog__card-progress',
|
|
69
|
-
'data-checked': String(checkedCount),
|
|
70
|
-
'data-total': String(totalCount),
|
|
71
|
-
}, [`${checkedCount}/${totalCount}`]));
|
|
72
|
-
}
|
|
73
|
-
const header = new Tag('div', { 'data-section': 'header' }, [
|
|
74
|
-
new Tag('span', { class: 'rf-backlog__card-header-left' }, headerLeft),
|
|
75
|
-
new Tag('span', { class: 'rf-backlog__card-header-right' }, headerRight),
|
|
76
|
-
]);
|
|
77
|
-
// Body: title
|
|
78
|
-
const titleEl = new Tag('div', { 'data-section': 'title' }, [title]);
|
|
79
|
-
// Footer: secondary metadata pills
|
|
80
|
-
const footerBadges = [];
|
|
81
|
-
if (type === 'work') {
|
|
82
|
-
const priority = String(entity.data.priority ?? '');
|
|
83
|
-
const complexity = String(entity.data.complexity ?? '');
|
|
84
|
-
if (priority)
|
|
85
|
-
footerBadges.push(buildMetaBadge('Priority:', priority, { metaType: 'category', metaRank: 'secondary', sentiment: PRIORITY_SENTIMENT[priority] }));
|
|
86
|
-
if (complexity && complexity !== 'unknown')
|
|
87
|
-
footerBadges.push(buildMetaBadge('Complexity:', complexity, { metaType: 'quantity', metaRank: 'secondary' }));
|
|
88
|
-
}
|
|
89
|
-
else if (type === 'bug') {
|
|
90
|
-
const severity = String(entity.data.severity ?? '');
|
|
91
|
-
if (severity)
|
|
92
|
-
footerBadges.push(buildMetaBadge('Severity:', severity, { metaType: 'category', metaRank: 'secondary', sentiment: SEVERITY_SENTIMENT[severity] }));
|
|
93
|
-
}
|
|
94
|
-
else if (type === 'spec') {
|
|
95
|
-
const version = String(entity.data.version ?? '');
|
|
96
|
-
if (version)
|
|
97
|
-
footerBadges.push(buildMetaBadge('Version:', version, { metaType: 'quantity', metaRank: 'secondary' }));
|
|
98
|
-
}
|
|
99
|
-
else if (type === 'decision') {
|
|
100
|
-
const date = String(entity.data.date ?? '');
|
|
101
|
-
if (date)
|
|
102
|
-
footerBadges.push(buildMetaBadge('Date:', date, { metaType: 'temporal', metaRank: 'secondary' }));
|
|
103
|
-
}
|
|
104
|
-
else if (type === 'milestone') {
|
|
105
|
-
const target = String(entity.data.target ?? '');
|
|
106
|
-
if (target)
|
|
107
|
-
footerBadges.push(buildMetaBadge('Target:', target, { metaType: 'temporal', metaRank: 'secondary' }));
|
|
108
|
-
}
|
|
109
|
-
const milestone = String(entity.data.milestone ?? '');
|
|
110
|
-
if (milestone)
|
|
111
|
-
footerBadges.push(buildMetaBadge('Milestone:', milestone, { metaType: 'tag', metaRank: 'secondary', labelHidden: true }));
|
|
112
|
-
const sections = [header, titleEl];
|
|
113
|
-
if (footerBadges.length > 0) {
|
|
114
|
-
sections.push(new Tag('div', { 'data-section': 'footer' }, footerBadges));
|
|
115
|
-
}
|
|
116
|
-
const children = entity.sourceUrl
|
|
117
|
-
? [new Tag('a', { class: 'rf-backlog__card-link', href: entity.sourceUrl }, sections)]
|
|
118
|
-
: sections;
|
|
119
|
-
return new Tag('article', {
|
|
120
|
-
class: 'rf-backlog__card',
|
|
121
|
-
'data-type': type,
|
|
122
|
-
'data-status': status,
|
|
123
|
-
'data-id': id,
|
|
124
|
-
}, children);
|
|
125
|
-
}
|
|
126
|
-
/** Build a decision log entry Tag */
|
|
127
|
-
export function buildDecisionEntry(entity) {
|
|
128
|
-
const id = String(entity.data.id ?? entity.id);
|
|
129
|
-
const title = String(entity.data.title ?? '');
|
|
130
|
-
const status = String(entity.data.status ?? '');
|
|
131
|
-
const date = String(entity.data.date ?? '');
|
|
132
|
-
const badges = [
|
|
133
|
-
buildMetaBadge('ID:', id, { metaType: 'id', metaRank: 'primary', labelHidden: true }),
|
|
134
|
-
buildMetaBadge('Status:', status, { metaType: 'status', metaRank: 'primary', sentiment: DECISION_STATUS_SENTIMENT[status], labelHidden: true }),
|
|
135
|
-
];
|
|
136
|
-
if (date)
|
|
137
|
-
badges.push(buildMetaBadge('Date:', date, { metaType: 'temporal', metaRank: 'secondary' }));
|
|
138
|
-
const header = new Tag('div', { 'data-section': 'header' }, badges);
|
|
139
|
-
const titleEl = new Tag('div', { 'data-section': 'title' }, [title]);
|
|
140
|
-
const innerChildren = [header, titleEl];
|
|
141
|
-
const children = entity.sourceUrl
|
|
142
|
-
? [new Tag('a', { class: 'rf-decision-log__link', href: entity.sourceUrl }, innerChildren)]
|
|
143
|
-
: innerChildren;
|
|
144
|
-
return new Tag('li', {
|
|
145
|
-
class: 'rf-decision-log__entry',
|
|
146
|
-
'data-status': status,
|
|
147
|
-
'data-id': id,
|
|
148
|
-
}, children);
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=cards.js.map
|
package/dist/cards.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cards.js","sourceRoot":"","sources":["../src/cards.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { CleanupFn } from '@refrakt-md/behaviors';
|
|
2
|
-
/**
|
|
3
|
-
* Composite behavior for plan entity tab groups.
|
|
4
|
-
*
|
|
5
|
-
* Wraps tabsBehavior (ARIA wiring, keyboard nav, panel switching) and adds:
|
|
6
|
-
* - Anchor navigation coordination: when the user clicks a TOC link or
|
|
7
|
-
* section-nav entry pointing to a heading inside an inactive panel,
|
|
8
|
-
* activates that panel first so the browser can scroll to the target.
|
|
9
|
-
* - Exposes the active tab name as a data attribute on the container
|
|
10
|
-
* so CSS can dim the TOC when a non-Overview tab is active.
|
|
11
|
-
*/
|
|
12
|
-
export declare function entityTabsBehavior(el: HTMLElement): CleanupFn;
|
|
13
|
-
//# sourceMappingURL=entity-tabs-behavior.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity-tabs-behavior.d.ts","sourceRoot":"","sources":["../src/entity-tabs-behavior.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,WAAW,GAAG,SAAS,CAyF7D"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { tabsBehavior } from '@refrakt-md/behaviors';
|
|
2
|
-
/**
|
|
3
|
-
* Composite behavior for plan entity tab groups.
|
|
4
|
-
*
|
|
5
|
-
* Wraps tabsBehavior (ARIA wiring, keyboard nav, panel switching) and adds:
|
|
6
|
-
* - Anchor navigation coordination: when the user clicks a TOC link or
|
|
7
|
-
* section-nav entry pointing to a heading inside an inactive panel,
|
|
8
|
-
* activates that panel first so the browser can scroll to the target.
|
|
9
|
-
* - Exposes the active tab name as a data attribute on the container
|
|
10
|
-
* so CSS can dim the TOC when a non-Overview tab is active.
|
|
11
|
-
*/
|
|
12
|
-
export function entityTabsBehavior(el) {
|
|
13
|
-
const tabsCleanup = tabsBehavior(el);
|
|
14
|
-
const cleanups = [];
|
|
15
|
-
const tabBar = el.querySelector('[data-name="tabs"]');
|
|
16
|
-
const panelsContainer = el.querySelector('[data-name="panels"]');
|
|
17
|
-
if (!tabBar || !panelsContainer)
|
|
18
|
-
return tabsCleanup;
|
|
19
|
-
const buttons = Array.from(tabBar.querySelectorAll('button[role="tab"]'));
|
|
20
|
-
const panels = Array.from(panelsContainer.querySelectorAll('[role="tabpanel"]'));
|
|
21
|
-
// Set initial active-tab data attribute
|
|
22
|
-
el.setAttribute('data-active-tab', buttons[0]?.getAttribute('data-tab') ?? 'overview');
|
|
23
|
-
// Watch for tab changes to update the data-active-tab attribute
|
|
24
|
-
const observer = new MutationObserver(() => {
|
|
25
|
-
const activeButton = buttons.find(b => b.getAttribute('aria-selected') === 'true');
|
|
26
|
-
if (activeButton) {
|
|
27
|
-
el.setAttribute('data-active-tab', activeButton.getAttribute('data-tab') ?? '');
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
for (const btn of buttons) {
|
|
31
|
-
observer.observe(btn, { attributes: true, attributeFilter: ['aria-selected'] });
|
|
32
|
-
}
|
|
33
|
-
cleanups.push(() => observer.disconnect());
|
|
34
|
-
/**
|
|
35
|
-
* Given a target element ID, find which panel contains it and activate that panel.
|
|
36
|
-
* Returns true if a panel switch occurred.
|
|
37
|
-
*/
|
|
38
|
-
function activatePanelForTarget(targetId) {
|
|
39
|
-
const target = document.getElementById(targetId);
|
|
40
|
-
if (!target)
|
|
41
|
-
return false;
|
|
42
|
-
// Find which panel contains this target
|
|
43
|
-
const containingPanel = panels.find(p => p.contains(target));
|
|
44
|
-
if (!containingPanel)
|
|
45
|
-
return false;
|
|
46
|
-
// If already active, no switch needed
|
|
47
|
-
if (containingPanel.getAttribute('data-state') === 'active')
|
|
48
|
-
return false;
|
|
49
|
-
// Find the button index for this panel and click it
|
|
50
|
-
const panelIndex = panels.indexOf(containingPanel);
|
|
51
|
-
if (panelIndex >= 0 && buttons[panelIndex]) {
|
|
52
|
-
buttons[panelIndex].click();
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
// Intercept anchor clicks from TOC and section-nav
|
|
58
|
-
const onAnchorClick = (e) => {
|
|
59
|
-
const link = e.target.closest('a[href^="#"]');
|
|
60
|
-
if (!link)
|
|
61
|
-
return;
|
|
62
|
-
const targetId = link.getAttribute('href')?.slice(1);
|
|
63
|
-
if (!targetId)
|
|
64
|
-
return;
|
|
65
|
-
// Only intercept if the target is inside our tab panels
|
|
66
|
-
const target = document.getElementById(targetId);
|
|
67
|
-
if (!target || !panelsContainer.contains(target))
|
|
68
|
-
return;
|
|
69
|
-
if (activatePanelForTarget(targetId)) {
|
|
70
|
-
// Panel was switched — re-scroll after the panel becomes visible
|
|
71
|
-
e.preventDefault();
|
|
72
|
-
requestAnimationFrame(() => {
|
|
73
|
-
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
document.addEventListener('click', onAnchorClick);
|
|
78
|
-
cleanups.push(() => document.removeEventListener('click', onAnchorClick));
|
|
79
|
-
// Handle back/forward navigation with hash changes
|
|
80
|
-
const onHashChange = () => {
|
|
81
|
-
const hash = window.location.hash.slice(1);
|
|
82
|
-
if (hash) {
|
|
83
|
-
activatePanelForTarget(hash);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
window.addEventListener('hashchange', onHashChange);
|
|
87
|
-
cleanups.push(() => window.removeEventListener('hashchange', onHashChange));
|
|
88
|
-
return () => {
|
|
89
|
-
tabsCleanup();
|
|
90
|
-
el.removeAttribute('data-active-tab');
|
|
91
|
-
cleanups.forEach(fn => fn());
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=entity-tabs-behavior.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity-tabs-behavior.js","sourceRoot":"","sources":["../src/entity-tabs-behavior.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAe;IACjD,MAAM,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAErC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,EAAE,CAAC,aAAa,CAAc,oBAAoB,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,EAAE,CAAC,aAAa,CAAc,sBAAsB,CAAC,CAAC;IAC9E,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe;QAAE,OAAO,WAAW,CAAC;IAEpD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAoB,oBAAoB,CAAC,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAc,mBAAmB,CAAC,CAAC,CAAC;IAE9F,wCAAwC;IACxC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,CAAC;IAEvF,gEAAgE;IAChE,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC,CAAC;QACnF,IAAI,YAAY,EAAE,CAAC;YAClB,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;IACF,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAE3C;;;OAGG;IACH,SAAS,sBAAsB,CAAC,QAAgB;QAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,wCAAwC;QACxC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,eAAe;YAAE,OAAO,KAAK,CAAC;QAEnC,sCAAsC;QACtC,IAAI,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE1E,oDAAoD;QACpD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACnD,IAAI,UAAU,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,mDAAmD;IACnD,MAAM,aAAa,GAAG,CAAC,CAAa,EAAE,EAAE;QACvC,MAAM,IAAI,GAAI,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,QAAQ,GAAI,IAA0B,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,wDAAwD;QACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO;QAEzD,IAAI,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,iEAAiE;YACjE,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,qBAAqB,CAAC,GAAG,EAAE;gBAC1B,MAAM,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC;IACF,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAClD,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAE1E,mDAAmD;IACnD,MAAM,YAAY,GAAG,GAAG,EAAE;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,IAAI,EAAE,CAAC;YACV,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC,CAAC;IACF,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACpD,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAE5E,OAAO,GAAG,EAAE;QACX,WAAW,EAAE,CAAC;QACd,EAAE,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;QACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC;AACH,CAAC"}
|