@youtyan/code-viewer 0.3.0 → 0.4.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.
- package/README.md +37 -17
- package/dist/code-viewer.js +732 -156
- package/package.json +1 -1
- package/web/app.js +2323 -528
- package/web/index.html +13 -0
- package/web/style.css +521 -37
package/web/index.html
CHANGED
|
@@ -171,6 +171,19 @@
|
|
|
171
171
|
<p id="scope-exclude-names-help" class="scope-settings-help"></p>
|
|
172
172
|
<p id="scope-omit-source"></p>
|
|
173
173
|
</div>
|
|
174
|
+
<div class="scope-settings-section">
|
|
175
|
+
<strong id="datastore-section-title" class="scope-settings-section-title">Datastores</strong>
|
|
176
|
+
<label class="scope-settings-toggle">
|
|
177
|
+
<input id="datastore-infer-fk" type="checkbox" />
|
|
178
|
+
<span id="datastore-infer-fk-label">Infer FK from Rails-style naming</span>
|
|
179
|
+
</label>
|
|
180
|
+
<p id="datastore-infer-fk-help" class="scope-settings-help"></p>
|
|
181
|
+
<label class="scope-settings-toggle">
|
|
182
|
+
<input id="datastore-s3-tooltip" type="checkbox" />
|
|
183
|
+
<span id="datastore-s3-tooltip-label">Show S3 object preview tooltip on hover</span>
|
|
184
|
+
</label>
|
|
185
|
+
<p id="datastore-s3-tooltip-help" class="scope-settings-help"></p>
|
|
186
|
+
</div>
|
|
174
187
|
<div class="scope-settings-section">
|
|
175
188
|
<strong id="watch-section-title" class="scope-settings-section-title">File change watcher</strong>
|
|
176
189
|
<label for="scope-watch-limit">Maximum directories to watch</label>
|
package/web/style.css
CHANGED
|
@@ -4111,7 +4111,7 @@ body.gdp-file-detail-page #empty {
|
|
|
4111
4111
|
.gdp-context-menu .danger {
|
|
4112
4112
|
color: var(--danger);
|
|
4113
4113
|
}
|
|
4114
|
-
.gdp-
|
|
4114
|
+
.gdp-dialog-backdrop {
|
|
4115
4115
|
position: fixed;
|
|
4116
4116
|
inset: 0;
|
|
4117
4117
|
z-index: 1100;
|
|
@@ -4121,30 +4121,30 @@ body.gdp-file-detail-page #empty {
|
|
|
4121
4121
|
padding-top: min(14vh, 120px);
|
|
4122
4122
|
background: rgba(31, 35, 40, 0.18);
|
|
4123
4123
|
}
|
|
4124
|
-
[data-theme="dark"] .gdp-
|
|
4124
|
+
[data-theme="dark"] .gdp-dialog-backdrop {
|
|
4125
4125
|
background: rgba(1, 4, 9, 0.45);
|
|
4126
4126
|
}
|
|
4127
|
-
.gdp-
|
|
4127
|
+
.gdp-dialog {
|
|
4128
4128
|
width: min(420px, calc(100vw - 32px));
|
|
4129
4129
|
border: 1px solid var(--border);
|
|
4130
4130
|
border-radius: 8px;
|
|
4131
4131
|
background: var(--bg);
|
|
4132
4132
|
box-shadow: 0 16px 48px rgba(31, 35, 40, 0.28);
|
|
4133
4133
|
}
|
|
4134
|
-
.gdp-
|
|
4134
|
+
.gdp-dialog-title {
|
|
4135
4135
|
padding: 14px 16px 0;
|
|
4136
4136
|
color: var(--fg);
|
|
4137
4137
|
font-size: 15px;
|
|
4138
4138
|
font-weight: 600;
|
|
4139
4139
|
}
|
|
4140
|
-
.gdp-
|
|
4140
|
+
.gdp-dialog-body {
|
|
4141
4141
|
padding: 8px 16px 14px;
|
|
4142
4142
|
color: var(--fg-muted);
|
|
4143
4143
|
font-size: 13px;
|
|
4144
4144
|
line-height: 1.5;
|
|
4145
4145
|
overflow-wrap: anywhere;
|
|
4146
4146
|
}
|
|
4147
|
-
.gdp-
|
|
4147
|
+
.gdp-dialog-input {
|
|
4148
4148
|
display: block;
|
|
4149
4149
|
width: 100%;
|
|
4150
4150
|
height: 32px;
|
|
@@ -4156,29 +4156,29 @@ body.gdp-file-detail-page #empty {
|
|
|
4156
4156
|
color: var(--fg);
|
|
4157
4157
|
font: inherit;
|
|
4158
4158
|
}
|
|
4159
|
-
.gdp-
|
|
4159
|
+
.gdp-dialog-input:focus {
|
|
4160
4160
|
outline: 2px solid var(--accent-subtle);
|
|
4161
4161
|
border-color: var(--accent);
|
|
4162
4162
|
}
|
|
4163
|
-
.gdp-
|
|
4163
|
+
.gdp-dialog-error {
|
|
4164
4164
|
min-height: 18px;
|
|
4165
4165
|
margin-top: 6px;
|
|
4166
4166
|
color: var(--danger);
|
|
4167
4167
|
font-size: 12px;
|
|
4168
4168
|
line-height: 18px;
|
|
4169
4169
|
}
|
|
4170
|
-
.gdp-
|
|
4170
|
+
.gdp-dialog-actions {
|
|
4171
4171
|
display: flex;
|
|
4172
4172
|
justify-content: flex-end;
|
|
4173
4173
|
gap: 8px;
|
|
4174
4174
|
padding: 12px 16px;
|
|
4175
4175
|
border-top: 1px solid var(--border);
|
|
4176
4176
|
}
|
|
4177
|
-
.gdp-
|
|
4177
|
+
.gdp-dialog-danger {
|
|
4178
4178
|
border-color: var(--danger);
|
|
4179
4179
|
color: var(--danger);
|
|
4180
4180
|
}
|
|
4181
|
-
.gdp-
|
|
4181
|
+
.gdp-dialog-danger:hover {
|
|
4182
4182
|
background: var(--diff-del-bg);
|
|
4183
4183
|
}
|
|
4184
4184
|
.gdp-repo-empty {
|
|
@@ -4853,6 +4853,246 @@ body.query-history-panel-open #content {
|
|
|
4853
4853
|
flex: 1;
|
|
4854
4854
|
overflow-y: auto;
|
|
4855
4855
|
}
|
|
4856
|
+
/* JetBrains 風 bottom dock。「クエリ履歴 / ログ」のタブストリップは pane の
|
|
4857
|
+
開閉に関わらず常時表示し、画面下端に張り付く。タブクリックで pane を開閉
|
|
4858
|
+
する (アクティブタブ再クリックで閉じる)。右端の × でも閉じる。 */
|
|
4859
|
+
.db-history-dock {
|
|
4860
|
+
display: flex;
|
|
4861
|
+
align-items: stretch;
|
|
4862
|
+
gap: 0;
|
|
4863
|
+
min-height: 28px;
|
|
4864
|
+
border-top: 1px solid var(--border);
|
|
4865
|
+
background: var(--bg-soft);
|
|
4866
|
+
flex-shrink: 0;
|
|
4867
|
+
font-size: 12px;
|
|
4868
|
+
}
|
|
4869
|
+
.db-history-dock-tab {
|
|
4870
|
+
appearance: none;
|
|
4871
|
+
border: none;
|
|
4872
|
+
background: transparent;
|
|
4873
|
+
color: var(--fg-muted);
|
|
4874
|
+
font-family: inherit;
|
|
4875
|
+
font-size: inherit;
|
|
4876
|
+
padding: 0 14px;
|
|
4877
|
+
cursor: pointer;
|
|
4878
|
+
box-shadow: inset 0 2px 0 transparent;
|
|
4879
|
+
}
|
|
4880
|
+
.db-history-dock-tab:hover {
|
|
4881
|
+
background: var(--bg-mute);
|
|
4882
|
+
color: var(--fg);
|
|
4883
|
+
}
|
|
4884
|
+
/* active タブ: 上線 (accent) で「この pane を表示中」を示す。pane が閉じて
|
|
4885
|
+
いるときも「最後に開いていたタブ」がうっすら active のままだと混乱するので、
|
|
4886
|
+
dock.open が付いてるときだけ accent を強調する。 */
|
|
4887
|
+
.db-history-dock-tab.active {
|
|
4888
|
+
color: var(--fg);
|
|
4889
|
+
font-weight: 600;
|
|
4890
|
+
}
|
|
4891
|
+
.db-history-dock.open .db-history-dock-tab.active {
|
|
4892
|
+
color: var(--accent);
|
|
4893
|
+
box-shadow: inset 0 2px 0 var(--accent);
|
|
4894
|
+
}
|
|
4895
|
+
.db-history-dock-spacer {
|
|
4896
|
+
flex: 1;
|
|
4897
|
+
}
|
|
4898
|
+
.db-history-dock-close {
|
|
4899
|
+
appearance: none;
|
|
4900
|
+
border: none;
|
|
4901
|
+
background: transparent;
|
|
4902
|
+
color: var(--fg-muted);
|
|
4903
|
+
font-family: inherit;
|
|
4904
|
+
font-size: 14px;
|
|
4905
|
+
line-height: 1;
|
|
4906
|
+
padding: 0 10px;
|
|
4907
|
+
cursor: pointer;
|
|
4908
|
+
}
|
|
4909
|
+
.db-history-dock-close:hover {
|
|
4910
|
+
background: var(--bg-mute);
|
|
4911
|
+
color: var(--fg);
|
|
4912
|
+
}
|
|
4913
|
+
/* pane が閉じてるときは close ボタンも意味が無いので隠す。 */
|
|
4914
|
+
.db-history-dock:not(.open) .db-history-dock-close {
|
|
4915
|
+
visibility: hidden;
|
|
4916
|
+
}
|
|
4917
|
+
.db-history-pane-content {
|
|
4918
|
+
flex: 1;
|
|
4919
|
+
display: flex;
|
|
4920
|
+
flex-direction: column;
|
|
4921
|
+
overflow: hidden;
|
|
4922
|
+
}
|
|
4923
|
+
.db-history-pane-content[hidden] { display: none; }
|
|
4924
|
+
/* Session ログのレイアウト: クエリ履歴と同じ列構成。CSS は共通化せず、別系統
|
|
4925
|
+
として持つ (将来ストアやヘッダ構成が分岐しても影響を局所化できるように)。 */
|
|
4926
|
+
.db-session-log {
|
|
4927
|
+
height: 100%;
|
|
4928
|
+
display: flex;
|
|
4929
|
+
flex-direction: column;
|
|
4930
|
+
}
|
|
4931
|
+
.db-session-log-toolbar {
|
|
4932
|
+
display: flex;
|
|
4933
|
+
gap: 8px;
|
|
4934
|
+
padding: 8px 12px;
|
|
4935
|
+
border-bottom: 1px solid var(--border);
|
|
4936
|
+
}
|
|
4937
|
+
.db-session-log-action {
|
|
4938
|
+
padding: 4px 10px;
|
|
4939
|
+
border: 1px solid var(--border);
|
|
4940
|
+
border-radius: 4px;
|
|
4941
|
+
background: var(--bg);
|
|
4942
|
+
color: var(--fg);
|
|
4943
|
+
font-size: 12px;
|
|
4944
|
+
cursor: pointer;
|
|
4945
|
+
font-family: inherit;
|
|
4946
|
+
}
|
|
4947
|
+
.db-session-log-action:hover {
|
|
4948
|
+
background: var(--bg-mute);
|
|
4949
|
+
}
|
|
4950
|
+
/* 自動追従トグル ON 中の active 状態 (db-tool-btn.active と同じ accent 配色)。 */
|
|
4951
|
+
.db-session-log-action.active {
|
|
4952
|
+
background: color-mix(in srgb, var(--accent) 12%, var(--bg));
|
|
4953
|
+
color: var(--accent);
|
|
4954
|
+
border-color: var(--accent);
|
|
4955
|
+
font-weight: 600;
|
|
4956
|
+
}
|
|
4957
|
+
.db-session-log-danger {
|
|
4958
|
+
color: var(--danger, #d32f2f);
|
|
4959
|
+
}
|
|
4960
|
+
.db-session-log-body-split {
|
|
4961
|
+
flex: 1;
|
|
4962
|
+
display: flex;
|
|
4963
|
+
overflow: hidden;
|
|
4964
|
+
}
|
|
4965
|
+
.db-session-log-list-col {
|
|
4966
|
+
width: 360px;
|
|
4967
|
+
min-width: 260px;
|
|
4968
|
+
max-width: 500px;
|
|
4969
|
+
border-right: 1px solid var(--border);
|
|
4970
|
+
display: flex;
|
|
4971
|
+
flex-direction: column;
|
|
4972
|
+
overflow: hidden;
|
|
4973
|
+
}
|
|
4974
|
+
.db-session-log-detail-col {
|
|
4975
|
+
flex: 1;
|
|
4976
|
+
overflow-y: auto;
|
|
4977
|
+
padding: 12px;
|
|
4978
|
+
}
|
|
4979
|
+
.db-session-log-detail-placeholder,
|
|
4980
|
+
.db-session-log-empty {
|
|
4981
|
+
color: var(--fg-muted);
|
|
4982
|
+
text-align: center;
|
|
4983
|
+
padding: 40px 16px;
|
|
4984
|
+
font-size: 13px;
|
|
4985
|
+
}
|
|
4986
|
+
.db-session-log-detail-actions {
|
|
4987
|
+
display: flex;
|
|
4988
|
+
gap: 8px;
|
|
4989
|
+
margin-bottom: 12px;
|
|
4990
|
+
}
|
|
4991
|
+
.db-session-log-list {
|
|
4992
|
+
flex: 1;
|
|
4993
|
+
overflow-y: auto;
|
|
4994
|
+
}
|
|
4995
|
+
.db-session-log-entry {
|
|
4996
|
+
padding: 8px 12px;
|
|
4997
|
+
border-bottom: 1px solid var(--border);
|
|
4998
|
+
cursor: pointer;
|
|
4999
|
+
}
|
|
5000
|
+
.db-session-log-entry:hover {
|
|
5001
|
+
background: var(--bg-mute);
|
|
5002
|
+
}
|
|
5003
|
+
.db-session-log-entry.selected {
|
|
5004
|
+
background: color-mix(in srgb, var(--accent) 12%, var(--bg));
|
|
5005
|
+
border-left: 3px solid var(--accent);
|
|
5006
|
+
padding-left: 9px;
|
|
5007
|
+
}
|
|
5008
|
+
.db-session-log-entry-meta {
|
|
5009
|
+
display: flex;
|
|
5010
|
+
gap: 8px;
|
|
5011
|
+
align-items: center;
|
|
5012
|
+
font-size: 11px;
|
|
5013
|
+
color: var(--fg-muted);
|
|
5014
|
+
}
|
|
5015
|
+
.db-session-log-badge {
|
|
5016
|
+
font-weight: 600;
|
|
5017
|
+
font-size: 10px;
|
|
5018
|
+
padding: 1px 6px;
|
|
5019
|
+
border-radius: 999px;
|
|
5020
|
+
border: 1px solid transparent;
|
|
5021
|
+
}
|
|
5022
|
+
.db-session-log-badge-ok {
|
|
5023
|
+
background: rgba(46, 160, 67, 0.15);
|
|
5024
|
+
border-color: rgba(46, 160, 67, 0.4);
|
|
5025
|
+
color: var(--success, #2da44e);
|
|
5026
|
+
}
|
|
5027
|
+
.db-session-log-badge-error {
|
|
5028
|
+
background: rgba(207, 34, 46, 0.15);
|
|
5029
|
+
border-color: rgba(207, 34, 46, 0.4);
|
|
5030
|
+
color: var(--danger, #cf222e);
|
|
5031
|
+
}
|
|
5032
|
+
.db-session-log-kind {
|
|
5033
|
+
font-size: 10px;
|
|
5034
|
+
text-transform: uppercase;
|
|
5035
|
+
letter-spacing: 0.05em;
|
|
5036
|
+
color: var(--fg-subtle);
|
|
5037
|
+
}
|
|
5038
|
+
.db-session-log-time {
|
|
5039
|
+
font-size: 11px;
|
|
5040
|
+
}
|
|
5041
|
+
.db-session-log-stats {
|
|
5042
|
+
font-size: 11px;
|
|
5043
|
+
}
|
|
5044
|
+
.db-session-log-entry-title {
|
|
5045
|
+
margin-top: 4px;
|
|
5046
|
+
font-size: 12px;
|
|
5047
|
+
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
5048
|
+
white-space: nowrap;
|
|
5049
|
+
overflow: hidden;
|
|
5050
|
+
text-overflow: ellipsis;
|
|
5051
|
+
}
|
|
5052
|
+
.db-session-log-sql {
|
|
5053
|
+
padding: 8px;
|
|
5054
|
+
border-radius: 4px;
|
|
5055
|
+
background: var(--bg);
|
|
5056
|
+
border: 1px solid var(--border);
|
|
5057
|
+
font-size: 12px;
|
|
5058
|
+
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
5059
|
+
white-space: pre-wrap;
|
|
5060
|
+
word-break: break-word;
|
|
5061
|
+
margin-bottom: 8px;
|
|
5062
|
+
color: var(--fg);
|
|
5063
|
+
}
|
|
5064
|
+
/* shiki が `<span style="--shiki-light:#xxx;--shiki-dark:#yyy">` の inline
|
|
5065
|
+
CSS 変数で token ごとの色を出すので、light/dark 用にそれぞれ参照する。
|
|
5066
|
+
db-query-highlight と同じスキーム。 */
|
|
5067
|
+
.db-session-log-sql span[style] {
|
|
5068
|
+
color: var(--shiki-light);
|
|
5069
|
+
}
|
|
5070
|
+
@media (prefers-color-scheme: dark) {
|
|
5071
|
+
.db-session-log-sql span[style] {
|
|
5072
|
+
color: var(--shiki-dark);
|
|
5073
|
+
}
|
|
5074
|
+
}
|
|
5075
|
+
html[data-theme="dark"] .db-session-log-sql span[style] {
|
|
5076
|
+
color: var(--shiki-dark);
|
|
5077
|
+
}
|
|
5078
|
+
.db-session-log-message {
|
|
5079
|
+
padding: 8px;
|
|
5080
|
+
border-radius: 4px;
|
|
5081
|
+
font-size: 12px;
|
|
5082
|
+
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
5083
|
+
white-space: pre-wrap;
|
|
5084
|
+
word-break: break-word;
|
|
5085
|
+
}
|
|
5086
|
+
.db-session-log-message-error {
|
|
5087
|
+
background: rgba(207, 34, 46, 0.08);
|
|
5088
|
+
border: 1px solid rgba(207, 34, 46, 0.4);
|
|
5089
|
+
color: var(--danger, #cf222e);
|
|
5090
|
+
}
|
|
5091
|
+
.db-session-log-message-ok {
|
|
5092
|
+
background: var(--bg-soft);
|
|
5093
|
+
border: 1px solid var(--border);
|
|
5094
|
+
color: var(--fg-muted);
|
|
5095
|
+
}
|
|
4856
5096
|
.db-query-history {
|
|
4857
5097
|
height: 100%;
|
|
4858
5098
|
display: flex;
|
|
@@ -5723,31 +5963,6 @@ body[data-sidebar-font-size="xlarge"] .db-container {
|
|
|
5723
5963
|
border-color: var(--accent);
|
|
5724
5964
|
font-weight: 600;
|
|
5725
5965
|
}
|
|
5726
|
-
.db-history-toggle {
|
|
5727
|
-
display: flex;
|
|
5728
|
-
align-items: center;
|
|
5729
|
-
gap: 6px;
|
|
5730
|
-
width: 100%;
|
|
5731
|
-
padding: 8px 12px;
|
|
5732
|
-
border: none;
|
|
5733
|
-
border-top: 1px solid var(--border);
|
|
5734
|
-
background: var(--bg-soft);
|
|
5735
|
-
color: var(--fg-muted);
|
|
5736
|
-
font-size: var(--db-font-base);
|
|
5737
|
-
font-family: inherit;
|
|
5738
|
-
cursor: pointer;
|
|
5739
|
-
text-align: left;
|
|
5740
|
-
flex-shrink: 0;
|
|
5741
|
-
}
|
|
5742
|
-
.db-history-toggle:hover {
|
|
5743
|
-
background: var(--bg-mute);
|
|
5744
|
-
color: var(--fg);
|
|
5745
|
-
}
|
|
5746
|
-
.db-history-toggle.active {
|
|
5747
|
-
color: var(--accent);
|
|
5748
|
-
font-weight: 600;
|
|
5749
|
-
}
|
|
5750
|
-
|
|
5751
5966
|
/* ---------- [hidden] 属性を効かせる ---------- */
|
|
5752
5967
|
/* `.db-*` クラスの多くが `display: flex` を主張しており、ブラウザ標準の
|
|
5753
5968
|
`[hidden] { display: none }` (specificity 0,1,0) と CSS specificity が
|
|
@@ -5755,7 +5970,7 @@ body[data-sidebar-font-size="xlarge"] .db-container {
|
|
|
5755
5970
|
.db-tools-section[hidden],
|
|
5756
5971
|
.db-tool-btn[hidden],
|
|
5757
5972
|
.db-tab-bar[hidden],
|
|
5758
|
-
.db-history-
|
|
5973
|
+
.db-history-dock[hidden],
|
|
5759
5974
|
.db-history-pane[hidden],
|
|
5760
5975
|
.db-history-resizer[hidden],
|
|
5761
5976
|
.db-table-list[hidden],
|
|
@@ -6317,6 +6532,122 @@ body[data-sidebar-font-size="xlarge"] .db-container {
|
|
|
6317
6532
|
flex-shrink: 0;
|
|
6318
6533
|
}
|
|
6319
6534
|
|
|
6535
|
+
/* ---------- Row editing (edit / insert / delete) ---------- */
|
|
6536
|
+
.db-grid-edit-controls {
|
|
6537
|
+
display: flex;
|
|
6538
|
+
align-items: center;
|
|
6539
|
+
gap: 6px;
|
|
6540
|
+
flex-shrink: 0;
|
|
6541
|
+
}
|
|
6542
|
+
/* 編集モードがオンのトグルは accent で塗る (.controls > button.active と同系統)。 */
|
|
6543
|
+
.db-grid-edit-toggle.active {
|
|
6544
|
+
background: var(--accent);
|
|
6545
|
+
border-color: var(--accent);
|
|
6546
|
+
color: #fff;
|
|
6547
|
+
}
|
|
6548
|
+
.db-grid-edit-status {
|
|
6549
|
+
font-size: var(--db-font-sm);
|
|
6550
|
+
color: var(--fg-muted);
|
|
6551
|
+
white-space: nowrap;
|
|
6552
|
+
}
|
|
6553
|
+
|
|
6554
|
+
/* 編集セルは入力欄を全幅で内包する。 */
|
|
6555
|
+
.db-grid-cell-edit {
|
|
6556
|
+
padding: 0;
|
|
6557
|
+
position: relative;
|
|
6558
|
+
}
|
|
6559
|
+
/* 編集モードでも既定は read-only と同じ見た目の表示モード。
|
|
6560
|
+
ダブルクリックで input になることを薄い枠で示す。 */
|
|
6561
|
+
.db-grid-cell-edit.db-grid-cell-display {
|
|
6562
|
+
padding: 4px 8px;
|
|
6563
|
+
white-space: nowrap;
|
|
6564
|
+
overflow: hidden;
|
|
6565
|
+
text-overflow: ellipsis;
|
|
6566
|
+
}
|
|
6567
|
+
.db-grid-cell-edit.db-grid-cell-display:not(.readonly):hover {
|
|
6568
|
+
outline: 1px dashed var(--border);
|
|
6569
|
+
outline-offset: -2px;
|
|
6570
|
+
}
|
|
6571
|
+
.db-grid-cell-edit.db-grid-cell-display.readonly {
|
|
6572
|
+
color: var(--fg-subtle);
|
|
6573
|
+
background: rgba(128, 128, 128, 0.06);
|
|
6574
|
+
}
|
|
6575
|
+
/* NULL 状態の入力欄は placeholder "NULL" を斜体・淡色で示す。 */
|
|
6576
|
+
.db-grid-cell-input.is-null::placeholder {
|
|
6577
|
+
color: var(--fg-subtle);
|
|
6578
|
+
font-style: italic;
|
|
6579
|
+
opacity: 1;
|
|
6580
|
+
}
|
|
6581
|
+
/* セル右端の「NULL にする」ボタン。ホバー時のみ目立たせる。 */
|
|
6582
|
+
.db-grid-cell-null-btn {
|
|
6583
|
+
position: absolute;
|
|
6584
|
+
top: 50%;
|
|
6585
|
+
right: 2px;
|
|
6586
|
+
transform: translateY(-50%);
|
|
6587
|
+
border: none;
|
|
6588
|
+
background: transparent;
|
|
6589
|
+
color: var(--fg-subtle);
|
|
6590
|
+
cursor: pointer;
|
|
6591
|
+
font-size: 12px;
|
|
6592
|
+
line-height: 1;
|
|
6593
|
+
padding: 2px 4px;
|
|
6594
|
+
border-radius: 3px;
|
|
6595
|
+
}
|
|
6596
|
+
.db-grid-cell-null-btn:hover {
|
|
6597
|
+
color: var(--fg);
|
|
6598
|
+
background: var(--bg-soft);
|
|
6599
|
+
}
|
|
6600
|
+
.db-grid-cell-input {
|
|
6601
|
+
width: 100%;
|
|
6602
|
+
height: 100%;
|
|
6603
|
+
box-sizing: border-box;
|
|
6604
|
+
border: none;
|
|
6605
|
+
background: transparent;
|
|
6606
|
+
color: var(--fg);
|
|
6607
|
+
font: inherit;
|
|
6608
|
+
padding: 4px 8px;
|
|
6609
|
+
}
|
|
6610
|
+
.db-grid-cell-input:focus {
|
|
6611
|
+
outline: 2px solid var(--accent);
|
|
6612
|
+
outline-offset: -2px;
|
|
6613
|
+
background: var(--bg);
|
|
6614
|
+
}
|
|
6615
|
+
.db-grid-cell-input.readonly {
|
|
6616
|
+
color: var(--fg-subtle);
|
|
6617
|
+
background: rgba(128, 128, 128, 0.06);
|
|
6618
|
+
}
|
|
6619
|
+
|
|
6620
|
+
/* 削除マーク済みの行は取り消し線+赤系で示す。 */
|
|
6621
|
+
.db-grid-row-deleted {
|
|
6622
|
+
background: rgba(207, 34, 46, 0.08);
|
|
6623
|
+
text-decoration: line-through;
|
|
6624
|
+
opacity: 0.7;
|
|
6625
|
+
}
|
|
6626
|
+
/* 新規行ドラフトは accent 系で「未保存」を示す。 */
|
|
6627
|
+
.db-grid-row-draft {
|
|
6628
|
+
background: var(--accent-subtle);
|
|
6629
|
+
}
|
|
6630
|
+
/* 値を編集 (未コミット) した行は黄系の薄背景。delete マークが優先するため
|
|
6631
|
+
:not で除外。draft 行とも干渉しないよう個別 selector で十分。 */
|
|
6632
|
+
.db-grid-row-edited:not(.db-grid-row-deleted) {
|
|
6633
|
+
background: rgba(210, 153, 34, 0.10);
|
|
6634
|
+
}
|
|
6635
|
+
/* 編集したセル単体は同系のやや濃い背景 + 左端に縦バーで「ここを変更」と
|
|
6636
|
+
示す。display モードと input モードの両方で適用する。 */
|
|
6637
|
+
.db-grid-cell-edited {
|
|
6638
|
+
background: rgba(210, 153, 34, 0.22);
|
|
6639
|
+
box-shadow: inset 2px 0 0 var(--attn);
|
|
6640
|
+
}
|
|
6641
|
+
.db-grid-rownum-deletable:hover {
|
|
6642
|
+
color: var(--danger);
|
|
6643
|
+
background: rgba(207, 34, 46, 0.12);
|
|
6644
|
+
}
|
|
6645
|
+
.db-grid-rownum-draft {
|
|
6646
|
+
color: var(--accent);
|
|
6647
|
+
font-weight: 600;
|
|
6648
|
+
text-align: center;
|
|
6649
|
+
}
|
|
6650
|
+
|
|
6320
6651
|
/* ---------- Query Editor ---------- */
|
|
6321
6652
|
.db-query-editor {
|
|
6322
6653
|
flex: 1;
|
|
@@ -6528,6 +6859,17 @@ html[data-theme="dark"] .db-query-highlight span[style] {
|
|
|
6528
6859
|
.db-schema-table tr.pk-row {
|
|
6529
6860
|
background: var(--attention-subtle, #fff8c5);
|
|
6530
6861
|
}
|
|
6862
|
+
/* ダークモードでは淡黄色だと白文字とのコントラストがきつく目が痛い。
|
|
6863
|
+
accent を低彩度の背景タイルとして敷く (db-tool-btn.active と同じ
|
|
6864
|
+
color-mix スキーム)。 */
|
|
6865
|
+
@media (prefers-color-scheme: dark) {
|
|
6866
|
+
.db-schema-table tr.pk-row {
|
|
6867
|
+
background: color-mix(in srgb, var(--accent) 18%, transparent);
|
|
6868
|
+
}
|
|
6869
|
+
}
|
|
6870
|
+
html[data-theme="dark"] .db-schema-table tr.pk-row {
|
|
6871
|
+
background: color-mix(in srgb, var(--accent) 18%, transparent);
|
|
6872
|
+
}
|
|
6531
6873
|
|
|
6532
6874
|
.db-schema-col-name {
|
|
6533
6875
|
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
@@ -8075,6 +8417,58 @@ body.db-resizing {
|
|
|
8075
8417
|
text-overflow: ellipsis;
|
|
8076
8418
|
white-space: nowrap;
|
|
8077
8419
|
}
|
|
8420
|
+
/* 値編集アクション (Edit / Delete) はヘッダ右端に寄せる。 */
|
|
8421
|
+
.redis-value-actions {
|
|
8422
|
+
margin-left: auto;
|
|
8423
|
+
display: flex;
|
|
8424
|
+
gap: 6px;
|
|
8425
|
+
flex-shrink: 0;
|
|
8426
|
+
}
|
|
8427
|
+
/* キーリストヘッダ: タイトル + 新規キーボタン。 */
|
|
8428
|
+
.redis-key-list-header {
|
|
8429
|
+
display: flex;
|
|
8430
|
+
align-items: center;
|
|
8431
|
+
justify-content: space-between;
|
|
8432
|
+
gap: 8px;
|
|
8433
|
+
}
|
|
8434
|
+
/* 値編集 / 新規キーフォーム。 */
|
|
8435
|
+
.redis-value-edit-bar {
|
|
8436
|
+
display: flex;
|
|
8437
|
+
align-items: center;
|
|
8438
|
+
gap: 6px;
|
|
8439
|
+
margin-bottom: 6px;
|
|
8440
|
+
}
|
|
8441
|
+
.redis-value-edit-status {
|
|
8442
|
+
font-size: var(--db-font-sm);
|
|
8443
|
+
color: var(--fg-muted);
|
|
8444
|
+
}
|
|
8445
|
+
.redis-value-edit-textarea,
|
|
8446
|
+
.redis-new-key-value {
|
|
8447
|
+
width: 100%;
|
|
8448
|
+
min-height: 160px;
|
|
8449
|
+
box-sizing: border-box;
|
|
8450
|
+
font-family: var(--mono, monospace);
|
|
8451
|
+
font-size: var(--db-font-mono);
|
|
8452
|
+
padding: 8px;
|
|
8453
|
+
border: 1px solid var(--border);
|
|
8454
|
+
border-radius: 4px;
|
|
8455
|
+
background: var(--bg);
|
|
8456
|
+
color: var(--fg);
|
|
8457
|
+
resize: vertical;
|
|
8458
|
+
}
|
|
8459
|
+
.redis-new-key-form {
|
|
8460
|
+
display: flex;
|
|
8461
|
+
flex-direction: column;
|
|
8462
|
+
gap: 8px;
|
|
8463
|
+
}
|
|
8464
|
+
.redis-new-key-name {
|
|
8465
|
+
padding: 6px 8px;
|
|
8466
|
+
border: 1px solid var(--border);
|
|
8467
|
+
border-radius: 4px;
|
|
8468
|
+
background: var(--bg);
|
|
8469
|
+
color: var(--fg);
|
|
8470
|
+
font-family: var(--mono, monospace);
|
|
8471
|
+
}
|
|
8078
8472
|
.redis-value-body {
|
|
8079
8473
|
flex: 1;
|
|
8080
8474
|
overflow: auto;
|
|
@@ -8387,6 +8781,9 @@ body.db-resizing {
|
|
|
8387
8781
|
}
|
|
8388
8782
|
.es-mapping-header,
|
|
8389
8783
|
.es-doc-detail-header {
|
|
8784
|
+
display: flex;
|
|
8785
|
+
align-items: center;
|
|
8786
|
+
gap: 8px;
|
|
8390
8787
|
font-family: var(--mono, monospace);
|
|
8391
8788
|
font-size: var(--db-font-mono);
|
|
8392
8789
|
font-weight: 600;
|
|
@@ -8394,6 +8791,54 @@ body.db-resizing {
|
|
|
8394
8791
|
border-bottom: 1px solid var(--border);
|
|
8395
8792
|
margin-bottom: 8px;
|
|
8396
8793
|
}
|
|
8794
|
+
.es-doc-actions {
|
|
8795
|
+
margin-left: auto;
|
|
8796
|
+
display: flex;
|
|
8797
|
+
gap: 6px;
|
|
8798
|
+
flex-shrink: 0;
|
|
8799
|
+
}
|
|
8800
|
+
.es-doc-list-header {
|
|
8801
|
+
display: flex;
|
|
8802
|
+
align-items: center;
|
|
8803
|
+
justify-content: space-between;
|
|
8804
|
+
gap: 8px;
|
|
8805
|
+
}
|
|
8806
|
+
.es-doc-edit-bar {
|
|
8807
|
+
display: flex;
|
|
8808
|
+
align-items: center;
|
|
8809
|
+
gap: 6px;
|
|
8810
|
+
margin-bottom: 6px;
|
|
8811
|
+
}
|
|
8812
|
+
.es-doc-edit-status {
|
|
8813
|
+
font-size: var(--db-font-sm);
|
|
8814
|
+
color: var(--fg-muted);
|
|
8815
|
+
}
|
|
8816
|
+
.es-doc-edit-textarea {
|
|
8817
|
+
width: 100%;
|
|
8818
|
+
min-height: 280px;
|
|
8819
|
+
box-sizing: border-box;
|
|
8820
|
+
font-family: var(--mono, monospace);
|
|
8821
|
+
font-size: var(--db-font-mono);
|
|
8822
|
+
padding: 8px;
|
|
8823
|
+
border: 1px solid var(--border);
|
|
8824
|
+
border-radius: 4px;
|
|
8825
|
+
background: var(--bg);
|
|
8826
|
+
color: var(--fg);
|
|
8827
|
+
resize: vertical;
|
|
8828
|
+
}
|
|
8829
|
+
.es-new-doc-form {
|
|
8830
|
+
display: flex;
|
|
8831
|
+
flex-direction: column;
|
|
8832
|
+
gap: 8px;
|
|
8833
|
+
}
|
|
8834
|
+
.es-new-doc-id {
|
|
8835
|
+
padding: 6px 8px;
|
|
8836
|
+
border: 1px solid var(--border);
|
|
8837
|
+
border-radius: 4px;
|
|
8838
|
+
background: var(--bg);
|
|
8839
|
+
color: var(--fg);
|
|
8840
|
+
font-family: var(--mono, monospace);
|
|
8841
|
+
}
|
|
8397
8842
|
.es-doc-detail-meta {
|
|
8398
8843
|
font-family: var(--mono, monospace);
|
|
8399
8844
|
font-size: var(--db-font-sm);
|
|
@@ -8903,6 +9348,45 @@ body.db-resizing {
|
|
|
8903
9348
|
display: flex;
|
|
8904
9349
|
align-items: center;
|
|
8905
9350
|
gap: 6px;
|
|
9351
|
+
flex-wrap: wrap;
|
|
9352
|
+
}
|
|
9353
|
+
/* オブジェクト編集 / 新規作成フォーム。 */
|
|
9354
|
+
.s3-edit-bar {
|
|
9355
|
+
display: flex;
|
|
9356
|
+
align-items: center;
|
|
9357
|
+
gap: 6px;
|
|
9358
|
+
margin-bottom: 6px;
|
|
9359
|
+
}
|
|
9360
|
+
.s3-edit-status {
|
|
9361
|
+
font-size: var(--db-font-sm);
|
|
9362
|
+
color: var(--fg-muted);
|
|
9363
|
+
}
|
|
9364
|
+
.s3-edit-textarea {
|
|
9365
|
+
width: 100%;
|
|
9366
|
+
min-height: 280px;
|
|
9367
|
+
box-sizing: border-box;
|
|
9368
|
+
font-family: var(--mono, monospace);
|
|
9369
|
+
font-size: var(--db-font-mono);
|
|
9370
|
+
padding: 8px;
|
|
9371
|
+
border: 1px solid var(--border);
|
|
9372
|
+
border-radius: 4px;
|
|
9373
|
+
background: var(--bg);
|
|
9374
|
+
color: var(--fg);
|
|
9375
|
+
resize: vertical;
|
|
9376
|
+
}
|
|
9377
|
+
.s3-new-object-form {
|
|
9378
|
+
display: flex;
|
|
9379
|
+
flex-direction: column;
|
|
9380
|
+
gap: 8px;
|
|
9381
|
+
padding: 12px;
|
|
9382
|
+
}
|
|
9383
|
+
.s3-new-object-key {
|
|
9384
|
+
padding: 6px 8px;
|
|
9385
|
+
border: 1px solid var(--border);
|
|
9386
|
+
border-radius: 4px;
|
|
9387
|
+
background: var(--bg);
|
|
9388
|
+
color: var(--fg);
|
|
9389
|
+
font-family: var(--mono, monospace);
|
|
8906
9390
|
}
|
|
8907
9391
|
.s3-preview-body {
|
|
8908
9392
|
flex: 1;
|