@refrakt-md/plan 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dist/cli-plugin.d.ts +12 -0
  2. package/dist/cli-plugin.d.ts.map +1 -0
  3. package/dist/cli-plugin.js +494 -0
  4. package/dist/cli-plugin.js.map +1 -0
  5. package/dist/commands/build.d.ts +14 -0
  6. package/dist/commands/build.d.ts.map +1 -0
  7. package/dist/commands/build.js +57 -0
  8. package/dist/commands/build.js.map +1 -0
  9. package/dist/commands/bundle-behaviors.d.ts +6 -0
  10. package/dist/commands/bundle-behaviors.d.ts.map +1 -0
  11. package/dist/commands/bundle-behaviors.js +24 -0
  12. package/dist/commands/bundle-behaviors.js.map +1 -0
  13. package/dist/commands/create.d.ts +21 -0
  14. package/dist/commands/create.d.ts.map +1 -0
  15. package/dist/commands/create.js +50 -0
  16. package/dist/commands/create.js.map +1 -0
  17. package/dist/commands/init.d.ts +17 -0
  18. package/dist/commands/init.d.ts.map +1 -0
  19. package/dist/commands/init.js +109 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/next.d.ts +34 -0
  22. package/dist/commands/next.d.ts.map +1 -0
  23. package/dist/commands/next.js +100 -0
  24. package/dist/commands/next.js.map +1 -0
  25. package/dist/commands/plan-behaviors.d.ts +2 -0
  26. package/dist/commands/plan-behaviors.d.ts.map +1 -0
  27. package/dist/commands/plan-behaviors.js +7 -0
  28. package/dist/commands/plan-behaviors.js.map +1 -0
  29. package/dist/commands/render-pipeline.d.ts +70 -0
  30. package/dist/commands/render-pipeline.d.ts.map +1 -0
  31. package/dist/commands/render-pipeline.js +1173 -0
  32. package/dist/commands/render-pipeline.js.map +1 -0
  33. package/dist/commands/serve.d.ts +13 -0
  34. package/dist/commands/serve.d.ts.map +1 -0
  35. package/dist/commands/serve.js +167 -0
  36. package/dist/commands/serve.js.map +1 -0
  37. package/dist/commands/status.d.ts +53 -0
  38. package/dist/commands/status.d.ts.map +1 -0
  39. package/dist/commands/status.js +181 -0
  40. package/dist/commands/status.js.map +1 -0
  41. package/dist/commands/templates.d.ts +37 -0
  42. package/dist/commands/templates.d.ts.map +1 -0
  43. package/dist/commands/templates.js +160 -0
  44. package/dist/commands/templates.js.map +1 -0
  45. package/dist/commands/update.d.ts +29 -0
  46. package/dist/commands/update.d.ts.map +1 -0
  47. package/dist/commands/update.js +238 -0
  48. package/dist/commands/update.js.map +1 -0
  49. package/dist/commands/validate.d.ts +29 -0
  50. package/dist/commands/validate.d.ts.map +1 -0
  51. package/dist/commands/validate.js +298 -0
  52. package/dist/commands/validate.js.map +1 -0
  53. package/dist/config.d.ts +3 -0
  54. package/dist/config.d.ts.map +1 -0
  55. package/dist/config.js +163 -0
  56. package/dist/config.js.map +1 -0
  57. package/dist/filter.d.ts +17 -0
  58. package/dist/filter.d.ts.map +1 -0
  59. package/dist/filter.js +72 -0
  60. package/dist/filter.js.map +1 -0
  61. package/dist/index.d.ts +7 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +144 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/pipeline.d.ts +23 -0
  66. package/dist/pipeline.d.ts.map +1 -0
  67. package/dist/pipeline.js +720 -0
  68. package/dist/pipeline.js.map +1 -0
  69. package/dist/scanner.d.ts +9 -0
  70. package/dist/scanner.d.ts.map +1 -0
  71. package/dist/scanner.js +234 -0
  72. package/dist/scanner.js.map +1 -0
  73. package/dist/schema/backlog.d.ts +7 -0
  74. package/dist/schema/backlog.d.ts.map +1 -0
  75. package/dist/schema/backlog.js +9 -0
  76. package/dist/schema/backlog.js.map +1 -0
  77. package/dist/schema/bug.d.ts +9 -0
  78. package/dist/schema/bug.d.ts.map +1 -0
  79. package/dist/schema/bug.js +11 -0
  80. package/dist/schema/bug.js.map +1 -0
  81. package/dist/schema/decision-log.d.ts +5 -0
  82. package/dist/schema/decision-log.d.ts.map +1 -0
  83. package/dist/schema/decision-log.js +7 -0
  84. package/dist/schema/decision-log.js.map +1 -0
  85. package/dist/schema/decision.d.ts +8 -0
  86. package/dist/schema/decision.d.ts.map +1 -0
  87. package/dist/schema/decision.js +10 -0
  88. package/dist/schema/decision.js.map +1 -0
  89. package/dist/schema/milestone.d.ts +6 -0
  90. package/dist/schema/milestone.d.ts.map +1 -0
  91. package/dist/schema/milestone.js +8 -0
  92. package/dist/schema/milestone.js.map +1 -0
  93. package/dist/schema/plan-activity.d.ts +4 -0
  94. package/dist/schema/plan-activity.d.ts.map +1 -0
  95. package/dist/schema/plan-activity.js +6 -0
  96. package/dist/schema/plan-activity.js.map +1 -0
  97. package/dist/schema/plan-progress.d.ts +4 -0
  98. package/dist/schema/plan-progress.d.ts.map +1 -0
  99. package/dist/schema/plan-progress.js +6 -0
  100. package/dist/schema/plan-progress.js.map +1 -0
  101. package/dist/schema/spec.d.ts +8 -0
  102. package/dist/schema/spec.d.ts.map +1 -0
  103. package/dist/schema/spec.js +10 -0
  104. package/dist/schema/spec.js.map +1 -0
  105. package/dist/schema/work.d.ts +10 -0
  106. package/dist/schema/work.d.ts.map +1 -0
  107. package/dist/schema/work.js +12 -0
  108. package/dist/schema/work.js.map +1 -0
  109. package/dist/tags/backlog.d.ts +4 -0
  110. package/dist/tags/backlog.d.ts.map +1 -0
  111. package/dist/tags/backlog.js +41 -0
  112. package/dist/tags/backlog.js.map +1 -0
  113. package/dist/tags/bug.d.ts +3 -0
  114. package/dist/tags/bug.d.ts.map +1 -0
  115. package/dist/tags/bug.js +58 -0
  116. package/dist/tags/bug.js.map +1 -0
  117. package/dist/tags/decision-log.d.ts +4 -0
  118. package/dist/tags/decision-log.d.ts.map +1 -0
  119. package/dist/tags/decision-log.js +35 -0
  120. package/dist/tags/decision-log.js.map +1 -0
  121. package/dist/tags/decision.d.ts +3 -0
  122. package/dist/tags/decision.d.ts.map +1 -0
  123. package/dist/tags/decision.js +54 -0
  124. package/dist/tags/decision.js.map +1 -0
  125. package/dist/tags/milestone.d.ts +3 -0
  126. package/dist/tags/milestone.d.ts.map +1 -0
  127. package/dist/tags/milestone.js +52 -0
  128. package/dist/tags/milestone.js.map +1 -0
  129. package/dist/tags/plan-activity.d.ts +4 -0
  130. package/dist/tags/plan-activity.d.ts.map +1 -0
  131. package/dist/tags/plan-activity.js +31 -0
  132. package/dist/tags/plan-activity.js.map +1 -0
  133. package/dist/tags/plan-progress.d.ts +4 -0
  134. package/dist/tags/plan-progress.d.ts.map +1 -0
  135. package/dist/tags/plan-progress.js +31 -0
  136. package/dist/tags/plan-progress.js.map +1 -0
  137. package/dist/tags/spec.d.ts +3 -0
  138. package/dist/tags/spec.d.ts.map +1 -0
  139. package/dist/tags/spec.js +57 -0
  140. package/dist/tags/spec.js.map +1 -0
  141. package/dist/tags/work.d.ts +3 -0
  142. package/dist/tags/work.d.ts.map +1 -0
  143. package/dist/tags/work.js +68 -0
  144. package/dist/tags/work.js.map +1 -0
  145. package/dist/types.d.ts +69 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +22 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/util.d.ts +8 -0
  150. package/dist/util.d.ts.map +1 -0
  151. package/dist/util.js +32 -0
  152. package/dist/util.js.map +1 -0
  153. package/package.json +47 -0
  154. package/styles/default.css +580 -0
  155. package/styles/minimal.css +379 -0
  156. package/styles/tokens.css +13 -0
