kumiki 0.1.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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +256 -0
- data/lib/kumiki/animation/animated_state.rb +83 -0
- data/lib/kumiki/animation/easing.rb +62 -0
- data/lib/kumiki/animation/value_tween.rb +69 -0
- data/lib/kumiki/app.rb +381 -0
- data/lib/kumiki/box.rb +40 -0
- data/lib/kumiki/chart/area_chart.rb +308 -0
- data/lib/kumiki/chart/bar_chart.rb +291 -0
- data/lib/kumiki/chart/base_chart.rb +213 -0
- data/lib/kumiki/chart/chart_helpers.rb +74 -0
- data/lib/kumiki/chart/gauge_chart.rb +174 -0
- data/lib/kumiki/chart/heatmap_chart.rb +223 -0
- data/lib/kumiki/chart/line_chart.rb +292 -0
- data/lib/kumiki/chart/pie_chart.rb +222 -0
- data/lib/kumiki/chart/scales.rb +79 -0
- data/lib/kumiki/chart/scatter_chart.rb +306 -0
- data/lib/kumiki/chart/stacked_bar_chart.rb +279 -0
- data/lib/kumiki/column.rb +351 -0
- data/lib/kumiki/core.rb +2511 -0
- data/lib/kumiki/dsl.rb +408 -0
- data/lib/kumiki/frame_ranma.rb +570 -0
- data/lib/kumiki/markdown/ast.rb +127 -0
- data/lib/kumiki/markdown/mermaid/layout.rb +389 -0
- data/lib/kumiki/markdown/mermaid/models.rb +235 -0
- data/lib/kumiki/markdown/mermaid/parser.rb +522 -0
- data/lib/kumiki/markdown/mermaid/renderer.rb +339 -0
- data/lib/kumiki/markdown/parser.rb +808 -0
- data/lib/kumiki/markdown/renderer.rb +642 -0
- data/lib/kumiki/markdown/theme.rb +168 -0
- data/lib/kumiki/render_node.rb +262 -0
- data/lib/kumiki/row.rb +288 -0
- data/lib/kumiki/spacer.rb +20 -0
- data/lib/kumiki/style.rb +799 -0
- data/lib/kumiki/theme.rb +567 -0
- data/lib/kumiki/themes/material.rb +40 -0
- data/lib/kumiki/themes/tokyo_night.rb +11 -0
- data/lib/kumiki/version.rb +5 -0
- data/lib/kumiki/widgets/button.rb +105 -0
- data/lib/kumiki/widgets/calendar.rb +1028 -0
- data/lib/kumiki/widgets/checkbox.rb +119 -0
- data/lib/kumiki/widgets/container.rb +111 -0
- data/lib/kumiki/widgets/data_table.rb +670 -0
- data/lib/kumiki/widgets/divider.rb +31 -0
- data/lib/kumiki/widgets/image.rb +105 -0
- data/lib/kumiki/widgets/input.rb +485 -0
- data/lib/kumiki/widgets/markdown.rb +58 -0
- data/lib/kumiki/widgets/modal.rb +165 -0
- data/lib/kumiki/widgets/multiline_input.rb +970 -0
- data/lib/kumiki/widgets/multiline_text.rb +180 -0
- data/lib/kumiki/widgets/net_image.rb +100 -0
- data/lib/kumiki/widgets/progress_bar.rb +72 -0
- data/lib/kumiki/widgets/radio_buttons.rb +93 -0
- data/lib/kumiki/widgets/slider.rb +135 -0
- data/lib/kumiki/widgets/switch.rb +84 -0
- data/lib/kumiki/widgets/tabs.rb +175 -0
- data/lib/kumiki/widgets/text.rb +120 -0
- data/lib/kumiki/widgets/tree.rb +434 -0
- data/lib/kumiki/widgets/webview.rb +87 -0
- data/lib/kumiki.rb +130 -0
- metadata +113 -0
data/lib/kumiki/theme.rb
ADDED
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
module Kumiki
|
|
2
|
+
# rbs_inline: enabled
|
|
3
|
+
|
|
4
|
+
# Theme system - design tokens for consistent styling
|
|
5
|
+
#
|
|
6
|
+
# Kind constants for semantic widget styling
|
|
7
|
+
KIND_NORMAL = 0
|
|
8
|
+
KIND_INFO = 1
|
|
9
|
+
KIND_SUCCESS = 2
|
|
10
|
+
KIND_WARNING = 3
|
|
11
|
+
KIND_DANGER = 4
|
|
12
|
+
|
|
13
|
+
class Theme
|
|
14
|
+
def initialize
|
|
15
|
+
# Tokyo Night defaults
|
|
16
|
+
@bg_canvas = 0xFF1A1B26
|
|
17
|
+
@bg_primary = 0xFF24283B
|
|
18
|
+
@bg_secondary = 0xFF414868
|
|
19
|
+
@bg_overlay = 0xFF1A1B26
|
|
20
|
+
@text_primary = 0xFFC0CAF5
|
|
21
|
+
@text_secondary = 0xFF565F89
|
|
22
|
+
@accent = 0xFF7AA2F7
|
|
23
|
+
@info = 0xFF7AA2F7
|
|
24
|
+
@error = 0xFFF7768E
|
|
25
|
+
@success = 0xFF9ECE6A
|
|
26
|
+
@warning = 0xFFE0AF68
|
|
27
|
+
@border = 0xFF414868
|
|
28
|
+
@border_focus = 0xFF7AA2F7
|
|
29
|
+
@font_family = "default"
|
|
30
|
+
@font_size_sm = 12.0
|
|
31
|
+
@font_size_md = 14.0
|
|
32
|
+
@font_size_lg = 18.0
|
|
33
|
+
@font_size_xl = 24.0
|
|
34
|
+
@spacing_xs = 4.0
|
|
35
|
+
@spacing_sm = 8.0
|
|
36
|
+
@spacing_md = 12.0
|
|
37
|
+
@spacing_lg = 16.0
|
|
38
|
+
@border_radius = 4.0
|
|
39
|
+
|
|
40
|
+
# Kind-specific background colors
|
|
41
|
+
@bg_info = 0xFF7AA2F7
|
|
42
|
+
@bg_success = 0xFF9ECE6A
|
|
43
|
+
@bg_warning = 0xFFE0AF68
|
|
44
|
+
@bg_danger = 0xFFF7768E
|
|
45
|
+
|
|
46
|
+
# Kind-specific text colors (text on colored bg)
|
|
47
|
+
@text_on_info = 0xFF1A1B26
|
|
48
|
+
@text_on_success = 0xFF1A1B26
|
|
49
|
+
@text_on_warning = 0xFF1A1B26
|
|
50
|
+
@text_on_danger = 0xFF1A1B26
|
|
51
|
+
|
|
52
|
+
# Kind-specific hover colors
|
|
53
|
+
@hover_normal = 0xFF89B4FA
|
|
54
|
+
@hover_info = 0xFF89B4FA
|
|
55
|
+
@hover_success = 0xFFB9F27C
|
|
56
|
+
@hover_warning = 0xFFFFD280
|
|
57
|
+
@hover_danger = 0xFFFF9E9E
|
|
58
|
+
|
|
59
|
+
# Scrollbar colors
|
|
60
|
+
@scrollbar_bg = 0xFF2A2D3D
|
|
61
|
+
@scrollbar_fg = 0xFF565F89
|
|
62
|
+
|
|
63
|
+
# Selection highlight (50% alpha blue)
|
|
64
|
+
@bg_selected = 0x807AA2F7
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# --- Background colors ---
|
|
68
|
+
#: () -> Integer
|
|
69
|
+
def bg_canvas
|
|
70
|
+
@bg_canvas
|
|
71
|
+
end
|
|
72
|
+
#: (Integer v) -> Integer
|
|
73
|
+
def bg_canvas=(v)
|
|
74
|
+
@bg_canvas = v
|
|
75
|
+
end
|
|
76
|
+
#: () -> Integer
|
|
77
|
+
def bg_primary
|
|
78
|
+
@bg_primary
|
|
79
|
+
end
|
|
80
|
+
#: (Integer v) -> Integer
|
|
81
|
+
def bg_primary=(v)
|
|
82
|
+
@bg_primary = v
|
|
83
|
+
end
|
|
84
|
+
#: () -> Integer
|
|
85
|
+
def bg_secondary
|
|
86
|
+
@bg_secondary
|
|
87
|
+
end
|
|
88
|
+
#: (Integer v) -> Integer
|
|
89
|
+
def bg_secondary=(v)
|
|
90
|
+
@bg_secondary = v
|
|
91
|
+
end
|
|
92
|
+
#: () -> Integer
|
|
93
|
+
def bg_overlay
|
|
94
|
+
@bg_overlay
|
|
95
|
+
end
|
|
96
|
+
#: (Integer v) -> Integer
|
|
97
|
+
def bg_overlay=(v)
|
|
98
|
+
@bg_overlay = v
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# --- Text colors ---
|
|
102
|
+
#: () -> Integer
|
|
103
|
+
def text_primary
|
|
104
|
+
@text_primary
|
|
105
|
+
end
|
|
106
|
+
#: (Integer v) -> Integer
|
|
107
|
+
def text_primary=(v)
|
|
108
|
+
@text_primary = v
|
|
109
|
+
end
|
|
110
|
+
#: () -> Integer
|
|
111
|
+
def text_secondary
|
|
112
|
+
@text_secondary
|
|
113
|
+
end
|
|
114
|
+
#: (Integer v) -> Integer
|
|
115
|
+
def text_secondary=(v)
|
|
116
|
+
@text_secondary = v
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# --- Semantic colors ---
|
|
120
|
+
#: () -> Integer
|
|
121
|
+
def accent
|
|
122
|
+
@accent
|
|
123
|
+
end
|
|
124
|
+
#: (Integer v) -> Integer
|
|
125
|
+
def accent=(v)
|
|
126
|
+
@accent = v
|
|
127
|
+
end
|
|
128
|
+
#: () -> Integer
|
|
129
|
+
def info
|
|
130
|
+
@info
|
|
131
|
+
end
|
|
132
|
+
#: (Integer v) -> Integer
|
|
133
|
+
def info=(v)
|
|
134
|
+
@info = v
|
|
135
|
+
end
|
|
136
|
+
#: () -> Integer
|
|
137
|
+
def error
|
|
138
|
+
@error
|
|
139
|
+
end
|
|
140
|
+
#: (Integer v) -> Integer
|
|
141
|
+
def error=(v)
|
|
142
|
+
@error = v
|
|
143
|
+
end
|
|
144
|
+
#: () -> Integer
|
|
145
|
+
def success
|
|
146
|
+
@success
|
|
147
|
+
end
|
|
148
|
+
#: (Integer v) -> Integer
|
|
149
|
+
def success=(v)
|
|
150
|
+
@success = v
|
|
151
|
+
end
|
|
152
|
+
#: () -> Integer
|
|
153
|
+
def warning
|
|
154
|
+
@warning
|
|
155
|
+
end
|
|
156
|
+
#: (Integer v) -> Integer
|
|
157
|
+
def warning=(v)
|
|
158
|
+
@warning = v
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# --- Border ---
|
|
162
|
+
#: () -> Integer
|
|
163
|
+
def border
|
|
164
|
+
@border
|
|
165
|
+
end
|
|
166
|
+
#: (Integer v) -> Integer
|
|
167
|
+
def border=(v)
|
|
168
|
+
@border = v
|
|
169
|
+
end
|
|
170
|
+
#: () -> Integer
|
|
171
|
+
def border_focus
|
|
172
|
+
@border_focus
|
|
173
|
+
end
|
|
174
|
+
#: (Integer v) -> Integer
|
|
175
|
+
def border_focus=(v)
|
|
176
|
+
@border_focus = v
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# --- Typography ---
|
|
180
|
+
#: () -> String
|
|
181
|
+
def font_family
|
|
182
|
+
@font_family
|
|
183
|
+
end
|
|
184
|
+
#: (String v) -> String
|
|
185
|
+
def font_family=(v)
|
|
186
|
+
@font_family = v
|
|
187
|
+
end
|
|
188
|
+
#: () -> Float
|
|
189
|
+
def font_size_sm
|
|
190
|
+
@font_size_sm
|
|
191
|
+
end
|
|
192
|
+
#: () -> Float
|
|
193
|
+
def font_size_md
|
|
194
|
+
@font_size_md
|
|
195
|
+
end
|
|
196
|
+
#: () -> Float
|
|
197
|
+
def font_size_lg
|
|
198
|
+
@font_size_lg
|
|
199
|
+
end
|
|
200
|
+
#: () -> Float
|
|
201
|
+
def font_size_xl
|
|
202
|
+
@font_size_xl
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# --- Spacing ---
|
|
206
|
+
#: () -> Float
|
|
207
|
+
def spacing_xs
|
|
208
|
+
@spacing_xs
|
|
209
|
+
end
|
|
210
|
+
#: () -> Float
|
|
211
|
+
def spacing_sm
|
|
212
|
+
@spacing_sm
|
|
213
|
+
end
|
|
214
|
+
#: () -> Float
|
|
215
|
+
def spacing_md
|
|
216
|
+
@spacing_md
|
|
217
|
+
end
|
|
218
|
+
#: () -> Float
|
|
219
|
+
def spacing_lg
|
|
220
|
+
@spacing_lg
|
|
221
|
+
end
|
|
222
|
+
#: () -> Float
|
|
223
|
+
def border_radius
|
|
224
|
+
@border_radius
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# --- Scrollbar ---
|
|
228
|
+
#: () -> Integer
|
|
229
|
+
def scrollbar_bg
|
|
230
|
+
@scrollbar_bg
|
|
231
|
+
end
|
|
232
|
+
#: (Integer v) -> Integer
|
|
233
|
+
def scrollbar_bg=(v)
|
|
234
|
+
@scrollbar_bg = v
|
|
235
|
+
end
|
|
236
|
+
#: () -> Integer
|
|
237
|
+
def scrollbar_fg
|
|
238
|
+
@scrollbar_fg
|
|
239
|
+
end
|
|
240
|
+
#: (Integer v) -> Integer
|
|
241
|
+
def scrollbar_fg=(v)
|
|
242
|
+
@scrollbar_fg = v
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
# --- Selection ---
|
|
246
|
+
#: () -> Integer
|
|
247
|
+
def bg_selected
|
|
248
|
+
@bg_selected
|
|
249
|
+
end
|
|
250
|
+
#: (Integer v) -> Integer
|
|
251
|
+
def bg_selected=(v)
|
|
252
|
+
@bg_selected = v
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# --- Kind backgrounds ---
|
|
256
|
+
#: () -> Integer
|
|
257
|
+
def bg_info
|
|
258
|
+
@bg_info
|
|
259
|
+
end
|
|
260
|
+
#: (Integer v) -> Integer
|
|
261
|
+
def bg_info=(v)
|
|
262
|
+
@bg_info = v
|
|
263
|
+
end
|
|
264
|
+
#: () -> Integer
|
|
265
|
+
def bg_success
|
|
266
|
+
@bg_success
|
|
267
|
+
end
|
|
268
|
+
#: (Integer v) -> Integer
|
|
269
|
+
def bg_success=(v)
|
|
270
|
+
@bg_success = v
|
|
271
|
+
end
|
|
272
|
+
#: () -> Integer
|
|
273
|
+
def bg_warning
|
|
274
|
+
@bg_warning
|
|
275
|
+
end
|
|
276
|
+
#: (Integer v) -> Integer
|
|
277
|
+
def bg_warning=(v)
|
|
278
|
+
@bg_warning = v
|
|
279
|
+
end
|
|
280
|
+
#: () -> Integer
|
|
281
|
+
def bg_danger
|
|
282
|
+
@bg_danger
|
|
283
|
+
end
|
|
284
|
+
#: (Integer v) -> Integer
|
|
285
|
+
def bg_danger=(v)
|
|
286
|
+
@bg_danger = v
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# --- Kind text on bg ---
|
|
290
|
+
#: () -> Integer
|
|
291
|
+
def text_on_info
|
|
292
|
+
@text_on_info
|
|
293
|
+
end
|
|
294
|
+
#: (Integer v) -> Integer
|
|
295
|
+
def text_on_info=(v)
|
|
296
|
+
@text_on_info = v
|
|
297
|
+
end
|
|
298
|
+
#: () -> Integer
|
|
299
|
+
def text_on_success
|
|
300
|
+
@text_on_success
|
|
301
|
+
end
|
|
302
|
+
#: (Integer v) -> Integer
|
|
303
|
+
def text_on_success=(v)
|
|
304
|
+
@text_on_success = v
|
|
305
|
+
end
|
|
306
|
+
#: () -> Integer
|
|
307
|
+
def text_on_warning
|
|
308
|
+
@text_on_warning
|
|
309
|
+
end
|
|
310
|
+
#: (Integer v) -> Integer
|
|
311
|
+
def text_on_warning=(v)
|
|
312
|
+
@text_on_warning = v
|
|
313
|
+
end
|
|
314
|
+
#: () -> Integer
|
|
315
|
+
def text_on_danger
|
|
316
|
+
@text_on_danger
|
|
317
|
+
end
|
|
318
|
+
#: (Integer v) -> Integer
|
|
319
|
+
def text_on_danger=(v)
|
|
320
|
+
@text_on_danger = v
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
# --- Kind hover ---
|
|
324
|
+
#: () -> Integer
|
|
325
|
+
def hover_normal
|
|
326
|
+
@hover_normal
|
|
327
|
+
end
|
|
328
|
+
#: (Integer v) -> Integer
|
|
329
|
+
def hover_normal=(v)
|
|
330
|
+
@hover_normal = v
|
|
331
|
+
end
|
|
332
|
+
#: () -> Integer
|
|
333
|
+
def hover_info
|
|
334
|
+
@hover_info
|
|
335
|
+
end
|
|
336
|
+
#: (Integer v) -> Integer
|
|
337
|
+
def hover_info=(v)
|
|
338
|
+
@hover_info = v
|
|
339
|
+
end
|
|
340
|
+
#: () -> Integer
|
|
341
|
+
def hover_success
|
|
342
|
+
@hover_success
|
|
343
|
+
end
|
|
344
|
+
#: (Integer v) -> Integer
|
|
345
|
+
def hover_success=(v)
|
|
346
|
+
@hover_success = v
|
|
347
|
+
end
|
|
348
|
+
#: () -> Integer
|
|
349
|
+
def hover_warning
|
|
350
|
+
@hover_warning
|
|
351
|
+
end
|
|
352
|
+
#: (Integer v) -> Integer
|
|
353
|
+
def hover_warning=(v)
|
|
354
|
+
@hover_warning = v
|
|
355
|
+
end
|
|
356
|
+
#: () -> Integer
|
|
357
|
+
def hover_danger
|
|
358
|
+
@hover_danger
|
|
359
|
+
end
|
|
360
|
+
#: (Integer v) -> Integer
|
|
361
|
+
def hover_danger=(v)
|
|
362
|
+
@hover_danger = v
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
# --- Kind-based color methods ---
|
|
366
|
+
|
|
367
|
+
#: (Integer kind) -> Integer
|
|
368
|
+
def button_bg(kind)
|
|
369
|
+
if kind == 1
|
|
370
|
+
@bg_info
|
|
371
|
+
elsif kind == 2
|
|
372
|
+
@bg_success
|
|
373
|
+
elsif kind == 3
|
|
374
|
+
@bg_warning
|
|
375
|
+
elsif kind == 4
|
|
376
|
+
@bg_danger
|
|
377
|
+
else
|
|
378
|
+
@accent
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
#: (Integer kind) -> Integer
|
|
383
|
+
def button_text(kind)
|
|
384
|
+
if kind == 1
|
|
385
|
+
@text_on_info
|
|
386
|
+
elsif kind == 2
|
|
387
|
+
@text_on_success
|
|
388
|
+
elsif kind == 3
|
|
389
|
+
@text_on_warning
|
|
390
|
+
elsif kind == 4
|
|
391
|
+
@text_on_danger
|
|
392
|
+
else
|
|
393
|
+
@bg_canvas
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
#: (Integer kind) -> Integer
|
|
398
|
+
def button_hover(kind)
|
|
399
|
+
if kind == 1
|
|
400
|
+
@hover_info
|
|
401
|
+
elsif kind == 2
|
|
402
|
+
@hover_success
|
|
403
|
+
elsif kind == 3
|
|
404
|
+
@hover_warning
|
|
405
|
+
elsif kind == 4
|
|
406
|
+
@hover_danger
|
|
407
|
+
else
|
|
408
|
+
@hover_normal
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
#: (Integer kind) -> Integer
|
|
413
|
+
def text_color_for_kind(kind)
|
|
414
|
+
if kind == 1
|
|
415
|
+
@info
|
|
416
|
+
elsif kind == 2
|
|
417
|
+
@success
|
|
418
|
+
elsif kind == 3
|
|
419
|
+
@warning
|
|
420
|
+
elsif kind == 4
|
|
421
|
+
@error
|
|
422
|
+
else
|
|
423
|
+
@text_primary
|
|
424
|
+
end
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
# --- Theme Presets ---
|
|
429
|
+
# Each returns a new Theme with preset colors.
|
|
430
|
+
# Usage: Kumiki.theme = Kumiki.theme_nord
|
|
431
|
+
|
|
432
|
+
module_function
|
|
433
|
+
|
|
434
|
+
#: () -> Theme
|
|
435
|
+
def theme_tokyo_night
|
|
436
|
+
Theme.new
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
#: () -> Theme
|
|
440
|
+
def theme_light
|
|
441
|
+
t = Theme.new
|
|
442
|
+
t.bg_canvas = 0xFFD5D6DB
|
|
443
|
+
t.bg_primary = 0xFFE1E2E7
|
|
444
|
+
t.bg_secondary = 0xFFC4C5CB
|
|
445
|
+
t.bg_overlay = 0xFFD5D6DB
|
|
446
|
+
t.text_primary = 0xFF343B58
|
|
447
|
+
t.text_secondary = 0xFF9699A3
|
|
448
|
+
t.accent = 0xFF34548A
|
|
449
|
+
t.info = 0xFF166775
|
|
450
|
+
t.success = 0xFF485E30
|
|
451
|
+
t.warning = 0xFF8F5E15
|
|
452
|
+
t.error = 0xFF8C4351
|
|
453
|
+
t.border = 0xFFC4C5CB
|
|
454
|
+
t.border_focus = 0xFF34548A
|
|
455
|
+
t.bg_info = 0xFF166775
|
|
456
|
+
t.bg_success = 0xFF485E30
|
|
457
|
+
t.bg_warning = 0xFF8F5E15
|
|
458
|
+
t.bg_danger = 0xFF8C4351
|
|
459
|
+
t.text_on_info = 0xFFE1E2E7
|
|
460
|
+
t.text_on_success = 0xFFE1E2E7
|
|
461
|
+
t.text_on_warning = 0xFFE1E2E7
|
|
462
|
+
t.text_on_danger = 0xFFE1E2E7
|
|
463
|
+
t.hover_info = 0xFF1A7A8A
|
|
464
|
+
t.hover_success = 0xFF567236
|
|
465
|
+
t.hover_warning = 0xFFA87020
|
|
466
|
+
t.hover_danger = 0xFFA35060
|
|
467
|
+
t.hover_normal = 0xFF4A6EA0
|
|
468
|
+
t.scrollbar_bg = 0xFFC4C5CB
|
|
469
|
+
t.scrollbar_fg = 0xFF9699A3
|
|
470
|
+
t.bg_selected = 0x8034548A
|
|
471
|
+
t
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
#: () -> Theme
|
|
475
|
+
def theme_nord
|
|
476
|
+
t = Theme.new
|
|
477
|
+
t.bg_canvas = 0xFF2E3440
|
|
478
|
+
t.bg_primary = 0xFF3B4252
|
|
479
|
+
t.bg_secondary = 0xFF434C5E
|
|
480
|
+
t.text_primary = 0xFFECEFF4
|
|
481
|
+
t.text_secondary = 0xFFD8DEE9
|
|
482
|
+
t.accent = 0xFF88C0D0
|
|
483
|
+
t.info = 0xFF88C0D0
|
|
484
|
+
t.success = 0xFFA3BE8C
|
|
485
|
+
t.warning = 0xFFEBCB8B
|
|
486
|
+
t.error = 0xFFBF616A
|
|
487
|
+
t.border = 0xFF4C566A
|
|
488
|
+
t.border_focus = 0xFF88C0D0
|
|
489
|
+
t.bg_info = 0xFF88C0D0
|
|
490
|
+
t.bg_success = 0xFFA3BE8C
|
|
491
|
+
t.bg_warning = 0xFFEBCB8B
|
|
492
|
+
t.bg_danger = 0xFFBF616A
|
|
493
|
+
t.text_on_info = 0xFF2E3440
|
|
494
|
+
t.text_on_success = 0xFF2E3440
|
|
495
|
+
t.text_on_warning = 0xFF2E3440
|
|
496
|
+
t.text_on_danger = 0xFFECEFF4
|
|
497
|
+
t.hover_info = 0xFF8FBCBB
|
|
498
|
+
t.hover_success = 0xFFB4D89C
|
|
499
|
+
t.hover_warning = 0xFFF5D9A0
|
|
500
|
+
t.hover_danger = 0xFFD08770
|
|
501
|
+
t.hover_normal = 0xFF9DD0DE
|
|
502
|
+
t
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
#: () -> Theme
|
|
506
|
+
def theme_dracula
|
|
507
|
+
t = Theme.new
|
|
508
|
+
t.bg_canvas = 0xFF282A36
|
|
509
|
+
t.bg_primary = 0xFF44475A
|
|
510
|
+
t.bg_secondary = 0xFF6272A4
|
|
511
|
+
t.text_primary = 0xFFF8F8F2
|
|
512
|
+
t.text_secondary = 0xFF6272A4
|
|
513
|
+
t.accent = 0xFFBD93F9
|
|
514
|
+
t.info = 0xFF8BE9FD
|
|
515
|
+
t.success = 0xFF50FA7B
|
|
516
|
+
t.warning = 0xFFF1FA8C
|
|
517
|
+
t.error = 0xFFFF5555
|
|
518
|
+
t.border = 0xFF6272A4
|
|
519
|
+
t.border_focus = 0xFFBD93F9
|
|
520
|
+
t.bg_info = 0xFF8BE9FD
|
|
521
|
+
t.bg_success = 0xFF50FA7B
|
|
522
|
+
t.bg_warning = 0xFFF1FA8C
|
|
523
|
+
t.bg_danger = 0xFFFF5555
|
|
524
|
+
t.text_on_info = 0xFF282A36
|
|
525
|
+
t.text_on_success = 0xFF282A36
|
|
526
|
+
t.text_on_warning = 0xFF282A36
|
|
527
|
+
t.text_on_danger = 0xFFF8F8F2
|
|
528
|
+
t.hover_info = 0xFFA4F0FF
|
|
529
|
+
t.hover_success = 0xFF69FF94
|
|
530
|
+
t.hover_warning = 0xFFFFFFA5
|
|
531
|
+
t.hover_danger = 0xFFFF6E6E
|
|
532
|
+
t.hover_normal = 0xFFD0ABFF
|
|
533
|
+
t
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
#: () -> Theme
|
|
537
|
+
def theme_catppuccin
|
|
538
|
+
t = Theme.new
|
|
539
|
+
t.bg_canvas = 0xFF1E1E2E
|
|
540
|
+
t.bg_primary = 0xFF313244
|
|
541
|
+
t.bg_secondary = 0xFF45475A
|
|
542
|
+
t.text_primary = 0xFFCDD6F4
|
|
543
|
+
t.text_secondary = 0xFFA6ADC8
|
|
544
|
+
t.accent = 0xFFCBA6F7
|
|
545
|
+
t.info = 0xFF89B4FA
|
|
546
|
+
t.success = 0xFFA6E3A1
|
|
547
|
+
t.warning = 0xFFF9E2AF
|
|
548
|
+
t.error = 0xFFF38BA8
|
|
549
|
+
t.border = 0xFF585B70
|
|
550
|
+
t.border_focus = 0xFFCBA6F7
|
|
551
|
+
t.bg_info = 0xFF89B4FA
|
|
552
|
+
t.bg_success = 0xFFA6E3A1
|
|
553
|
+
t.bg_warning = 0xFFF9E2AF
|
|
554
|
+
t.bg_danger = 0xFFF38BA8
|
|
555
|
+
t.text_on_info = 0xFF1E1E2E
|
|
556
|
+
t.text_on_success = 0xFF1E1E2E
|
|
557
|
+
t.text_on_warning = 0xFF1E1E2E
|
|
558
|
+
t.text_on_danger = 0xFF1E1E2E
|
|
559
|
+
t.hover_info = 0xFFA4C8FF
|
|
560
|
+
t.hover_success = 0xFFB9F0B4
|
|
561
|
+
t.hover_warning = 0xFFFFF0CC
|
|
562
|
+
t.hover_danger = 0xFFFFA0B8
|
|
563
|
+
t.hover_normal = 0xFFDEC0FF
|
|
564
|
+
t
|
|
565
|
+
end
|
|
566
|
+
|
|
567
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Kumiki
|
|
2
|
+
# Material Light theme
|
|
3
|
+
|
|
4
|
+
module_function
|
|
5
|
+
|
|
6
|
+
def material_theme
|
|
7
|
+
t = Theme.new
|
|
8
|
+
t.bg_canvas = 0xFFFEFEFE
|
|
9
|
+
t.bg_primary = 0xFFFFFFFF
|
|
10
|
+
t.bg_secondary = 0xFFF5F5F5
|
|
11
|
+
t.bg_overlay = 0xFFE8E8E8
|
|
12
|
+
t.text_primary = 0xFF1C1B1F
|
|
13
|
+
t.text_secondary = 0xFF757575
|
|
14
|
+
t.accent = 0xFF6200EE
|
|
15
|
+
t.info = 0xFF2196F3
|
|
16
|
+
t.success = 0xFF4CAF50
|
|
17
|
+
t.warning = 0xFFFF9800
|
|
18
|
+
t.error = 0xFFF44336
|
|
19
|
+
t.border = 0xFFE0E0E0
|
|
20
|
+
t.border_focus = 0xFF6200EE
|
|
21
|
+
t.bg_info = 0xFF2196F3
|
|
22
|
+
t.bg_success = 0xFF4CAF50
|
|
23
|
+
t.bg_warning = 0xFFFF9800
|
|
24
|
+
t.bg_danger = 0xFFF44336
|
|
25
|
+
t.text_on_info = 0xFFFFFFFF
|
|
26
|
+
t.text_on_success = 0xFFFFFFFF
|
|
27
|
+
t.text_on_warning = 0xFF1C1B1F
|
|
28
|
+
t.text_on_danger = 0xFFFFFFFF
|
|
29
|
+
t.hover_info = 0xFF42A5F5
|
|
30
|
+
t.hover_success = 0xFF66BB6A
|
|
31
|
+
t.hover_warning = 0xFFFFA726
|
|
32
|
+
t.hover_danger = 0xFFEF5350
|
|
33
|
+
t.hover_normal = 0xFFE0E0E0
|
|
34
|
+
t.scrollbar_bg = 0xFFE0E0E0
|
|
35
|
+
t.scrollbar_fg = 0xFFBDBDBD
|
|
36
|
+
t.bg_selected = 0x806200EE
|
|
37
|
+
t
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
module Kumiki
|
|
2
|
+
# Button widget - clickable button with label
|
|
3
|
+
|
|
4
|
+
class Button < Widget
|
|
5
|
+
def initialize(label)
|
|
6
|
+
super()
|
|
7
|
+
@label = label
|
|
8
|
+
@font_size_val = 14.0
|
|
9
|
+
@kind_val = 0
|
|
10
|
+
@custom_bg = false
|
|
11
|
+
@custom_text = false
|
|
12
|
+
@bg_color = 0xFF7AA2F7
|
|
13
|
+
@text_color = 0xFF1A1B26
|
|
14
|
+
@hover_color = 0xFF89B4FA
|
|
15
|
+
@radius = 4.0
|
|
16
|
+
@hovered = false
|
|
17
|
+
@click_handler = nil
|
|
18
|
+
@pad_top = 8.0
|
|
19
|
+
@pad_right = 16.0
|
|
20
|
+
@pad_bottom = 8.0
|
|
21
|
+
@pad_left = 16.0
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def kind(k)
|
|
25
|
+
@kind_val = k
|
|
26
|
+
self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def on_click(&block)
|
|
30
|
+
@click_handler = block
|
|
31
|
+
self
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def font_size(s)
|
|
35
|
+
@font_size_val = s
|
|
36
|
+
self
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def bg(c)
|
|
40
|
+
@bg_color = c
|
|
41
|
+
@custom_bg = true
|
|
42
|
+
self
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def text_color(c)
|
|
46
|
+
@text_color = c
|
|
47
|
+
@custom_text = true
|
|
48
|
+
self
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def measure(painter)
|
|
52
|
+
tw = painter.measure_text_width(@label, Kumiki.theme.font_family, @font_size_val)
|
|
53
|
+
th = painter.measure_text_height(Kumiki.theme.font_family, @font_size_val)
|
|
54
|
+
Size.new(tw + @pad_left + @pad_right, th + @pad_top + @pad_bottom)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def redraw(painter, completely)
|
|
58
|
+
# Use theme colors based on kind, unless custom colors were set
|
|
59
|
+
if @custom_bg
|
|
60
|
+
bg_c = @hovered ? @hover_color : @bg_color
|
|
61
|
+
else
|
|
62
|
+
if @hovered
|
|
63
|
+
bg_c = Kumiki.theme.button_hover(@kind_val)
|
|
64
|
+
else
|
|
65
|
+
bg_c = Kumiki.theme.button_bg(@kind_val)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
if @custom_text
|
|
69
|
+
tc = @text_color
|
|
70
|
+
else
|
|
71
|
+
tc = Kumiki.theme.button_text(@kind_val)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
painter.fill_round_rect(0.0, 0.0, @width, @height, @radius, bg_c)
|
|
75
|
+
ascent = painter.get_text_ascent(Kumiki.theme.font_family, @font_size_val)
|
|
76
|
+
th = painter.measure_text_height(Kumiki.theme.font_family, @font_size_val)
|
|
77
|
+
tw = painter.measure_text_width(@label, Kumiki.theme.font_family, @font_size_val)
|
|
78
|
+
text_x = (@width - tw) / 2.0
|
|
79
|
+
text_y = (@height - th) / 2.0 + ascent
|
|
80
|
+
painter.draw_text(@label, text_x, text_y, Kumiki.theme.font_family, @font_size_val, tc)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def mouse_up(ev)
|
|
84
|
+
@click_handler.call if @click_handler
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def mouse_over
|
|
88
|
+
@hovered = true
|
|
89
|
+
mark_dirty
|
|
90
|
+
update
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def mouse_out
|
|
94
|
+
@hovered = false
|
|
95
|
+
mark_dirty
|
|
96
|
+
update
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Top-level helper
|
|
101
|
+
def Button(label)
|
|
102
|
+
Button.new(label)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end
|