@refrakt-md/lumina 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.
@@ -0,0 +1,49 @@
1
+ /* progress — generic completion bar (SPEC-072 / WORK-285).
2
+ *
3
+ * Presentational: the fill width is driven by the `--rf-progress` custom
4
+ * property set on the root from the computed percent. Generalized from the
5
+ * former plan milestone progress bar.
6
+ */
7
+
8
+ .rf-progress {
9
+ display: flex;
10
+ flex-wrap: wrap;
11
+ align-items: baseline;
12
+ gap: var(--rf-spacing-xs) var(--rf-spacing-sm);
13
+ margin: var(--rf-spacing-sm) 0;
14
+ }
15
+
16
+ .rf-progress__label {
17
+ font-weight: 600;
18
+ color: var(--rf-color-text);
19
+ }
20
+
21
+ .rf-progress__value {
22
+ font-weight: 600;
23
+ color: var(--rf-color-text);
24
+ margin-left: auto;
25
+ }
26
+
27
+ .rf-progress__track {
28
+ flex-basis: 100%;
29
+ height: 0.5rem;
30
+ border-radius: var(--rf-radius-pill, 999px);
31
+ background: var(--rf-color-surface-hover);
32
+ overflow: hidden;
33
+ }
34
+
35
+ .rf-progress__fill {
36
+ display: block;
37
+ height: 100%;
38
+ width: var(--rf-progress, 0%);
39
+ border-radius: inherit;
40
+ background: var(--rf-color-primary);
41
+ transition: width 0.3s ease;
42
+ }
43
+
44
+ /* Sentiment variants tint the fill; the neutral default uses the primary.
45
+ * Token names follow the sentiment scheme in dimensions/metadata.css
46
+ * (positive→success, caution→warning, negative→danger). */
47
+ .rf-progress--positive .rf-progress__fill { background: var(--rf-color-success); }
48
+ .rf-progress--caution .rf-progress__fill { background: var(--rf-color-warning); }
49
+ .rf-progress--negative .rf-progress__fill { background: var(--rf-color-danger); }
@@ -0,0 +1,132 @@
1
+ /* Relationships — an entity's graph edges, grouped by kind (SPEC-072).
2
+ *
3
+ * Generic over kind: the rune emits `data-kind` on each item and a humanized
4
+ * group heading per kind. Mirrors collection's list chrome.
5
+ */
6
+
7
+ .rf-relationships {
8
+ margin: var(--rf-spacing-md) 0;
9
+ }
10
+
11
+ .rf-relationships__preamble > :first-child { margin-top: 0; }
12
+
13
+ .rf-relationships__empty {
14
+ color: var(--rf-color-muted);
15
+ font-size: 0.9375em;
16
+ }
17
+
18
+ .rf-relationships__items {
19
+ display: flex;
20
+ flex-direction: column;
21
+ gap: var(--rf-spacing-sm);
22
+ }
23
+
24
+ /* grid arranges edges into responsive columns; list stays a stacked flow.
25
+ * Mirrors collection: item chrome comes from the item (the card built-in, or
26
+ * a {% card %} in the body template), not the layout. */
27
+ .rf-relationships[data-layout='grid'] .rf-relationships__items {
28
+ display: grid;
29
+ grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
30
+ gap: var(--rf-spacing-md);
31
+ align-items: stretch;
32
+ }
33
+ .rf-relationships[data-layout='grid'] .rf-relationships__item {
34
+ display: flex;
35
+ }
36
+ .rf-relationships[data-layout='grid'] .rf-relationships__item > * {
37
+ flex: 1;
38
+ min-width: 0;
39
+ }
40
+
41
+ /* Grouped grid: the grid belongs to each group (its items are the cells), not
42
+ * to __items — whose children are the group blocks (or the accordion wrapper).
43
+ * Left on __items, each group collapses into a single column. So __items stacks
44
+ * the groups and each group becomes the grid, with its title spanning. */
45
+ .rf-relationships[data-layout='grid'] .rf-relationships__items:has(.rf-relationships__group),
46
+ .rf-relationships[data-layout='grid'] .rf-relationships__items:has(.rf-accordion) {
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: var(--rf-spacing-md);
50
+ }
51
+ .rf-relationships[data-layout='grid'] .rf-relationships__group {
52
+ display: grid;
53
+ grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
54
+ gap: var(--rf-spacing-md);
55
+ align-items: stretch;
56
+ }
57
+ .rf-relationships[data-layout='grid'] .rf-relationships__group-title {
58
+ grid-column: 1 / -1;
59
+ }
60
+
61
+ .rf-relationships__group {
62
+ margin-top: var(--rf-spacing-md);
63
+ display: flex;
64
+ flex-direction: column;
65
+ /* Tight default for the built-in inline shape (title + field spans). */
66
+ gap: var(--rf-spacing-xs);
67
+ }
68
+ .rf-relationships__group:first-child {
69
+ margin-top: 0;
70
+ }
71
+ /* Modestly roomier when items carry a body template (block content — more than
72
+ * a one-liner). Body-template items are marked `data-block` by the resolver;
73
+ * the built-in inline title+field rows are not. */
74
+ .rf-relationships__group:has(.rf-relationships__item[data-block]) {
75
+ gap: var(--rf-spacing-sm);
76
+ }
77
+
78
+ .rf-relationships__group-title {
79
+ margin: 0 0 var(--rf-spacing-sm);
80
+ font-size: 0.875em;
81
+ text-transform: uppercase;
82
+ letter-spacing: 0.05em;
83
+ color: var(--rf-color-muted);
84
+ }
85
+
86
+ .rf-relationships__item {
87
+ display: flex;
88
+ flex-wrap: wrap;
89
+ align-items: baseline;
90
+ gap: var(--rf-spacing-xs) var(--rf-spacing-sm);
91
+ }
92
+ /* Block-content item — let the body template (card / callout / etc.) fill the
93
+ * container width instead of shrink-fitting. Same `data-block` signal as the
94
+ * group spacing above; trim the template's outer block margins so the group
95
+ * `gap` governs spacing (works for any block content, not a wrapper element). */
96
+ .rf-relationships__item[data-block] {
97
+ display: block;
98
+ }
99
+ .rf-relationships__item[data-block] > :first-child {
100
+ margin-top: 0;
101
+ }
102
+ .rf-relationships__item[data-block] > :last-child {
103
+ margin-bottom: 0;
104
+ }
105
+
106
+ /* Card chrome for the grid built-in (mirrors collection's __card). */
107
+ .rf-relationships__card {
108
+ display: flex;
109
+ flex-direction: column;
110
+ gap: var(--rf-spacing-xs);
111
+ padding: var(--rf-spacing-md);
112
+ border: 1px solid var(--rf-color-border);
113
+ border-radius: var(--rf-radius-md);
114
+ background: var(--rf-color-surface);
115
+ }
116
+ .rf-relationships__card:hover {
117
+ background: var(--rf-color-surface-hover);
118
+ }
119
+
120
+ .rf-relationships__title {
121
+ font-weight: 600;
122
+ color: var(--rf-color-text);
123
+ text-decoration: none;
124
+ }
125
+ .rf-relationships__title:hover {
126
+ color: var(--rf-color-primary);
127
+ }
128
+
129
+ .rf-relationships__field {
130
+ font-size: 0.875em;
131
+ color: var(--rf-color-muted);
132
+ }
package/tokens/base.css CHANGED
@@ -52,6 +52,20 @@
52
52
  --rf-color-success-bg: #e0eee4;