package/dist/types.js ADDED
@@ -0,0 +1,22 @@
1
+ import { useSchema } from '@refrakt-md/types';
2
+ import { Spec } from './schema/spec.js';
3
+ import { Work } from './schema/work.js';
4
+ import { Bug } from './schema/bug.js';
5
+ import { Decision } from './schema/decision.js';
6
+ import { Milestone } from './schema/milestone.js';
7
+ import { Backlog } from './schema/backlog.js';
8
+ import { DecisionLog } from './schema/decision-log.js';
9
+ import { PlanProgress } from './schema/plan-progress.js';
10
+ import { PlanActivity } from './schema/plan-activity.js';
11
+ export const schema = {
12
+ Spec: useSchema(Spec).defineType('Spec'),
13
+ Work: useSchema(Work).defineType('Work'),
14
+ Bug: useSchema(Bug).defineType('Bug'),
15
+ Decision: useSchema(Decision).defineType('Decision'),
16
+ Milestone: useSchema(Milestone).defineType('Milestone'),
17
+ Backlog: useSchema(Backlog).defineType('Backlog'),
18
+ DecisionLog: useSchema(DecisionLog).defineType('DecisionLog'),
19
+ PlanProgress: useSchema(PlanProgress).defineType('PlanProgress'),
20
+ PlanActivity: useSchema(PlanActivity).defineType('PlanActivity'),
21
+ };
22
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;IACrC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACpD,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;IACvD,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;IACjD,WAAW,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC;IAC7D,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC;IAChE,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC;CAChE,CAAC"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /** Convert heading text to a kebab-case data-name slug. */
2
+ export declare function slugify(text: string): string;
3
+ /**
4
+ * Build section wrapper elements from resolved sections.
5
+ * Each section becomes a `<section>` with `data-name` set to the slugified heading text.
6
+ */
7
+ export declare function buildSections(sections: any[], config: any): any[];
8
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAKA,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,CAmBjE"}
package/dist/util.js ADDED
@@ -0,0 +1,32 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ const { Tag } = Markdoc;
3
+ import { asNodes } from '@refrakt-md/runes';
4
+ /** Convert heading text to a kebab-case data-name slug. */
5
+ export function slugify(text) {
6
+ return text
7
+ .toLowerCase()
8
+ .replace(/[^a-z0-9]+/g, '-')
9
+ .replace(/^-|-$/g, '');
10
+ }
11
+ /**
12
+ * Build section wrapper elements from resolved sections.
13
+ * Each section becomes a `<section>` with `data-name` set to the slugified heading text.
14
+ */
15
+ export function buildSections(sections, config) {
16
+ if (!sections || sections.length === 0)
17
+ return [];
18
+ return sections.map((section) => {
19
+ const headingText = section.$heading;
20
+ const slug = slugify(headingText);
21
+ const headingNode = section.$headingNode;
22
+ const bodyContent = Markdoc.transform(asNodes(section.body), config);
23
+ const children = [];
24
+ if (headingNode) {
25
+ const renderedHeading = Markdoc.transform([headingNode], config);
26
+ children.push(...renderedHeading);
27
+ }
28
+ children.push(...bodyContent);
29
+ return new Tag('section', { 'data-name': slug }, children);
30
+ });
31
+ }
32
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,2DAA2D;AAC3D,MAAM,UAAU,OAAO,CAAC,IAAY;IACnC,OAAO,IAAI;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAe,EAAE,MAAW;IACzD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE;QACpC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAkB,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAElC,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAyB,CAAC;QAE7F,MAAM,QAAQ,GAAU,EAAE,CAAC;QAC3B,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,CAAyB,CAAC;YACzF,QAAQ,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QACnC,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;QAE9B,OAAO,IAAI,GAAG,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@refrakt-md/plan",
3
+ "description": "Planning runes for refrakt.md — specs, work items, bugs, decisions, and milestones",
4
+ "version": "0.9.0",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/refrakt-md/refrakt.git",
10
+ "directory": "runes/plan"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "main": "dist/index.js",
16
+ "types": "dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ },
22
+ "./cli-plugin": {
23
+ "types": "./dist/cli-plugin.d.ts",
24
+ "default": "./dist/cli-plugin.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "styles"
30
+ ],
31
+ "scripts": {
32
+ "build": "tsc"
33
+ },
34
+ "dependencies": {
35
+ "@markdoc/markdoc": "0.4.0",
36
+ "@refrakt-md/behaviors": "0.9.0",
37
+ "@refrakt-md/highlight": "0.9.0",
38
+ "@refrakt-md/html": "0.9.0",
39
+ "@refrakt-md/runes": "0.9.0",
40
+ "@refrakt-md/transform": "0.9.0",
41
+ "@refrakt-md/types": "0.9.0",
42
+ "reflect-metadata": "^0.2.0"
43
+ },
44
+ "devDependencies": {
45
+ "esbuild": "^0.27.4"
46
+ }
47
+ }
@@ -0,0 +1,580 @@
1
+ @import './tokens.css';
2
+
3
+ /* ==========================================================================
4
+ Plan CLI Shell Styles
5
+ Layout chrome for the plan CLI renderer (sidebar, dashboard, TOC,
6
+ cross-references, relationships). Rune styling (spec, work, bug, decision,
7
+ milestone, backlog, decision-log, plan-progress, plan-activity) is provided
8
+ by the active theme (Lumina by default).
9
+ ========================================================================== */
10
+
11
+ /* --------------------------------------------------------------------------
12
+ Dashboard grid layout
13
+ -------------------------------------------------------------------------- */
14
+
15
+ .rf-plan-dashboard {
16
+ display: grid;
17
+ grid-template-columns: repeat(auto-fill, minmax(24rem, 1fr));
18
+ gap: var(--rf-spacing-lg, 1.5rem);
19
+ padding: var(--rf-spacing-lg, 1.5rem);
20
+ }
21
+
22
+ .rf-plan-dashboard__section {
23
+ min-width: 0;
24
+ }
25
+
26
+ .rf-plan-dashboard__section-title {
27
+ font-size: 1.125rem;
28
+ font-weight: 600;
29
+ color: var(--rf-color-text, #212529);
30
+ margin-block-end: var(--rf-spacing-md, 1rem);
31
+ padding-block-end: var(--rf-spacing-sm, 0.5rem);
32
+ border-block-end: 2px solid var(--rf-color-border, #dee2e6);
33
+ }
34
+
35
+ /* --------------------------------------------------------------------------
36
+ Sidebar navigation
37
+ -------------------------------------------------------------------------- */
38
+
39
+ .rf-plan-sidebar {
40
+ position: fixed;
41
+ inset-block: 0;
42
+ inset-inline-start: 0;
43
+ width: var(--plan-sidebar-width);
44
+ background: var(--rf-color-bg, #fff);
45
+ border-inline-end: 1px solid var(--rf-color-border, #dee2e6);
46
+ padding: var(--rf-spacing-lg, 1.5rem) var(--rf-spacing-md, 1rem);
47
+ overflow-y: auto;
48
+ }
49
+
50
+ .rf-plan-sidebar__title {
51
+ font-size: 1.125rem;
52
+ font-weight: 700;
53
+ margin-block-end: var(--rf-spacing-lg, 1.5rem);
54
+ color: var(--rf-color-text, #212529);
55
+ }
56
+
57
+ /* Search / filter input */
58
+ .rf-plan-sidebar__search {
59
+ display: block;
60
+ width: 100%;
61
+ padding: 0.25rem 0.5rem;
62
+ margin-block-end: var(--rf-spacing-md, 1rem);
63
+ border: 1px solid var(--rf-color-border, #dee2e6);
64
+ border-radius: var(--rf-radius-sm, 0.25rem);
65
+ background: var(--rf-color-bg, #ffffff);
66
+ color: var(--rf-color-text, #212529);
67
+ font-size: 0.8125rem;
68
+ outline: none;
69
+ box-sizing: border-box;
70
+ }
71
+
72
+ .rf-plan-sidebar__search:focus {
73
+ border-color: var(--rf-color-info, #339af0);
74
+ box-shadow: 0 0 0 2px var(--rf-color-info-bg, #e7f5ff);
75
+ }
76
+
77
+ .rf-plan-sidebar__search::placeholder {
78
+ color: var(--rf-color-muted, #6c757d);
79
+ }
80
+
81
+ .rf-plan-sidebar__group {
82
+ margin-block-end: var(--rf-spacing-lg, 1.5rem);
83
+ }
84
+
85
+ .rf-plan-sidebar__group-title {
86
+ font-size: 0.8125rem;
87
+ font-weight: 600;
88
+ text-transform: uppercase;
89
+ letter-spacing: 0.05em;
90
+ color: var(--rf-color-muted, #6c757d);
91
+ margin-block-end: var(--rf-spacing-sm, 0.5rem);
92
+ }
93
+
94
+ /* Status sub-group */
95
+ .rf-plan-sidebar__status-group {
96
+ margin-block-end: 0.25rem;
97
+ }
98
+
99
+ .rf-plan-sidebar__status-header {
100
+ display: flex;
101
+ align-items: center;
102
+ justify-content: space-between;
103
+ width: 100%;
104
+ padding: 0.25rem 0.5rem;
105
+ border: none;
106
+ border-radius: var(--rf-radius-sm, 0.25rem);
107
+ background: transparent;
108
+ color: var(--rf-color-muted, #6c757d);
109
+ font-size: 0.8125rem;
110
+ cursor: pointer;
111
+ text-align: start;
112
+ transition: background 0.15s ease;
113
+ }
114
+
115
+ .rf-plan-sidebar__status-header:hover {
116
+ background: var(--rf-color-surface-active, #f1f3f5);
117
+ }
118
+
119
+ .rf-plan-sidebar__status-header::before {
120
+ content: '▸';
121
+ display: inline-block;
122
+ margin-inline-end: 0.25rem;
123
+ transition: transform 0.15s ease;
124
+ font-size: 0.75em;
125
+ }
126
+
127
+ .rf-plan-sidebar__status-header[aria-expanded="true"]::before {
128
+ transform: rotate(90deg);
129
+ }
130
+
131
+ .rf-plan-sidebar__status-label {
132
+ flex: 1;
133
+ font-weight: 500;
134
+ }
135
+
136
+ .rf-plan-sidebar__status-count {
137
+ font-size: 0.75rem;
138
+ font-weight: 600;
139
+ color: var(--rf-color-muted, #6c757d);
140
+ background: var(--rf-color-surface-active, #f1f3f5);
141
+ padding: 0 0.375rem;
142
+ border-radius: var(--rf-radius-full, 9999px);
143
+ min-width: 1.25rem;
144
+ text-align: center;
145
+ }
146
+
147
+ .rf-plan-sidebar__status-items {
148
+ padding-inline-start: var(--rf-spacing-sm, 0.5rem);
149
+ }
150
+
151
+ .rf-plan-sidebar__status-items[hidden] {
152
+ display: none;
153
+ }
154
+
155
+ .rf-plan-sidebar__link {
156
+ display: block;
157
+ padding: 0.25rem 0.5rem;
158
+ border-radius: var(--rf-radius-sm, 0.25rem);
159
+ color: var(--rf-color-text, #212529);
160
+ text-decoration: none;
161
+ font-size: 0.8125rem;
162
+ transition: background 0.15s ease;
163
+ }
164
+
165
+ .rf-plan-sidebar__link:hover {
166
+ background: var(--rf-color-surface-active, #f1f3f5);
167
+ }
168
+
169
+ .rf-plan-sidebar__link--active {
170
+ background: var(--rf-color-info-bg, #e7f5ff);
171
+ color: var(--rf-color-info, #339af0);
172
+ font-weight: 600;
173
+ }
174
+
175
+ .rf-plan-sidebar__link--focused {
176
+ outline: 2px solid var(--rf-color-info, #339af0);
177
+ outline-offset: -2px;
178
+ background: var(--rf-color-surface-active, #f1f3f5);
179
+ }
180
+
181
+ .rf-plan-sidebar__link--blocked {
182
+ border-left: 2px solid var(--rf-color-danger, #ff6b6b);
183
+ }
184
+
185
+ .rf-plan-sidebar__blocker-icon {
186
+ margin-left: auto;
187
+ font-size: 0.75rem;
188
+ color: var(--rf-color-danger, #ff6b6b);
189
+ flex-shrink: 0;
190
+ }
191
+
192
+ /* Views section in sidebar */
193
+ .rf-plan-sidebar__view-header {
194
+ font-size: 0.6875rem;
195
+ font-weight: 600;
196
+ text-transform: uppercase;
197
+ letter-spacing: 0.05em;
198
+ color: var(--rf-color-muted, #6c757d);
199
+ padding: 0.25rem 0.5rem;
200
+ margin-block-start: 0.25rem;
201
+ }
202
+
203
+ .rf-plan-sidebar__view-items {
204
+ padding-inline-start: 0.25rem;
205
+ }
206
+
207
+ .rf-plan-sidebar__link .rf-plan-sidebar__view-label {
208
+ flex: 1;
209
+ overflow: hidden;
210
+ text-overflow: ellipsis;
211
+ white-space: nowrap;
212
+ }
213
+
214
+ .rf-plan-sidebar__link .rf-plan-sidebar__view-count {
215
+ font-size: 0.6875rem;
216
+ font-weight: 600;
217
+ color: var(--rf-color-muted, #6c757d);
218
+ background: var(--rf-color-surface-active, #f1f3f5);
219
+ padding: 0 0.375rem;
220
+ border-radius: var(--rf-radius-full, 9999px);
221
+ min-width: 1.25rem;
222
+ text-align: center;
223
+ }
224
+
225
+ .rf-plan-sidebar__group[data-type="views"] .rf-plan-sidebar__link {
226
+ display: flex;
227
+ align-items: center;
228
+ gap: 0.25rem;
229
+ }
230
+
231
+ /* Main content offset when sidebar is present */
232
+ .rf-plan-main {
233
+ margin-inline-start: var(--plan-sidebar-width);
234
+ padding: var(--rf-spacing-xl, 2rem);
235
+ }
236
+
237
+ /* Inner wrapper: flex layout when TOC is present */
238
+ .rf-plan-main__inner--has-toc {
239
+ display: flex;
240
+ gap: var(--rf-spacing-xl, 2rem);
241
+ }
242
+ .rf-plan-main__inner--has-toc {
243
+ max-width: calc(60rem + 200px + 2rem);
244
+ margin: 0 auto;
245
+ }
246
+ .rf-plan-main__inner--has-toc .rf-plan-main__body {
247
+ flex: 1;
248
+ min-width: 0;
249
+ max-width: 60rem;
250
+ }
251
+
252
+ .rf-plan-main__body {
253
+ max-width: 60rem;
254
+ margin: 0 auto;
255
+ padding: 0 2.5rem;
256
+ }
257
+
258
+ /* --------------------------------------------------------------------------
259
+ "On this page" TOC aside
260
+ -------------------------------------------------------------------------- */
261
+
262
+ .rf-plan-toc {
263
+ width: 200px;
264
+ flex-shrink: 0;
265
+ position: sticky;
266
+ top: var(--rf-spacing-lg, 1.5rem);
267
+ align-self: flex-start;
268
+ max-height: calc(100vh - var(--rf-spacing-xl, 2rem) * 2);
269
+ overflow-y: auto;
270
+ }
271
+
272
+ .rf-on-this-page {
273
+ font-size: 0.8125rem;
274
+ }
275
+
276
+ .rf-on-this-page__title {
277
+ font-size: 0.7rem;
278
+ font-weight: 600;
279
+ text-transform: uppercase;
280
+ letter-spacing: 0.05em;
281
+ color: var(--rf-color-muted, #6c757d);
282
+ margin: 0 0 0.75rem;
283
+ }
284
+
285
+ .rf-on-this-page__list {
286
+ list-style: none;
287
+ margin: 0;
288
+ padding: 0;
289
+ }
290
+
291
+ .rf-on-this-page__item {
292
+ border-left: 2px solid transparent;
293
+ }
294
+
295
+ .rf-on-this-page__item[data-level="3"] {
296
+ padding-left: 0.75rem;
297
+ }
298
+
299
+ .rf-on-this-page__item a {
300
+ display: block;
301
+ padding: 0.25rem 0.75rem;
302
+ color: var(--rf-color-muted, #6c757d);
303
+ text-decoration: none;
304
+ line-height: 1.4;
305
+ }
306
+
307
+ .rf-on-this-page__item a:hover {
308
+ color: var(--rf-color-text, #212529);
309
+ }
310
+
311
+ .rf-on-this-page__item[data-active] {
312
+ border-left-color: var(--rf-color-info, #339af0);
313
+ }
314
+
315
+ .rf-on-this-page__item[data-active] a {
316
+ color: var(--rf-color-info, #339af0);
317
+ }
318
+
319
+ /* --------------------------------------------------------------------------
320
+ Cross-reference links
321
+ -------------------------------------------------------------------------- */
322
+
323
+ .rf-plan-ref {
324
+ font-family: var(--rf-font-mono, ui-monospace, monospace);
325
+ font-size: 0.8125rem;
326
+ color: var(--rf-color-info, #339af0);
327
+ text-decoration: none;
328
+ border-bottom: 1px dashed var(--rf-color-info, #339af0);
329
+ padding-inline: 0.25rem;
330
+ }
331
+
332
+ .rf-plan-ref:hover {
333
+ background: var(--rf-color-info-bg, #e7f5ff);
334
+ border-radius: var(--rf-radius-sm, 0.25rem);
335
+ border-bottom-color: transparent;
336
+ }
337
+
338
+ .rf-plan-ref::before {
339
+ margin-inline-end: 0.25rem;
340
+ }
341
+
342
+ .rf-plan-ref[data-type="spec"]::before { content: '📋'; }
343
+ .rf-plan-ref[data-type="work"]::before { content: '🔧'; }
344
+ .rf-plan-ref[data-type="bug"]::before { content: '🐛'; }
345
+ .rf-plan-ref[data-type="decision"]::before { content: '⚖️'; }
346
+ .rf-plan-ref[data-type="milestone"]::before { content: '🎯'; }
347
+
348
+ /* --------------------------------------------------------------------------
349
+ Relationships section
350
+ -------------------------------------------------------------------------- */
351
+
352
+ .rf-plan-relationships {
353
+ margin-top: 2rem;
354
+ padding-top: 1.5rem;
355
+ border-top: 1px solid var(--rf-color-border, #dee2e6);
356
+ }
357
+
358
+ .rf-plan-relationships__heading {
359
+ font-size: 1.125rem;
360
+ font-weight: 600;
361
+ color: var(--rf-color-text, #212529);
362
+ margin: 0 0 1rem;
363
+ }
364
+
365
+ .rf-plan-relationships__group {
366
+ margin-bottom: 1rem;
367
+ }
368
+
369
+ .rf-plan-relationships__group-title {
370
+ font-size: 0.8125rem;
371
+ font-weight: 600;
372
+ text-transform: uppercase;
373
+ letter-spacing: 0.04em;
374
+ color: var(--rf-color-muted, #6c757d);
375
+ margin: 0 0 0.375rem;
376
+ }
377
+
378
+ .rf-plan-relationships__group[data-kind="blocked-by"] .rf-plan-relationships__group-title {
379
+ color: var(--rf-color-danger, #ff6b6b);
380
+ }
381
+
382
+ .rf-plan-relationships__group[data-kind="blocks"] .rf-plan-relationships__group-title {
383
+ color: var(--rf-color-warning, #f59f00);
384
+ }
385
+
386
+ .rf-plan-relationships__list {
387
+ list-style: none;
388
+ margin: 0;
389
+ padding: 0;
390
+ display: flex;
391
+ flex-direction: column;
392
+ gap: 0.25rem;
393
+ }
394
+
395
+ .rf-plan-relationships__item {
396
+ display: flex;
397
+ align-items: center;
398
+ gap: 0.5rem;
399
+ padding: 0.375rem 0.5rem;
400
+ border-radius: var(--rf-radius-sm, 0.25rem);
401
+ background: var(--rf-color-surface-active, #f1f3f5);
402
+ font-size: 0.8125rem;
403
+ }
404
+
405
+ .rf-plan-relationships__id {
406
+ font-family: var(--rf-font-mono, ui-monospace, monospace);
407
+ font-size: 0.75rem;
408
+ font-weight: 600;
409
+ color: var(--rf-color-text, #212529);
410
+ }
411
+
412
+ .rf-plan-relationships__status {
413
+ font-size: 0.6875rem;
414
+ font-weight: 500;
415
+ padding: 0.0625rem 0.375rem;
416
+ border-radius: var(--rf-radius-sm, 0.25rem);
417
+ text-transform: lowercase;
418
+ }
419
+
420
+ .rf-plan-relationships__status[data-status="done"],
421
+ .rf-plan-relationships__status[data-status="fixed"],
422
+ .rf-plan-relationships__status[data-status="accepted"] {
423
+ color: var(--rf-color-success, #51cf66);
424
+ background: var(--rf-color-success-bg, #ebfbee);
425
+ }
426
+ .rf-plan-relationships__status[data-status="in-progress"],
427
+ .rf-plan-relationships__status[data-status="review"] {
428
+ color: var(--rf-color-warning, #f59f00);
429
+ background: var(--rf-color-warning-bg, #fff9db);
430
+ }
431
+ .rf-plan-relationships__status[data-status="ready"] {
432
+ color: var(--rf-color-info, #339af0);
433
+ background: var(--rf-color-info-bg, #e7f5ff);
434
+ }
435
+ .rf-plan-relationships__status[data-status="blocked"] {
436
+ color: var(--rf-color-danger, #ff6b6b);
437
+ background: var(--rf-color-danger-bg, #fff5f5);
438
+ }
439
+ .rf-plan-relationships__status[data-status="draft"] {
440
+ color: var(--rf-color-muted, #6c757d);
441
+ background: var(--rf-color-surface-active, #f1f3f5);
442
+ }
443
+
444
+ .rf-plan-relationships__type {
445
+ font-size: 0.6875rem;
446
+ color: var(--rf-color-muted, #6c757d);
447
+ }
448
+
449
+ .rf-plan-relationships__title {
450
+ color: var(--rf-color-text, #212529);
451
+ overflow: hidden;
452
+ text-overflow: ellipsis;
453
+ white-space: nowrap;
454
+ }
455
+ .rf-plan-relationships__link {
456
+ display: flex;
457
+ align-items: center;
458
+ gap: 0.5rem;
459
+ color: inherit;
460
+ text-decoration: none;
461
+ width: 100%;
462
+ }
463
+ .rf-plan-relationships__link:hover .rf-plan-relationships__title {
464
+ color: var(--rf-color-primary, #339af0);
465
+ }
466
+ .rf-plan-relationships__link:hover .rf-plan-relationships__id {
467
+ color: var(--rf-color-primary, #339af0);
468
+ }
469
+
470
+ /* --------------------------------------------------------------------------
471
+ Copy-to-clipboard button on code blocks
472
+ -------------------------------------------------------------------------- */
473
+
474
+ .rf-code-wrapper {
475
+ position: relative;
476
+ }
477
+
478
+ .rf-copy-btn {
479
+ position: absolute;
480
+ top: 0.25rem;
481
+ right: 0.25rem;
482
+ display: flex;
483
+ align-items: center;
484
+ justify-content: center;
485
+ width: 2rem;
486
+ height: 2rem;
487
+ padding: 0;
488
+ border: 1px solid var(--rf-color-border, #dee2e6);
489
+ border-radius: var(--rf-radius-sm, 0.25rem);
490
+ background: var(--rf-color-surface, #f8f9fa);
491
+ color: var(--rf-color-muted, #6c757d);
492
+ cursor: pointer;
493
+ opacity: 0;
494
+ transition: opacity 0.15s ease;
495
+ }
496
+
497
+ .rf-code-wrapper:hover .rf-copy-btn {
498
+ opacity: 1;
499
+ }
500
+
501
+ .rf-copy-btn:hover {
502
+ color: var(--rf-color-text, #212529);
503
+ border-color: var(--rf-color-muted, #6c757d);
504
+ }
505
+
506
+ .rf-copy-btn--copied {
507
+ color: var(--rf-color-success, #51cf66);
508
+ border-color: var(--rf-color-success, #51cf66);
509
+ }
510
+
511
+ /* --------------------------------------------------------------------------
512
+ Mobile toolbar (hidden on desktop)
513
+ -------------------------------------------------------------------------- */
514
+
515
+ .rf-plan-toolbar {
516
+ display: none;
517
+ align-items: center;
518
+ gap: 0.75rem;
519
+ padding: 0.625rem 1rem;
520
+ border-block-end: 1px solid var(--rf-color-border, #dee2e6);
521
+ background: var(--rf-color-bg, #fff);
522
+ }
523
+
524
+ .rf-plan-toolbar__hamburger {
525
+ background: none;
526
+ border: none;
527
+ padding: 0.25rem;
528
+ cursor: pointer;
529
+ color: var(--rf-color-muted, #6c757d);
530
+ line-height: 0;
531
+ flex-shrink: 0;
532
+ }
533
+
534
+ .rf-plan-toolbar__hamburger:hover {
535
+ color: var(--rf-color-text, #212529);
536
+ }
537
+
538
+ .rf-plan-toolbar__title {
539
+ font-size: 0.875rem;
540
+ font-weight: 600;
541
+ color: var(--rf-color-text, #212529);
542
+ }
543
+
544
+ /* --------------------------------------------------------------------------
545
+ Responsive adjustments
546
+ -------------------------------------------------------------------------- */
547
+
548
+ /* Hide TOC on medium screens */
549
+ @media (max-width: 64rem) {
550
+ .rf-plan-toc {
551
+ display: none;
552
+ }
553
+ .rf-plan-main__inner--has-toc {
554
+ display: block;
555
+ }
556
+ }
557
+
558
+ @media (max-width: 48rem) {
559
+ .rf-plan-toolbar {
560
+ display: flex;
561
+ }
562
+
563
+ .rf-plan-sidebar {
564
+ display: none;
565
+ }
566
+
567
+ .rf-plan-main {
568
+ margin-inline-start: 0;
569
+ padding: var(--rf-spacing-md, 1rem);
570
+ }
571
+
572
+ .rf-plan-main__body {
573
+ padding: 0;
574
+ }
575
+
576
+ .rf-plan-dashboard {
577
+ grid-template-columns: 1fr;
578
+ padding: var(--rf-spacing-md, 1rem);
579
+ }
580
+ }