rori 0.1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +25 -0
- data/LICENSE +21 -0
- data/README.md +279 -0
- data/app/assets/stylesheets/rori/_init.css +79 -0
- data/app/assets/stylesheets/rori/layout.css +162 -0
- data/app/assets/stylesheets/rori/menubar.css +117 -0
- data/app/assets/stylesheets/rori/notifications.css +120 -0
- data/app/assets/stylesheets/rori/palette.css +114 -0
- data/app/assets/stylesheets/rori/shortcuts.css +110 -0
- data/app/assets/stylesheets/rori/terminal.css +98 -0
- data/app/assets/stylesheets/rori/themes.css +156 -0
- data/app/assets/stylesheets/rori/typing_badge.css +56 -0
- data/app/assets/stylesheets/rori/wallpaper.css +52 -0
- data/app/assets/stylesheets/rori/window.css +174 -0
- data/app/controllers/concerns/rori/windowed.rb +15 -0
- data/app/controllers/rori/commands/bars_controller.rb +9 -0
- data/app/controllers/rori/commands/runs_controller.rb +22 -0
- data/app/controllers/rori/commands/themes_controller.rb +9 -0
- data/app/controllers/rori/commands/ui_controller.rb +9 -0
- data/app/controllers/rori/commands/wallpapers_controller.rb +9 -0
- data/app/controllers/rori/commands_controller.rb +7 -0
- data/app/controllers/rori/desktops_controller.rb +7 -0
- data/app/helpers/rori/assets_helper.rb +9 -0
- data/app/helpers/rori/keymap_helper.rb +50 -0
- data/app/helpers/rori/prefs_helper.rb +13 -0
- data/app/helpers/rori/theme_helper.rb +14 -0
- data/app/helpers/rori/wallpaper_helper.rb +19 -0
- data/app/helpers/rori/window_helper.rb +36 -0
- data/app/javascript/rori/clock_controller.js +18 -0
- data/app/javascript/rori/command_index.js +84 -0
- data/app/javascript/rori/fuzzy.js +50 -0
- data/app/javascript/rori/index.js +21 -0
- data/app/javascript/rori/notifications_controller.js +45 -0
- data/app/javascript/rori/palette_controller.js +307 -0
- data/app/javascript/rori/prefs_controller.js +68 -0
- data/app/javascript/rori/rori_controller.js +996 -0
- data/app/javascript/rori/terminal_controller.js +198 -0
- data/app/javascript/rori/theme_controller.js +35 -0
- data/app/javascript/rori/wallpaper_controller.js +67 -0
- data/app/models/rori/command.rb +105 -0
- data/app/models/rori/notification.rb +20 -0
- data/app/models/rori/theme/color.rb +30 -0
- data/app/models/rori/theme.rb +87 -0
- data/app/models/rori/wallpaper.rb +54 -0
- data/app/views/layouts/rori/_head.html.haml +2 -0
- data/app/views/layouts/rori/shell.html.haml +97 -0
- data/app/views/layouts/rori/window.html.haml +10 -0
- data/app/views/rori/_menubar.html.haml +14 -0
- data/app/views/rori/_notification.html.haml +9 -0
- data/app/views/rori/_notifications.html.haml +10 -0
- data/app/views/rori/_palette.html.haml +13 -0
- data/app/views/rori/_shortcuts.html.haml +47 -0
- data/app/views/rori/_terminal.html.haml +9 -0
- data/app/views/rori/_wallpaper.html.haml +7 -0
- data/app/views/rori/_wallpaper_credit.html.haml +3 -0
- data/app/views/rori/_window.html.haml +15 -0
- data/app/views/rori/commands/_command.html.haml +17 -0
- data/app/views/rori/commands/index.html.haml +5 -0
- data/app/views/rori/desktops/show.html.haml +1 -0
- data/config/importmap.rb +3 -0
- data/config/locales/rori.en.yml +133 -0
- data/config/routes/rori.rb +13 -0
- data/lib/generators/rori/install/install_generator.rb +67 -0
- data/lib/generators/rori/install/templates/rori.rb.tt +22 -0
- data/lib/rori/engine.rb +19 -0
- data/lib/rori/version.rb +3 -0
- data/lib/rori.rb +180 -0
- data/lib/tasks/rori.rake +9 -0
- data/vendor/themes/LICENSE +25 -0
- data/vendor/themes/ghostty/Catppuccin Latte +22 -0
- data/vendor/themes/ghostty/Catppuccin Mocha +22 -0
- data/vendor/themes/ghostty/Everforest Dark Med +22 -0
- data/vendor/themes/ghostty/Flexoki Light +22 -0
- data/vendor/themes/ghostty/GitHub Dark Dimmed +22 -0
- data/vendor/themes/ghostty/Gruvbox Material Dark +22 -0
- data/vendor/themes/ghostty/Kanagawa Wave +22 -0
- data/vendor/themes/ghostty/Melange Dark +22 -0
- data/vendor/themes/ghostty/Nord +22 -0
- data/vendor/themes/ghostty/Rose Pine Dawn +22 -0
- data/vendor/themes/ghostty/Rose Pine Moon +22 -0
- data/vendor/themes/ghostty/TokyoNight Storm +22 -0
- data/vendor/themes/ghostty/Tomorrow Night Eighties +22 -0
- data/vendor/themes/ghostty/Zenbones Light +22 -0
- data/vendor/wallpapers/unsplash.yml +23 -0
- metadata +219 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/* Corner notifications (rori/_notifications), next to the menu bar with the
|
|
2
|
+
newest nearest it. The stack is a manual popover, so it sits above modal
|
|
3
|
+
windows too. Each notification fades out after a while (the animation's end
|
|
4
|
+
removes it, rori-notifications#expire); the pointer on the stack pauses
|
|
5
|
+
them. Sticky ones (errors) wait for ×. */
|
|
6
|
+
@layer rori.components {
|
|
7
|
+
.rori-notifications {
|
|
8
|
+
position: fixed;
|
|
9
|
+
inset: 40px 8px auto auto;
|
|
10
|
+
width: min(22rem, calc(100vw - 16px));
|
|
11
|
+
margin: 0;
|
|
12
|
+
padding: 0;
|
|
13
|
+
border: 0;
|
|
14
|
+
background: none;
|
|
15
|
+
overflow: visible;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.rori-notifications:popover-open {
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column-reverse;
|
|
21
|
+
gap: 8px;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.bars-bottom .rori-notifications {
|
|
25
|
+
inset: auto 8px 40px auto;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.bars-bottom .rori-notifications:popover-open {
|
|
29
|
+
flex-direction: column;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.rori-notification {
|
|
33
|
+
position: relative;
|
|
34
|
+
display: grid;
|
|
35
|
+
gap: 2px;
|
|
36
|
+
padding: 10px 36px 10px 14px;
|
|
37
|
+
border: 1px solid var(--rori-line);
|
|
38
|
+
border-left: 3px solid var(--rori-primary);
|
|
39
|
+
border-radius: var(--rori-radius);
|
|
40
|
+
background: color-mix(in oklch, var(--rori-surface) 88%, transparent);
|
|
41
|
+
backdrop-filter: blur(16px) saturate(1.4);
|
|
42
|
+
box-shadow: var(--rori-shadow);
|
|
43
|
+
color: var(--rori-ink);
|
|
44
|
+
/* Out after 6s: the delay is the notification's life, so pausing it holds. */
|
|
45
|
+
animation:
|
|
46
|
+
rori-notification-in 220ms var(--rori-ease),
|
|
47
|
+
rori-notification-out 300ms var(--rori-ease) 6s forwards;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.rori-notification--success {
|
|
51
|
+
border-left-color: var(--rori-success);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.rori-notification--error {
|
|
55
|
+
border-left-color: var(--rori-danger);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.rori-notification--sticky {
|
|
59
|
+
animation: rori-notification-in 220ms var(--rori-ease);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.rori-notifications:hover .rori-notification {
|
|
63
|
+
animation-play-state: paused;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.rori-notification__title {
|
|
67
|
+
font-weight: 600;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.rori-notification__body {
|
|
71
|
+
color: var(--rori-ink-muted);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.rori-notification__close {
|
|
75
|
+
position: absolute;
|
|
76
|
+
top: 6px;
|
|
77
|
+
right: 6px;
|
|
78
|
+
width: 22px;
|
|
79
|
+
height: 22px;
|
|
80
|
+
border-radius: 4px;
|
|
81
|
+
color: var(--rori-ink-muted);
|
|
82
|
+
cursor: pointer;
|
|
83
|
+
opacity: 0;
|
|
84
|
+
transition: opacity 120ms;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.rori-notification:hover .rori-notification__close,
|
|
88
|
+
.rori-notification__close:focus-visible {
|
|
89
|
+
opacity: 1;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.rori-notification__close:hover {
|
|
93
|
+
background: var(--rori-hover);
|
|
94
|
+
color: var(--rori-ink);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@keyframes rori-notification-in {
|
|
98
|
+
from {
|
|
99
|
+
opacity: 0;
|
|
100
|
+
translate: 24px 0;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@keyframes rori-notification-out {
|
|
105
|
+
to {
|
|
106
|
+
opacity: 0;
|
|
107
|
+
translate: 24px 0;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@media (prefers-reduced-motion: reduce) {
|
|
112
|
+
.rori-notification {
|
|
113
|
+
animation: rori-notification-out 1ms 6s forwards;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.rori-notification--sticky {
|
|
117
|
+
animation: none;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
@layer rori.components {
|
|
2
|
+
.rori-palette {
|
|
3
|
+
width: min(36rem, calc(100vw - 2rem));
|
|
4
|
+
margin: 12vh auto auto;
|
|
5
|
+
padding: 0;
|
|
6
|
+
border: 1px solid var(--rori-ink);
|
|
7
|
+
border-radius: var(--rori-radius);
|
|
8
|
+
background: var(--rori-surface);
|
|
9
|
+
color: var(--rori-ink);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.rori-palette::backdrop {
|
|
13
|
+
background: var(--rori-backdrop);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.rori-palette__field {
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
border-bottom: 1px solid var(--rori-line);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.rori-palette__crumbs {
|
|
23
|
+
padding-left: 16px;
|
|
24
|
+
font: 12px var(--rori-font-mono);
|
|
25
|
+
color: var(--rori-ink-muted);
|
|
26
|
+
white-space: nowrap;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.rori-palette__input {
|
|
30
|
+
flex: 1;
|
|
31
|
+
min-width: 0;
|
|
32
|
+
padding: 14px 16px;
|
|
33
|
+
font-size: 15px;
|
|
34
|
+
outline: none;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.rori-palette__crumbs:not([hidden])+.rori-palette__input {
|
|
38
|
+
padding-left: 8px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.rori-palette__input::-webkit-search-cancel-button {
|
|
42
|
+
display: none;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.rori-palette__results {
|
|
46
|
+
display: block;
|
|
47
|
+
max-height: 22rem;
|
|
48
|
+
overflow: auto;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.rori-palette__list {
|
|
52
|
+
padding: 4px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.rori-palette__item {
|
|
56
|
+
display: flex;
|
|
57
|
+
justify-content: space-between;
|
|
58
|
+
gap: 12px;
|
|
59
|
+
padding: 7px 12px;
|
|
60
|
+
border-radius: var(--rori-radius-sm);
|
|
61
|
+
cursor: pointer;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.rori-palette__item[aria-selected="true"] {
|
|
65
|
+
background: var(--rori-primary);
|
|
66
|
+
color: var(--rori-on-primary);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.rori-palette__label {
|
|
70
|
+
flex: 1;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.rori-palette__group {
|
|
74
|
+
font-size: 12px;
|
|
75
|
+
opacity: 0.6;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* The command's keyboard shortcut, before its group. currentColor keeps it
|
|
79
|
+
legible on the inverted selected row too. */
|
|
80
|
+
.rori-palette__shortcut {
|
|
81
|
+
align-self: center;
|
|
82
|
+
padding: 0 5px;
|
|
83
|
+
border: 1px solid color-mix(in oklch, currentColor 30%, transparent);
|
|
84
|
+
border-radius: 4px;
|
|
85
|
+
color: inherit;
|
|
86
|
+
opacity: 0.75;
|
|
87
|
+
white-space: nowrap;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* A command that asks first, armed by the first ↵ (rori-palette#arm). */
|
|
91
|
+
.rori-palette__confirm {
|
|
92
|
+
align-self: center;
|
|
93
|
+
font-size: 12px;
|
|
94
|
+
font-weight: 600;
|
|
95
|
+
white-space: nowrap;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.rori-palette__more,
|
|
99
|
+
.rori-palette__check {
|
|
100
|
+
margin: 0 4px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.rori-palette__empty {
|
|
104
|
+
padding: 16px;
|
|
105
|
+
color: var(--rori-ink-muted);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.rori-palette__hint {
|
|
109
|
+
padding: 8px 12px;
|
|
110
|
+
border-top: 1px solid var(--rori-line);
|
|
111
|
+
color: var(--rori-ink-muted);
|
|
112
|
+
font-size: 12px;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/* The keyboard shortcuts modal (rori/_shortcuts). */
|
|
2
|
+
@layer rori.components {
|
|
3
|
+
.rori-shortcuts {
|
|
4
|
+
width: min(52rem, calc(100vw - 2rem));
|
|
5
|
+
max-height: min(85vh, 44rem);
|
|
6
|
+
margin: auto;
|
|
7
|
+
padding: 0;
|
|
8
|
+
border: 1px solid var(--rori-ink);
|
|
9
|
+
border-radius: var(--rori-radius);
|
|
10
|
+
background: var(--rori-surface);
|
|
11
|
+
color: var(--rori-ink);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.rori-shortcuts[open] {
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.rori-shortcuts::backdrop {
|
|
20
|
+
background: var(--rori-backdrop);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.rori-shortcuts__head {
|
|
24
|
+
display: flex;
|
|
25
|
+
align-items: center;
|
|
26
|
+
justify-content: space-between;
|
|
27
|
+
padding: 12px 16px;
|
|
28
|
+
border-bottom: 1px solid var(--rori-line);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.rori-shortcuts__head h2 {
|
|
32
|
+
margin: 0;
|
|
33
|
+
font-size: 14px;
|
|
34
|
+
font-weight: 600;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.rori-shortcuts__close {
|
|
38
|
+
width: 24px;
|
|
39
|
+
height: 24px;
|
|
40
|
+
border-radius: 4px;
|
|
41
|
+
line-height: 1;
|
|
42
|
+
cursor: pointer;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.rori-shortcuts__close:hover {
|
|
46
|
+
background: var(--rori-hover);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.rori-shortcuts__body {
|
|
50
|
+
overflow: auto;
|
|
51
|
+
padding: 12px 16px 16px;
|
|
52
|
+
columns: 2 18rem;
|
|
53
|
+
column-gap: 32px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.rori-shortcuts__section {
|
|
57
|
+
break-inside: avoid;
|
|
58
|
+
margin-bottom: 16px;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.rori-shortcuts__section h3 {
|
|
62
|
+
margin: 0 0 6px;
|
|
63
|
+
font-size: 11px;
|
|
64
|
+
font-weight: 600;
|
|
65
|
+
text-transform: uppercase;
|
|
66
|
+
letter-spacing: 0.06em;
|
|
67
|
+
color: var(--rori-ink-muted);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.rori-shortcuts__section dl {
|
|
71
|
+
display: grid;
|
|
72
|
+
grid-template-columns: 1fr auto;
|
|
73
|
+
gap: 4px 12px;
|
|
74
|
+
margin: 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.rori-shortcuts__section dd {
|
|
78
|
+
display: flex;
|
|
79
|
+
gap: 4px;
|
|
80
|
+
justify-content: end;
|
|
81
|
+
margin: 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.rori-shortcuts__note {
|
|
85
|
+
margin: 0 0 6px;
|
|
86
|
+
color: var(--rori-ink-muted);
|
|
87
|
+
font-size: 12px;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.rori-shortcuts kbd {
|
|
91
|
+
padding: 0 5px;
|
|
92
|
+
border: 1px solid var(--rori-line);
|
|
93
|
+
border-radius: 4px;
|
|
94
|
+
font: 12px var(--rori-font-mono);
|
|
95
|
+
white-space: nowrap;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.rori-shortcuts__foot {
|
|
99
|
+
padding: 10px 16px;
|
|
100
|
+
border-top: 1px solid var(--rori-line);
|
|
101
|
+
color: var(--rori-ink-muted);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.rori-shortcuts__foot label {
|
|
105
|
+
display: flex;
|
|
106
|
+
align-items: center;
|
|
107
|
+
gap: 8px;
|
|
108
|
+
cursor: pointer;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* Quake-style drop-down under the menubar (rori-terminal). Fixed, so it stays
|
|
2
|
+
out of the body grid; slides in via @starting-style. */
|
|
3
|
+
@layer rori.components {
|
|
4
|
+
.rori-terminal {
|
|
5
|
+
position: fixed;
|
|
6
|
+
inset: 32px 0 auto;
|
|
7
|
+
z-index: 20;
|
|
8
|
+
display: grid;
|
|
9
|
+
grid-template-rows: minmax(0, 1fr) auto auto;
|
|
10
|
+
height: min(44vh, 28rem);
|
|
11
|
+
border-bottom: 1px solid var(--rori-ink);
|
|
12
|
+
background: var(--rori-surface);
|
|
13
|
+
color: var(--rori-ink);
|
|
14
|
+
font: 12px/1.6 var(--rori-font-mono);
|
|
15
|
+
translate: 0;
|
|
16
|
+
transition: translate 160ms var(--rori-ease);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@starting-style {
|
|
20
|
+
.rori-terminal {
|
|
21
|
+
translate: 0 -100%;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Menu bar at the bottom: the terminal rises from it instead. */
|
|
26
|
+
.bars-bottom .rori-terminal {
|
|
27
|
+
inset: auto 0 32px;
|
|
28
|
+
border-top: 1px solid var(--rori-ink);
|
|
29
|
+
border-bottom: 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@starting-style {
|
|
33
|
+
.bars-bottom .rori-terminal {
|
|
34
|
+
translate: 0 100%;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.rori-terminal__output {
|
|
39
|
+
overflow: auto;
|
|
40
|
+
padding: 10px var(--rori-gap) 4px;
|
|
41
|
+
white-space: pre-wrap;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.rori-terminal__entry--muted,
|
|
45
|
+
.rori-terminal__entry--item {
|
|
46
|
+
color: var(--rori-ink-muted);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.rori-terminal__entry--ok {
|
|
50
|
+
color: var(--rori-success);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.rori-terminal__entry--error {
|
|
54
|
+
color: var(--rori-danger);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.rori-terminal__line {
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
gap: 8px;
|
|
61
|
+
padding: 6px var(--rori-gap);
|
|
62
|
+
border-top: 1px solid var(--rori-line);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.rori-terminal__prompt {
|
|
66
|
+
color: var(--rori-success);
|
|
67
|
+
white-space: nowrap;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.rori-terminal__input {
|
|
71
|
+
flex: 1;
|
|
72
|
+
min-width: 0;
|
|
73
|
+
outline: none;
|
|
74
|
+
caret-color: var(--rori-success);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.rori-terminal__suggestions {
|
|
78
|
+
display: flex;
|
|
79
|
+
flex-wrap: wrap;
|
|
80
|
+
gap: 4px 16px;
|
|
81
|
+
min-height: 26px;
|
|
82
|
+
padding: 0 var(--rori-gap) 6px;
|
|
83
|
+
color: var(--rori-ink-muted);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.rori-terminal__suggestion {
|
|
87
|
+
display: flex;
|
|
88
|
+
gap: 6px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.rori-terminal__suggestion[aria-selected] {
|
|
92
|
+
color: var(--rori-ink);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.rori-terminal__group {
|
|
96
|
+
opacity: 0.6;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/* Generated by `bin/rails rori:themes:build` from vendor/themes/ghostty — do not edit. */
|
|
2
|
+
@layer rori.themes {
|
|
3
|
+
:root[data-theme="catppuccin-latte"] {
|
|
4
|
+
color-scheme: light;
|
|
5
|
+
--color-canvas: oklch(0.9178 0.0058 264.53);
|
|
6
|
+
--color-surface: oklch(0.9578 0.0058 264.53);
|
|
7
|
+
--color-ink: oklch(0.4355 0.0430 279.33);
|
|
8
|
+
--color-danger: oklch(0.5505 0.2155 19.81);
|
|
9
|
+
--color-success: oklch(0.6250 0.1772 140.44);
|
|
10
|
+
--color-warning: oklch(0.7140 0.1494 67.78);
|
|
11
|
+
--color-info: oklch(0.5586 0.2255 262.09);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:root[data-theme="catppuccin-mocha"] {
|
|
15
|
+
color-scheme: dark;
|
|
16
|
+
--color-canvas: oklch(0.2029 0.0304 283.91);
|
|
17
|
+
--color-surface: oklch(0.2429 0.0304 283.91);
|
|
18
|
+
--color-ink: oklch(0.8787 0.0426 272.28);
|
|
19
|
+
--color-danger: oklch(0.7556 0.1297 2.76);
|
|
20
|
+
--color-success: oklch(0.8577 0.1092 142.72);
|
|
21
|
+
--color-warning: oklch(0.9193 0.0704 86.53);
|
|
22
|
+
--color-info: oklch(0.7664 0.1113 259.88);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
:root[data-theme="everforest-dark-med"] {
|
|
26
|
+
color-scheme: dark;
|
|
27
|
+
--color-canvas: oklch(0.2399 0.0123 232.92);
|
|
28
|
+
--color-surface: oklch(0.2799 0.0123 232.92);
|
|
29
|
+
--color-ink: oklch(0.8299 0.0405 86.05);
|
|
30
|
+
--color-danger: oklch(0.7086 0.1285 19.62);
|
|
31
|
+
--color-success: oklch(0.7732 0.0906 125.78);
|
|
32
|
+
--color-warning: oklch(0.8081 0.0863 83.70);
|
|
33
|
+
--color-info: oklch(0.7487 0.0631 185.49);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
:root[data-theme="flexoki-light"] {
|
|
37
|
+
color-scheme: light;
|
|
38
|
+
--color-canvas: oklch(0.9501 0.0161 95.22);
|
|
39
|
+
--color-surface: oklch(0.9901 0.0161 95.22);
|
|
40
|
+
--color-ink: oklch(0.1696 0.0017 0.00);
|
|
41
|
+
--color-danger: oklch(0.5042 0.1648 27.84);
|
|
42
|
+
--color-success: oklch(0.5593 0.1335 122.92);
|
|
43
|
+
--color-warning: oklch(0.6333 0.1295 85.81);
|
|
44
|
+
--color-info: oklch(0.4818 0.1315 254.79);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:root[data-theme="github-dark-dimmed"] {
|
|
48
|
+
color-scheme: dark;
|
|
49
|
+
--color-canvas: oklch(0.2308 0.0149 256.80);
|
|
50
|
+
--color-surface: oklch(0.2708 0.0149 256.80);
|
|
51
|
+
--color-ink: oklch(0.7829 0.0235 248.13);
|
|
52
|
+
--color-danger: oklch(0.7017 0.1642 26.07);
|
|
53
|
+
--color-success: oklch(0.6687 0.1421 144.47);
|
|
54
|
+
--color-warning: oklch(0.6888 0.1313 79.12);
|
|
55
|
+
--color-info: oklch(0.6841 0.1520 255.12);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
:root[data-theme="gruvbox-material-dark"] {
|
|
59
|
+
color-scheme: dark;
|
|
60
|
+
--color-canvas: oklch(0.2368 0.0000 0.00);
|
|
61
|
+
--color-surface: oklch(0.2768 0.0000 0.00);
|
|
62
|
+
--color-ink: oklch(0.8106 0.0567 81.23);
|
|
63
|
+
--color-danger: oklch(0.6768 0.1615 25.42);
|
|
64
|
+
--color-success: oklch(0.7478 0.1066 116.53);
|
|
65
|
+
--color-warning: oklch(0.7558 0.1133 77.04);
|
|
66
|
+
--color-info: oklch(0.7128 0.0546 179.19);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
:root[data-theme="kanagawa-wave"] {
|
|
70
|
+
color-scheme: dark;
|
|
71
|
+
--color-canvas: oklch(0.2033 0.0170 285.06);
|
|
72
|
+
--color-surface: oklch(0.2433 0.0170 285.06);
|
|
73
|
+
--color-ink: oklch(0.8755 0.0391 99.09);
|
|
74
|
+
--color-danger: oklch(0.5594 0.1670 23.09);
|
|
75
|
+
--color-success: oklch(0.6322 0.0698 136.92);
|
|
76
|
+
--color-warning: oklch(0.7290 0.0780 82.02);
|
|
77
|
+
--color-info: oklch(0.6937 0.0951 263.66);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
:root[data-theme="melange-dark"] {
|
|
81
|
+
color-scheme: dark;
|
|
82
|
+
--color-canvas: oklch(0.2278 0.0081 59.31);
|
|
83
|
+
--color-surface: oklch(0.2678 0.0081 59.31);
|
|
84
|
+
--color-ink: oklch(0.9157 0.0181 64.92);
|
|
85
|
+
--color-danger: oklch(0.6644 0.0746 17.07);
|
|
86
|
+
--color-success: oklch(0.6492 0.0586 146.44);
|
|
87
|
+
--color-warning: oklch(0.7491 0.1175 59.90);
|
|
88
|
+
--color-info: oklch(0.6544 0.0536 262.47);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
:root[data-theme="nord"] {
|
|
92
|
+
color-scheme: dark;
|
|
93
|
+
--color-canvas: oklch(0.2844 0.0229 264.18);
|
|
94
|
+
--color-surface: oklch(0.3244 0.0229 264.18);
|
|
95
|
+
--color-ink: oklch(0.8993 0.0164 262.75);
|
|
96
|
+
--color-danger: oklch(0.6061 0.1206 15.34);
|
|
97
|
+
--color-success: oklch(0.7683 0.0749 131.06);
|
|
98
|
+
--color-warning: oklch(0.8549 0.0892 84.09);
|
|
99
|
+
--color-info: oklch(0.6965 0.0591 248.69);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
:root[data-theme="rose-pine-dawn"] {
|
|
103
|
+
color-scheme: light;
|
|
104
|
+
--color-canvas: oklch(0.9299 0.0113 71.90);
|
|
105
|
+
--color-surface: oklch(0.9699 0.0113 71.90);
|
|
106
|
+
--color-ink: oklch(0.4597 0.0629 289.56);
|
|
107
|
+
--color-danger: oklch(0.5989 0.1071 2.66);
|
|
108
|
+
--color-success: oklch(0.4909 0.0770 228.00);
|
|
109
|
+
--color-warning: oklch(0.7555 0.1459 69.74);
|
|
110
|
+
--color-info: oklch(0.6289 0.0661 210.12);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
:root[data-theme="rose-pine-moon"] {
|
|
114
|
+
color-scheme: dark;
|
|
115
|
+
--color-canvas: oklch(0.2204 0.0390 287.73);
|
|
116
|
+
--color-surface: oklch(0.2604 0.0390 287.73);
|
|
117
|
+
--color-ink: oklch(0.9088 0.0299 289.97);
|
|
118
|
+
--color-danger: oklch(0.6977 0.1565 4.22);
|
|
119
|
+
--color-success: oklch(0.6138 0.0926 228.00);
|
|
120
|
+
--color-warning: oklch(0.8429 0.1100 74.60);
|
|
121
|
+
--color-info: oklch(0.8219 0.0543 209.56);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
:root[data-theme="tokyonight-storm"] {
|
|
125
|
+
color-scheme: dark;
|
|
126
|
+
--color-canvas: oklch(0.2419 0.0355 274.75);
|
|
127
|
+
--color-surface: oklch(0.2819 0.0355 274.75);
|
|
128
|
+
--color-ink: oklch(0.8456 0.0611 274.76);
|
|
129
|
+
--color-danger: oklch(0.7227 0.1589 10.28);
|
|
130
|
+
--color-success: oklch(0.7953 0.1395 130.14);
|
|
131
|
+
--color-warning: oklch(0.7839 0.1057 75.43);
|
|
132
|
+
--color-info: oklch(0.7190 0.1322 264.20);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
:root[data-theme="tomorrow-night-eighties"] {
|
|
136
|
+
color-scheme: dark;
|
|
137
|
+
--color-canvas: oklch(0.2572 0.0000 0.00);
|
|
138
|
+
--color-surface: oklch(0.2972 0.0000 0.00);
|
|
139
|
+
--color-ink: oklch(0.8452 0.0000 0.00);
|
|
140
|
+
--color-danger: oklch(0.7126 0.1515 20.16);
|
|
141
|
+
--color-success: oklch(0.7960 0.0889 144.68);
|
|
142
|
+
--color-warning: oklch(0.8707 0.1325 82.74);
|
|
143
|
+
--color-info: oklch(0.6676 0.0939 249.39);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
:root[data-theme="zenbones-light"] {
|
|
147
|
+
color-scheme: light;
|
|
148
|
+
--color-canvas: oklch(0.9081 0.0035 39.48);
|
|
149
|
+
--color-surface: oklch(0.9481 0.0035 39.48);
|
|
150
|
+
--color-ink: oklch(0.3261 0.0172 234.39);
|
|
151
|
+
--color-danger: oklch(0.5016 0.1526 12.03);
|
|
152
|
+
--color-success: oklch(0.4940 0.0922 130.75);
|
|
153
|
+
--color-warning: oklch(0.4930 0.1115 43.62);
|
|
154
|
+
--color-info: oklch(0.4797 0.0823 236.95);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/* A green "<input>" tag on the window whose field has focus — keys type there
|
|
2
|
+
instead of reaching the desk (same field list as FIELDS in rori_controller.js).
|
|
3
|
+
Pure CSS: the window becomes the anchor through :has(:focus); the badges sit
|
|
4
|
+
in the untransformed viewport, so the window's overflow doesn't clip them and
|
|
5
|
+
anchor positioning follows the strip's transforms. */
|
|
6
|
+
@layer rori.components {
|
|
7
|
+
.rori-col:not([data-w="1"])>.rori-win:has(:is(input, textarea, select, [contenteditable]):focus) {
|
|
8
|
+
anchor-name: --rori-typing;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* Full-width columns have no room beside them: tag the inside corner instead. */
|
|
12
|
+
.rori-col[data-w="1"]>.rori-win:has(:is(input, textarea, select, [contenteditable]):focus) {
|
|
13
|
+
anchor-name: --rori-typing-inside;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.rori-typing-badge {
|
|
17
|
+
position: absolute;
|
|
18
|
+
z-index: 2;
|
|
19
|
+
display: none;
|
|
20
|
+
border-radius: 4px;
|
|
21
|
+
background: var(--rori-success);
|
|
22
|
+
color: var(--rori-surface);
|
|
23
|
+
font: 600 10px/1 var(--rori-font-mono);
|
|
24
|
+
white-space: nowrap;
|
|
25
|
+
pointer-events: none;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Hangs off the window's left edge into the gutter, below the title bar;
|
|
29
|
+
flips to the right edge when the window touches the viewport's left. */
|
|
30
|
+
.rori-typing-badge--side {
|
|
31
|
+
position-anchor: --rori-typing;
|
|
32
|
+
position-area: left span-bottom;
|
|
33
|
+
position-try-fallbacks: flip-inline;
|
|
34
|
+
margin-top: 40px;
|
|
35
|
+
padding: 6px 3px;
|
|
36
|
+
writing-mode: vertical-rl;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.rori-typing-badge--inside {
|
|
40
|
+
position-anchor: --rori-typing-inside;
|
|
41
|
+
position-area: center;
|
|
42
|
+
align-self: end;
|
|
43
|
+
justify-self: start;
|
|
44
|
+
margin: 0 0 10px 10px;
|
|
45
|
+
padding: 3px 6px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.rori-viewport:has(.rori-col:not([data-w="1"]) > .rori-win :is(input, textarea, select, [contenteditable]):focus) .rori-typing-badge--side,
|
|
49
|
+
.rori-viewport:has(.rori-col[data-w="1"] > .rori-win :is(input, textarea, select, [contenteditable]):focus) .rori-typing-badge--inside {
|
|
50
|
+
display: block;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.is-overview .rori-typing-badge {
|
|
54
|
+
display: none;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/* Optional photo (Rori.wallpapers; UI › Wallpaper picks the mode). Windows are
|
|
2
|
+
opaque, so it shows through the gutters and on an empty desk. `safe` keeps it
|
|
3
|
+
inside the desk; `wallpaper-cover` runs it behind the menu bar too. */
|
|
4
|
+
@layer rori.layout {
|
|
5
|
+
|
|
6
|
+
body.has-wallpaper:not(.wallpaper-cover) .rori-viewport,
|
|
7
|
+
body.has-wallpaper.wallpaper-cover {
|
|
8
|
+
background: var(--rori-wallpaper) center / cover no-repeat;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* Tinted toward the theme's canvas so light and dark themes both stay calm
|
|
12
|
+
and the empty-desk hint stays readable. */
|
|
13
|
+
body.has-wallpaper .rori-viewport::before {
|
|
14
|
+
content: "";
|
|
15
|
+
position: absolute;
|
|
16
|
+
inset: 0;
|
|
17
|
+
background: color-mix(in oklch, var(--rori-canvas) 35%, transparent);
|
|
18
|
+
pointer-events: none;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
body.has-wallpaper.wallpaper-cover .rori-menubar {
|
|
22
|
+
background: color-mix(in oklch, var(--rori-canvas) 72%, transparent);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
body.has-wallpaper .rori-wallpaper {
|
|
26
|
+
background: color-mix(in oklch, var(--rori-surface) 88%, transparent);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* The photo credit, in the desk's bottom-right corner (right above the menu
|
|
30
|
+
bar when that sits at the bottom). Small enough for the gutter under the
|
|
31
|
+
windows, so it stays above them without covering one. */
|
|
32
|
+
.rori-wallpaper-credit {
|
|
33
|
+
position: absolute;
|
|
34
|
+
z-index: 1;
|
|
35
|
+
right: 6px;
|
|
36
|
+
bottom: 3px;
|
|
37
|
+
color: var(--rori-ink-muted);
|
|
38
|
+
font-size: 10px;
|
|
39
|
+
line-height: 1;
|
|
40
|
+
text-shadow: 0 0 4px var(--rori-canvas);
|
|
41
|
+
text-decoration: none;
|
|
42
|
+
white-space: nowrap;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.rori-wallpaper-credit:hover {
|
|
46
|
+
color: var(--rori-ink);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
body:not(.has-wallpaper) .rori-wallpaper-credit {
|
|
50
|
+
display: none;
|
|
51
|
+
}
|
|
52
|
+
}
|