53
53
  --rf-color-success-border: #b8d4be;
54
54
 
55
+ /* WORK-304 — neutral tint for line highlight (the third
56
+ * `[data-line-status]` value that snippet / codegroup / diff share).
57
+ * Subtle surface tint so highlighted rows read as emphasized but not
58
+ * status-coloured (which would compete with diff's add/remove channel
59
+ * and the semantic palette above). `*-rail` is the optional left-edge
60
+ * border colour; falls back to the primary accent via the consuming
61
+ * CSS for themes that don't override it. */
62
+ --rf-color-line-highlight: color-mix(in srgb, var(--rf-color-text) 6%, transparent);
63
+ --rf-color-line-highlight-rail: var(--rf-color-primary, var(--rf-color-text));
64
+ /* Gutter colour for `pre[data-linenumbers]` line counter. Defers to
65
+ * the existing muted text token by default; themes can pin a
66
+ * dedicated hue without overriding muted. */
67
+ --rf-color-line-number: var(--rf-color-muted);
68
+
55
69
  /* Radii */
56
70
  --rf-radius-sm: 6px;
57
71
  --rf-radius-md: 10px;
@@ -1,108 +0,0 @@
1
- /* Backlog */
2
-
3
- /* Group sections */
4
- .rf-backlog__group {
5
- margin-bottom: 1.5rem;
6
- }
7
- .rf-backlog__group-title {
8
- font-size: 0.8125rem;
9
- font-weight: 700;
10
- text-transform: uppercase;
11
- letter-spacing: 0.05em;
12
- color: var(--rf-color-muted);
13
- margin: 0 0 0.5rem;
14
- padding-bottom: 0.375rem;
15
- border-bottom: 1px solid var(--rf-color-border);
16
- }
17
-
18
- /* Cards — mini rune surface */
19
- .rf-backlog__card {
20
- display: flex;
21
- flex-direction: column;
22
- gap: 0.375rem;
23
- padding: 0.75rem 1rem;
24
- border-radius: var(--rf-radius-md);
25
- background: var(--rf-color-surface);
26
- margin-bottom: 0.5rem;
27
- transition: box-shadow 200ms ease;
28
- }
29
- .rf-backlog__card:hover {
30
- box-shadow: var(--rf-shadow-md);
31
- }
32
-
33
- /* Card link — suppress underline */
34
- .rf-backlog__card-link {
35
- text-decoration: none;
36
- color: inherit;
37
- display: flex;
38
- flex-direction: column;
39
- gap: 0.375rem;
40
- }
41
- .rf-backlog__card-link:hover {
42
- text-decoration: none;
43
- }
44
-
45
- /* ─── Header row: ID left, status + progress right ──────────────────── */
46
- .rf-backlog__card [data-section="header"] {
47
- display: flex;
48
- align-items: center;
49
- justify-content: space-between;
50
- gap: 0.5rem;
51
- margin-bottom: 0;
52
- }
53
- .rf-backlog__card-header-left,
54
- .rf-backlog__card-header-right {
55
- display: inline-flex;
56
- align-items: center;
57
- gap: 0.5rem;
58
- }
59
-
60
- /* Strip borders and pill styling from header badges — doubled class for specificity */
61
- .rf-backlog__card [data-section="header"] [data-meta-type][data-meta-type] {
62
- border: none;
63
- padding: 0;
64
- border-radius: 0;
65
- }
66
-
67
- /* Suppress sentiment circles in header */
68
- .rf-backlog__card [data-section="header"] [data-meta-sentiment]::before {
69
- display: none;
70
- }
71
-
72
- /* ─── Body: title ───────────────────────────────────────────────────── */
73
- .rf-backlog__card [data-section="title"] {
74
- font-size: 0.9375rem;
75
- font-weight: 600;
76
- }
77
-
78
- /* ─── Footer row: uniform secondary pills ───────────────────────────── */
79
- .rf-backlog__card [data-section="footer"] {
80
- display: flex;
81
- flex-wrap: wrap;
82
- align-items: center;
83
- gap: 0.375rem;
84
- }
85
-
86
- /* Normalize all footer pills to same size regardless of rank/type */
87
- .rf-backlog__card [data-section="footer"] [data-meta-type] {
88
- font-size: 0.75rem;
89
- padding: 0.25em 0.75em;
90
- opacity: 1;
91
- }
92
-
93
- /* Checklist progress badge — plain text in header.
94
- Override checklist dimension styles that match [data-checked]. */
95
- .rf-backlog__card-progress {
96
- font-family: var(--rf-font-mono);
97
- font-size: 0.75rem;
98
- font-weight: 600;
99
- color: var(--rf-color-muted);
100
- border: none;
101
- padding: 0;
102
- padding-left: 0;
103
- margin-left: 0;
104
- position: static;
105
- }
106
- .rf-backlog__card-progress::before {
107
- display: none;
108
- }
@@ -1,46 +0,0 @@
1
- /* Decision Log */
2
-
3
- /* Entry list */
4
- .rf-decision-log__list {
5
- list-style: none;
6
- padding: 0;
7
- margin: 0;
8
- }
9
- .rf-decision-log__entry {
10
- display: flex;
11
- flex-direction: column;
12
- gap: 0.25rem;
13
- padding: 0.75rem 1rem;
14
- border-radius: var(--rf-radius-md);
15
- background: var(--rf-color-surface);
16
- margin-bottom: 0.5rem;
17
- transition: box-shadow 200ms ease;
18
- }
19
- .rf-decision-log__entry:hover {
20
- box-shadow: var(--rf-shadow-md);
21
- }
22
-
23
- /* Entry link — suppress underline */
24
- .rf-decision-log__link {
25
- text-decoration: none;
26
- color: inherit;
27
- display: flex;
28
- flex-direction: column;
29
- gap: 0.25rem;
30
- }
31
- .rf-decision-log__link:hover {
32
- text-decoration: none;
33
- }
34
-
35
- /* Entry title — smaller than full rune */
36
- .rf-decision-log__entry [data-section="title"] {
37
- font-size: 0.9375rem;
38
- font-weight: 600;
39
- }
40
-
41
- /* Superseded/deprecated entries — muted with strikethrough */
42
- .rf-decision-log__entry[data-status="superseded"] [data-section="title"],
43
- .rf-decision-log__entry[data-status="deprecated"] [data-section="title"] {
44
- color: var(--rf-color-muted);
45
- text-decoration: line-through;
46
- }
@@ -1,87 +0,0 @@
1
- /* Plan Activity */
2
- .rf-plan-activity__list {
3
- list-style: none;
4
- padding: 0;
5
- margin: 0;
6
- }
7
- .rf-plan-activity__entry {
8
- display: flex;
9
- align-items: baseline;
10
- gap: 0.5rem;
11
- padding: 0.25rem 0.5rem;
12
- border-radius: var(--rf-radius-sm);
13
- font-size: 0.8125rem;
14
- }
15
- .rf-plan-activity__entry:nth-child(odd) {
16
- background: var(--rf-color-surface);
17
- }
18
- .rf-plan-activity__date {
19
- font-family: var(--rf-font-mono);
20
- font-size: 0.75rem;
21
- color: var(--rf-color-muted);
22
- white-space: nowrap;
23
- }
24
- .rf-plan-activity__type {
25
- font-size: 0.75rem;
26
- text-transform: uppercase;
27
- letter-spacing: 0.05em;
28
- color: var(--rf-color-muted);
29
- min-width: 4rem;
30
- }
31
- .rf-plan-activity__id {
32
- font-family: var(--rf-font-mono);
33
- font-size: 0.75rem;
34
- color: var(--rf-color-primary);
35
- white-space: nowrap;
36
- }
37
- .rf-plan-activity__status {
38
- font-size: 0.75rem;
39
- padding: 0.0625rem 0.375rem;
40
- border-radius: var(--rf-radius-sm);
41
- white-space: nowrap;
42
- }
43
-
44
- /* Status badge colors */
45
- .rf-plan-activity__status[data-status="done"],
46
- .rf-plan-activity__status[data-status="fixed"],
47
- .rf-plan-activity__status[data-status="accepted"] {
48
- color: var(--rf-color-success);
49
- background: var(--rf-color-success-bg);
50
- }
51
- .rf-plan-activity__status[data-status="in-progress"],
52
- .rf-plan-activity__status[data-status="confirmed"],
53
- .rf-plan-activity__status[data-status="review"] {
54
- color: var(--rf-color-warning);
55
- background: var(--rf-color-warning-bg);
56
- }
57
- .rf-plan-activity__status[data-status="ready"],
58
- .rf-plan-activity__status[data-status="reported"],
59
- .rf-plan-activity__status[data-status="proposed"] {
60
- color: var(--rf-color-info);
61
- background: var(--rf-color-info-bg);
62
- }
63
- .rf-plan-activity__status[data-status="blocked"] {
64
- color: var(--rf-color-danger);
65
- background: var(--rf-color-danger-bg);
66
- }
67
- .rf-plan-activity__status[data-status="draft"] {
68
- color: var(--rf-color-muted);
69
- background: var(--rf-color-surface-active);
70
- }
71
- .rf-plan-activity__title {
72
- color: var(--rf-color-text);
73
- overflow: hidden;
74
- text-overflow: ellipsis;
75
- white-space: nowrap;
76
- }
77
- .rf-plan-activity__link {
78
- display: flex;
79
- align-items: baseline;
80
- gap: 0.5rem;
81
- color: inherit;
82
- text-decoration: none;
83
- width: 100%;
84
- }
85
- .rf-plan-activity__link:hover .rf-plan-activity__title {
86
- color: var(--rf-color-primary);
87
- }
@@ -1,88 +0,0 @@
1
- /* Plan Entity Tabs — page-level tab navigation for spec/work/bug/decision pages */
2
-
3
- .rf-plan-entity-tabs {
4
- margin-block-start: var(--rf-spacing-lg, 1.5rem);
5
- }
6
-
7
- /* Tab bar — underline style matching the core tabs rune */
8
- .rf-plan-entity-tabs__tabs {
9
- display: flex;
10
- border-bottom: 1px solid var(--rf-color-border, #dee2e6);
11
- gap: 0;
12
- }
13
-
14
- /* Tab buttons */
15
- .rf-plan-entity-tabs__tab {
16
- flex: 0 0 auto;
17
- padding: 0.625rem 1.25rem;
18
- font-size: 0.875rem;
19
- font-weight: 500;
20
- font-family: inherit;
21
- color: var(--rf-color-muted, #868e96);
22
- background: none;
23
- border: none;
24
- border-bottom: 2px solid transparent;
25
- cursor: pointer;
26
- transition: color 200ms ease, border-color 200ms ease;
27
- white-space: nowrap;
28
- }
29
-
30
- .rf-plan-entity-tabs__tab:hover {
31
- color: var(--rf-color-text, #212529);
32
- }
33
-
34
- .rf-plan-entity-tabs__tab--active,
35
- .rf-plan-entity-tabs__tab[data-state="active"] {
36
- color: var(--rf-color-primary, #228be6);
37
- border-bottom-color: var(--rf-color-primary, #228be6);
38
- font-weight: 600;
39
- }
40
-
41
- /* Panels container */
42
- .rf-plan-entity-tabs__panels {
43
- padding: 0;
44
- margin: 0;
45
- }
46
-
47
- /* Individual panel */
48
- .rf-plan-entity-tabs__panel {
49
- padding-block-start: var(--rf-spacing-lg, 1.5rem);
50
- }
51
-
52
- .rf-plan-entity-tabs__panel > *:first-child {
53
- margin-top: 0;
54
- }
55
-
56
- .rf-plan-entity-tabs__panel > *:last-child {
57
- margin-bottom: 0;
58
- }
59
-
60
- /* When inside entity tabs, relationships and history sections don't need
61
- their own heading — the tab label provides the context */
62
- .rf-plan-entity-tabs__panel .rf-plan-relationships__heading,
63
- .rf-plan-entity-tabs__panel .rf-plan-history__heading {
64
- display: none;
65
- }
66
-
67
- /* Remove top margin, padding, and border from relationships/history sections when inside a tab panel */
68
- .rf-plan-entity-tabs__panel .rf-plan-relationships,
69
- .rf-plan-entity-tabs__panel .rf-plan-history {
70
- margin-block-start: 0;
71
- padding-block-start: 0;
72
- border-block-start: none;
73
- }
74
-
75
- /* ---- TOC dimming when non-Overview tab is active ---- */
76
-
77
- /* Desktop TOC: dim when a non-overview tab is active */
78
- :has([data-active-tab]:not([data-active-tab="overview"])) .rf-plan-toc {
79
- opacity: 0.3;
80
- pointer-events: none;
81
- transition: opacity 200ms ease;
82
- }
83
-
84
- :has([data-active-tab="overview"]) .rf-plan-toc {
85
- opacity: 1;
86
- pointer-events: auto;
87
- transition: opacity 200ms ease;
88
- }
@@ -1,40 +0,0 @@
1
- /* Plan relationships section */
2
-
3
- .rf-plan-relationships {
4
- margin-top: 2rem;
5
- padding-top: 1.5rem;
6
- border-top: 1px solid var(--rf-color-border, #dee2e6);
7
- }
8
-
9
- .rf-plan-relationships__heading {
10
- font-size: 1.125rem;
11
- font-weight: 600;
12
- color: var(--rf-color-text, #212529);
13
- margin: 0 0 1rem;
14
- }
15
-
16
- .rf-plan-relationships__group {
17
- margin-bottom: 1rem;
18
- }
19
-
20
- .rf-plan-relationships__group-title {
21
- font-size: 0.8125rem;
22
- font-weight: 600;
23
- text-transform: uppercase;
24
- letter-spacing: 0.04em;
25
- color: var(--rf-color-muted, #6c757d);
26
- margin: 0 0 0.375rem;
27
- }
28
-
29
- .rf-plan-relationships__group[data-kind="blocked-by"] .rf-plan-relationships__group-title {
30
- color: var(--rf-color-danger, #ff6b6b);
31
- }
32
-
33
- .rf-plan-relationships__group[data-kind="blocks"] .rf-plan-relationships__group-title {
34
- color: var(--rf-color-warning, #f59f00);
35
- }
36
-
37
- .rf-plan-relationships__cards {
38
- display: flex;
39
- flex-direction: column;
40
- }