accrete 0.0.149__py3-none-any.whl → 0.0.151__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. accrete/contrib/log/queries.py +3 -1
  2. accrete/contrib/ui/admin.py +9 -1
  3. accrete/contrib/ui/forms.py +57 -0
  4. accrete/contrib/ui/migrations/0001_initial.py +39 -0
  5. accrete/contrib/ui/migrations/0002_alter_theme_color_danger_alter_theme_color_link_and_more.py +38 -0
  6. accrete/contrib/ui/migrations/0003_alter_theme_check_user_or_tenant.py +21 -0
  7. accrete/contrib/ui/migrations/0004_theme_force_tenant_theme.py +18 -0
  8. accrete/contrib/ui/models.py +115 -1
  9. accrete/contrib/ui/response.py +14 -5
  10. accrete/contrib/ui/static/css/accrete.css +23 -57
  11. accrete/contrib/ui/static/css/accrete.css.map +1 -1
  12. accrete/contrib/ui/static/css/accrete.scss +76 -55
  13. accrete/contrib/ui/templates/django/forms/widgets/input.html +1 -1
  14. accrete/contrib/ui/templates/ui/custom_theme.html +19 -0
  15. accrete/contrib/ui/templates/ui/layout.html +9 -9
  16. accrete/contrib/ui/templates/ui/list.html +2 -2
  17. accrete/contrib/ui/templates/ui/message.html +2 -2
  18. accrete/contrib/ui/templates/ui/modal.html +3 -3
  19. accrete/contrib/ui/templates/ui/table.html +5 -5
  20. accrete/contrib/ui/templates/ui/templatetags/field.html +50 -11
  21. accrete/contrib/ui/templates/ui/widgets/date_weekday.html +10 -0
  22. accrete/contrib/ui/templates/ui/widgets/model_search_select.html +4 -3
  23. accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +5 -4
  24. accrete/contrib/ui/templatetags/ui.py +37 -5
  25. accrete/contrib/ui/views.py +90 -2
  26. accrete/contrib/ui/widgets/__init__.py +1 -0
  27. accrete/contrib/ui/widgets/date_weekday.py +6 -0
  28. accrete/contrib/ui/widgets/search_select.py +2 -2
  29. accrete/contrib/user/forms.py +1 -1
  30. accrete/contrib/user/migrations/0009_alter_user_theme.py +18 -0
  31. accrete/contrib/user/migrations/0010_alter_user_theme.py +18 -0
  32. accrete/contrib/user/models.py +5 -3
  33. accrete/contrib/user/templates/user/login.html +3 -11
  34. accrete/contrib/user/templates/user/user_preferences.html +27 -15
  35. accrete/contrib/user/views.py +7 -2
  36. accrete/fields.py +4 -2
  37. accrete/managers.py +9 -0
  38. accrete/migrations/0009_alter_accessgroup_name.py +30 -0
  39. accrete/models.py +6 -4
  40. accrete/views.py +32 -20
  41. {accrete-0.0.149.dist-info → accrete-0.0.151.dist-info}/METADATA +1 -1
  42. {accrete-0.0.149.dist-info → accrete-0.0.151.dist-info}/RECORD +44 -33
  43. {accrete-0.0.149.dist-info → accrete-0.0.151.dist-info}/WHEEL +0 -0
  44. {accrete-0.0.149.dist-info → accrete-0.0.151.dist-info}/licenses/LICENSE +0 -0
@@ -1,8 +1,10 @@
1
+ from django.db.models.query import RawQuerySet
2
+
1
3
  from .models import Log
2
4
  from accrete.tenant import get_tenant
3
5
 
4
6
 
5
- def current_log_state(model: str, object_id: int):
7
+ def current_log_state(model: str, object_id: int) -> RawQuerySet:
6
8
  tenant = get_tenant()
7
9
  tenant_id = tenant and tenant.id or None
8
10
  logs = Log.objects.raw("""
@@ -1,3 +1,11 @@
1
1
  from django.contrib import admin
2
+ from .models import Theme
2
3
 
3
- # Register your models here.
4
+
5
+ class ThemeAdmin(admin.ModelAdmin):
6
+ model = Theme
7
+ list_display = ('pk', 'user', 'tenant')
8
+ search_fields = ('pk', 'user', 'tenant')
9
+
10
+
11
+ admin.site.register(Theme, ThemeAdmin)
@@ -0,0 +1,57 @@
1
+ from django import forms
2
+ from django.db.models import Q
3
+ from django.utils.translation import gettext_lazy as _
4
+ from . models import Theme
5
+
6
+
7
+ class ThemeForm(forms.ModelForm):
8
+
9
+ class Meta:
10
+ model = Theme
11
+ fields = [
12
+ 'user',
13
+ 'tenant',
14
+ 'color_primary',
15
+ 'color_success',
16
+ 'color_link',
17
+ 'color_warning',
18
+ 'color_danger'
19
+ ]
20
+ widgets = {
21
+ 'color_primary': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
22
+ 'color_success': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
23
+ 'color_link': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
24
+ 'color_warning': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
25
+ 'color_danger': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
26
+ 'user': forms.widgets.HiddenInput(),
27
+ 'tenant': forms.widgets.HiddenInput()
28
+ }
29
+
30
+ def _clean_color(self, hex_color: str):
31
+ if not hex_color.startswith('#'):
32
+ hex_color = f'#{hex_color}'
33
+ if len(hex_color) != 7:
34
+ raise forms.ValidationError(_(
35
+ 'Color must be of length 7 and including the starting "#"'
36
+ ))
37
+ return hex_color
38
+
39
+ def clean_color_primary(self):
40
+ color = self._clean_color(self.cleaned_data.get('color_primary'))
41
+ return color
42
+
43
+ def clean_color_success(self):
44
+ color = self._clean_color(self.cleaned_data.get('color_success'))
45
+ return color
46
+
47
+ def clean_color_link(self):
48
+ color = self._clean_color(self.cleaned_data.get('color_link'))
49
+ return color
50
+
51
+ def clean_color_warning(self):
52
+ color = self._clean_color(self.cleaned_data.get('color_warning'))
53
+ return color
54
+
55
+ def clean_color_danger(self):
56
+ color = self._clean_color(self.cleaned_data.get('color_danger'))
57
+ return color
@@ -0,0 +1,39 @@
1
+ # Generated by Django 5.2.1 on 2025-08-07 16:18
2
+
3
+ import django.db.models.deletion
4
+ from django.conf import settings
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ initial = True
11
+
12
+ dependencies = [
13
+ ('accrete', '0009_alter_accessgroup_name'),
14
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
15
+ ]
16
+
17
+ operations = [
18
+ migrations.CreateModel(
19
+ name='Theme',
20
+ fields=[
21
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22
+ ('color_primary', models.CharField(max_length=7, verbose_name='Primary Color')),
23
+ ('color_success', models.CharField(max_length=7, verbose_name='Success Color')),
24
+ ('color_link', models.CharField(max_length=7, verbose_name='Link Color')),
25
+ ('color_warning', models.CharField(max_length=7, verbose_name='Warning Color')),
26
+ ('color_danger', models.CharField(max_length=7, verbose_name='Danger Color')),
27
+ ('theme_markup', models.TextField(blank=True, null=True, verbose_name='Theme Markup')),
28
+ ('tenant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tenant_themes', to='accrete.tenant', verbose_name='Tenant')),
29
+ ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_themes', to=settings.AUTH_USER_MODEL, verbose_name='User')),
30
+ ],
31
+ options={
32
+ 'verbose_name': 'Theme',
33
+ 'verbose_name_plural': 'Themes',
34
+ 'db_table': 'accrete_theme',
35
+ 'ordering': ['pk'],
36
+ 'constraints': [models.CheckConstraint(condition=models.Q(('user__isnull', True), ('tenant__isnull', True), _connector='XOR'), name='check_user_or_tenant', violation_error_message='')],
37
+ },
38
+ ),
39
+ ]
@@ -0,0 +1,38 @@
1
+ # Generated by Django 5.2.1 on 2025-08-07 17:11
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('ui', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='theme',
15
+ name='color_danger',
16
+ field=models.CharField(default='#FF6584', max_length=7, verbose_name='Danger Color'),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='theme',
20
+ name='color_link',
21
+ field=models.CharField(default='#65D0FE', max_length=7, verbose_name='Link Color'),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name='theme',
25
+ name='color_primary',
26
+ field=models.CharField(default='#46C68D', max_length=7, verbose_name='Primary Color'),
27
+ ),
28
+ migrations.AlterField(
29
+ model_name='theme',
30
+ name='color_success',
31
+ field=models.CharField(default='#46C68D', max_length=7, verbose_name='Success Color'),
32
+ ),
33
+ migrations.AlterField(
34
+ model_name='theme',
35
+ name='color_warning',
36
+ field=models.CharField(default='#FEB600', max_length=7, verbose_name='Warning Color'),
37
+ ),
38
+ ]
@@ -0,0 +1,21 @@
1
+ # Generated by Django 5.2.1 on 2025-08-08 06:13
2
+
3
+ from django.conf import settings
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('accrete', '0009_alter_accessgroup_name'),
11
+ ('ui', '0002_alter_theme_color_danger_alter_theme_color_link_and_more'),
12
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AlterConstraint(
17
+ model_name='theme',
18
+ name='check_user_or_tenant',
19
+ constraint=models.CheckConstraint(condition=models.Q(('user__isnull', True), ('tenant__isnull', True), _connector='XOR'), name='check_user_or_tenant', violation_error_message='A theme must be assigned either to a user or a tenant.'),
20
+ ),
21
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.1 on 2025-08-08 06:27
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('ui', '0003_alter_theme_check_user_or_tenant'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='theme',
15
+ name='force_tenant_theme',
16
+ field=models.BooleanField(default=False, help_text='Apply this theme regardless of user preferences', verbose_name='Force Tenant Theme'),
17
+ ),
18
+ ]
@@ -1,3 +1,117 @@
1
+ import colorsys
2
+
3
+ from django.conf import settings
1
4
  from django.db import models
5
+ from django.utils.translation import gettext_lazy as _
6
+ from django.template.loader import render_to_string
7
+
8
+
9
+ class Theme(models.Model):
10
+
11
+ class Meta:
12
+ verbose_name = _('Theme')
13
+ verbose_name_plural = _('Themes')
14
+ db_table = 'accrete_theme'
15
+ ordering = ['pk']
16
+ constraints = [
17
+ models.CheckConstraint(
18
+ name='check_user_or_tenant',
19
+ violation_error_message=_(
20
+ 'A theme must be assigned either to a user or a tenant.'
21
+ ),
22
+ condition=(
23
+ models.Q(user__isnull=True) ^ models.Q(tenant__isnull=True)
24
+ )
25
+ )
26
+ ]
27
+
28
+ user = models.ForeignKey(
29
+ verbose_name=_('User'),
30
+ to=settings.AUTH_USER_MODEL,
31
+ on_delete=models.CASCADE,
32
+ related_name='user_themes',
33
+ null=True,
34
+ blank=True
35
+ )
36
+
37
+ tenant = models.ForeignKey(
38
+ verbose_name=_('Tenant'),
39
+ to='accrete.Tenant',
40
+ on_delete=models.CASCADE,
41
+ related_name='tenant_themes',
42
+ null=True,
43
+ blank=True
44
+ )
45
+
46
+ force_tenant_theme = models.BooleanField(
47
+ verbose_name=_('Force Tenant Theme'),
48
+ default=False,
49
+ help_text=_('Apply this theme regardless of user preferences')
50
+ )
51
+
52
+ color_primary = models.CharField(
53
+ verbose_name=_('Primary Color'),
54
+ max_length=7,
55
+ default='#46C68D'
56
+ )
57
+
58
+ color_success = models.CharField(
59
+ verbose_name=_('Success Color'),
60
+ max_length=7,
61
+ default='#46C68D'
62
+ )
63
+
64
+ color_link = models.CharField(
65
+ verbose_name=_('Link Color'),
66
+ max_length=7,
67
+ default='#65D0FE'
68
+ )
69
+
70
+ color_warning = models.CharField(
71
+ verbose_name=_('Warning Color'),
72
+ max_length=7,
73
+ default='#FEB600'
74
+ )
75
+
76
+ color_danger = models.CharField(
77
+ verbose_name=_('Danger Color'),
78
+ max_length=7,
79
+ default='#FF6584'
80
+ )
81
+
82
+ theme_markup = models.TextField(
83
+ verbose_name=_('Theme Markup'),
84
+ null=True,
85
+ blank=True
86
+ )
87
+
88
+ def generate_markup(self) -> str:
89
+ def hex_to_hsl(hex_color: str) -> dict:
90
+ hex_color = hex_color.removeprefix('#')
91
+ rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
92
+ rgb = [x/255.0 for x in rgb]
93
+ h, l, s = colorsys.rgb_to_hls(*rgb)
94
+
95
+ return {
96
+ 'h': round(h * 360),
97
+ 's': round(s * 100),
98
+ 'l': round(l * 100)
99
+ }
100
+ ctx = {
101
+ 'primary': hex_to_hsl(self.color_primary),
102
+ 'success': hex_to_hsl(self.color_success),
103
+ 'link': hex_to_hsl(self.color_link),
104
+ 'warning': hex_to_hsl(self.color_warning),
105
+ 'danger': hex_to_hsl(self.color_danger)
106
+ }
107
+ return render_to_string('ui/custom_theme.html', ctx)
2
108
 
3
- # Create your models here.
109
+ def save(
110
+ self,
111
+ force_insert=False,
112
+ force_update=False,
113
+ using=None,
114
+ update_fields=None,
115
+ ):
116
+ self.theme_markup = self.generate_markup()
117
+ super().save(force_insert, force_update, using, update_fields)
@@ -8,6 +8,7 @@ from django.db.models import Model
8
8
  from django.http import HttpResponse
9
9
  from django.template.loader import render_to_string
10
10
  from django.utils.translation import gettext_lazy as _
11
+ from django.utils.functional import Promise
11
12
  from accrete.contrib.ui import Filter
12
13
 
13
14
 
@@ -121,7 +122,8 @@ class ListResponse(WindowResponse):
121
122
  column_height: str = '150px',
122
123
  overview_template: str = 'ui/list.html',
123
124
  detail_header_template: str = None,
124
- detail_data_template: str = None
125
+ detail_data_template: str = None,
126
+ detail_enabled: bool = True
125
127
  ):
126
128
  assert page is not None or ui_filter is not None, _(
127
129
  'Argument page or ui_filter must be supplied'
@@ -141,6 +143,7 @@ class ListResponse(WindowResponse):
141
143
  self.column_height = column_height
142
144
  self.detail_header_template = detail_header_template
143
145
  self.detail_data_template = detail_data_template
146
+ self.detail_enabled = detail_enabled
144
147
 
145
148
  def _has_panel(self):
146
149
  return bool(self.panel_template or self.ui_filter)
@@ -154,6 +157,7 @@ class ListResponse(WindowResponse):
154
157
  'endless_scroll': self.endless_scroll,
155
158
  'column_count': self.column_count,
156
159
  'column_height': self.column_height,
160
+ 'detail_enabled': self.detail_enabled,
157
161
  'detail_header_template': self.detail_header_template,
158
162
  'detail_data_template': self.detail_data_template,
159
163
  'show_content_right': str(bool(
@@ -215,10 +219,10 @@ class TableResponse(WindowResponse):
215
219
 
216
220
  def __init__(
217
221
  self, *,
218
- title: str,
222
+ title: str | Promise,
219
223
  context: dict,
220
- instance_label: str,
221
224
  fields: list[str],
225
+ instance_label: str | Promise | None = None,
222
226
  footer: dict = None,
223
227
  page: paginator.Page = None,
224
228
  ui_filter: Filter = None,
@@ -280,12 +284,14 @@ class TableRowResponse(Response):
280
284
  self, *,
281
285
  instance: Model,
282
286
  fields: list[str],
287
+ instance_label: str | Promise | None = None,
283
288
  footer: dict = None,
284
289
  page: paginator.Page = None,
285
290
  ):
286
291
  super().__init__(template=self.base_template, context={})
287
292
  self.instance = instance
288
293
  self.fields = fields
294
+ self.instance_label = instance_label
289
295
  self.footer = footer
290
296
  self.page = page
291
297
 
@@ -294,6 +300,7 @@ class TableRowResponse(Response):
294
300
  context.update({
295
301
  'instance': self.instance,
296
302
  'fields': self.fields,
303
+ 'instance_label': self.instance_label,
297
304
  'footer': self.footer,
298
305
  'page': self.page
299
306
  })
@@ -346,7 +353,7 @@ class ModalResponse(Response):
346
353
  modal_id: str,
347
354
  template: str,
348
355
  context: dict,
349
- title: str = None,
356
+ title: str | Promise = None,
350
357
  is_update: bool = False,
351
358
  is_blocking: bool = False,
352
359
  modal_width: str = None
@@ -424,7 +431,7 @@ def add_trigger(
424
431
  return response
425
432
 
426
433
 
427
- def update(request, ui_responses: list[Response]) -> HttpResponse:
434
+ def update(request, ui_responses: list[Response], trigger: list[ClientTrigger] = None) -> HttpResponse:
428
435
  response = HttpResponse()
429
436
  content = ''
430
437
  for res in ui_responses:
@@ -432,4 +439,6 @@ def update(request, ui_responses: list[Response]) -> HttpResponse:
432
439
  res.add_trigger(response)
433
440
  content += render_to_string('ui/message.html', request=request)
434
441
  response.content = content
442
+ for t in trigger or []:
443
+ add_trigger(response, t.trigger, t.header)
435
444
  return response
@@ -1,30 +1,18 @@
1
- @import url(../bulma/css/bulma.css);
1
+ @import url(../bulma/css/bulma.min.css);
2
2
  :root {
3
3
  --bulma-body-size: .9em;
4
4
  --bulma-navbar-height: 40px;
5
- --bulma-menu-item-selected-h: --bulma-success-h;
6
- --accrete-detail-width: 500px;
5
+ --bulma-menu-item-selected-h: var(--bulma-primary-h);
6
+ --accrete-detail-width: 35em;
7
+ --bulma-primary-h: 153.28deg;
8
+ --bulma-primary-s: 52.89%;
9
+ --bulma-primary-l: 52.55%;
7
10
  --accrete-action-panel-width: 320px;
8
- --bulma-input-icon-focus-color: var(--bulma-success);
9
- --bulma-input-arrow: var(--bulma-success);
10
- --bulma-arrow-color: var(--bulma-success);
11
- --bulma-menu-nested-list-margin: .5em 0 0.5em 0.75em;
12
- --bulma-navbar-burger-color: var(--bulma-success);
13
- --accrete-hover-color: #F0F2F4; }
14
-
15
- html[data-theme='light'] {
16
- --bulma-menu-item-h: var(--bulma-success-h);
17
- --bulma-menu-item-s: var(--bulma-success-s);
18
- --bulma-menu-item-l: var(--bulma-success-l);
19
- --bulma-menu-item-background-l: 50%;
20
- --bulma-menu-item-color-l: 10%;
21
- --bulma-navbar-burger-color: var(--bulma-success);
22
- --bulma-input-disabled-border-color: var(--bulma-input-border-color) !important;
11
+ --bulma-input-arrow: var(--bulma-primary);
12
+ --bulma-arrow-color: var(--bulma-primary);
23
13
  --accrete-hover-color: #F0F2F4; }
24
14
 
25
15
  html[data-theme='dark'] {
26
- --bulma-navbar-burger-color: var(--bulma-success);
27
- --bulma-input-disabled-border-color: var(--bulma-input-border-color) !important;
28
16
  --accrete-hover-color: #1E2128; }
29
17
  html[data-theme='dark'] .button.is-light {
30
18
  --bulma-button-h: var(--bulma-dark-h);
@@ -61,20 +49,9 @@ a {
61
49
  border-bottom-color: transparent;
62
50
  border-left-color: transparent; }
63
51
 
64
- .input {
65
- border-top: none;
66
- border-right: none;
67
- border-left: none;
68
- border-top-left-radius: 0;
69
- border-top-right-radius: 0;
70
- border-bottom-right-radius: 0;
71
- border-bottom-left-radius: 0;
72
- box-shadow: none;
73
- font-weight: bold; }
74
-
75
52
  .input:focus, .input:focus-within {
76
53
  box-shadow: none;
77
- border-bottom: 1px solid var(--bulma-success); }
54
+ border: 1px solid var(--bulma-primary); }
78
55
 
79
56
  input[disabled] {
80
57
  background-color: transparent !important;
@@ -87,32 +64,21 @@ textarea {
87
64
  box-shadow: none !important; }
88
65
 
89
66
  textarea:focus {
90
- border-color: var(--bulma-success) !important; }
67
+ border-color: var(--bulma-primary) !important; }
91
68
 
92
69
  .is-small.textarea, .is-small.input {
93
70
  border-radius: 0;
94
71
  font-size: var(--bulma-size-small); }
95
72
 
96
73
  td > .input, td * .input, td * select, td * .select {
97
- border-top: none !important;
98
- border-right: none !important;
99
- border-bottom: none !important;
100
- border-left: none !important; }
101
-
102
- td:has(.input:focus) {
103
- border-bottom: 1px solid var(--bulma-success) !important; }
74
+ border-radius: 0; }
104
75
 
105
76
  select {
106
- border-top: transparent !important;
107
- border-right: transparent !important;
108
- border-left: transparent !important;
109
- border-radius: 0 !important;
110
- box-shadow: none !important;
111
- font-weight: bold; }
77
+ box-shadow: none !important; }
112
78
 
113
79
  select:focus {
114
80
  box-shadow: none;
115
- border-bottom: 1px solid var(--bulma-success) !important; }
81
+ border: 1px solid var(--bulma-primary) !important; }
116
82
 
117
83
  #detail-container {
118
84
  flex-shrink: 0;
@@ -157,7 +123,7 @@ select:focus {
157
123
  max-width: calc(var(--accrete-detail-width) - 6%); }
158
124
 
159
125
  .list-entry > .box:hover, .box.selected {
160
- box-shadow: 0 0 5px 2px var(--bulma-success); }
126
+ box-shadow: 0 0 5px 2px var(--bulma-primary); }
161
127
 
162
128
  .helptext {
163
129
  font-style: italic !important;
@@ -190,11 +156,11 @@ select:focus {
190
156
  table.can-compact * tr:first-child {
191
157
  border-top: 1px solid var(--bulma-grey-light); }
192
158
 
193
- table.can-compact * tr.is-success {
194
- background-color: var(--bulma-success); }
159
+ table.can-compact * tr.is-primary {
160
+ background-color: var(--bulma-primary); }
195
161
 
196
- table.can-compact * tr.is-success:hover {
197
- background-color: var(--bulma-success) !important; }
162
+ table.can-compact * tr.is-primary:hover {
163
+ background-color: var(--bulma-primary) !important; }
198
164
 
199
165
  table.can-compact > thead {
200
166
  display: none; }
@@ -239,11 +205,11 @@ select:focus {
239
205
  z-index: 40;
240
206
  box-shadow: 2px 0 20px 0 var(--bulma-grey-light); } }
241
207
  .menu-list a.is-active, .menu-list a.is-selected, .menu-list button.is-active, .menu-list button.is-selected, .menu-list .menu-item.is-active, .menu-list .menu-item.is-selected {
242
- --bulma-menu-item-h: var(--bulma-success-h);
243
- --bulma-menu-item-s: var(--bulma-success-s);
244
- --bulma-menu-item-l: var(--bulma-success-l);
245
- --bulma-menu-item-background-l: var(--bulma-success-l);
246
- --bulma-menu-item-color-l: var(--bulma-success-invert-l); }
208
+ --bulma-menu-item-h: var(--bulma-primary-h);
209
+ --bulma-menu-item-s: var(--bulma-primary-s);
210
+ --bulma-menu-item-l: var(--bulma-primary-l);
211
+ --bulma-menu-item-background-l: var(--bulma-primary-l);
212
+ --bulma-menu-item-color-l: var(--bulma-primary-invert-l); }
247
213
 
248
214
  .hoverable *:hover {
249
215
  background-color: var(--accrete-hover-color); }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "mappings": "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",
3
+ "mappings": "AAAQ,uCAA4B;AAEpC,KAAM;EACJ,iBAAiB,CAAC,KAAK;EACvB,qBAAqB,CAAC,KAAK;EAC3B,4BAA4B,CAAC,uBAAuB;EACpD,sBAAsB,CAAC,KAAK;EAC5B,iBAAiB,CAAC,UAAU;EAC5B,iBAAiB,CAAC,OAAO;EACzB,iBAAiB,CAAC,OAAO;EACzB,4BAA4B,CAAC,MAAM;EACnC,mBAAmB,CAAC,qBAAqB;EACzC,mBAAmB,CAAC,qBAAqB;EACzC,qBAAqB,CAAC,QAAQ;;AAchC,uBAAwB;EAGtB,qBAAqB,CAAC,QAAQ;EAE9B,wCAAiB;IACf,gBAAgB,CAAC,oBAAoB;IACrC,gBAAgB,CAAC,oBAAoB;IACrC,gBAAgB,CAAC,oBAAoB;IACrC,2BAA2B,CAAC,oBAAoB;IAChD,uBAAuB,CAAC,oBAAoB;IAC5C,2BAA2B,CAAC,IAAI;IAChC,sBAAsB,CAAC,2BAA2B;IAClD,6BAA6B,CAAC,EAAE;EAGlC,kDAA2B;IACzB,2BAA2B,CAAC,oBAAoB;IAChD,sBAAsB,CAAC,kCAAkC;EAG3D,+CAAwB;IACtB,2BAA2B,CAAC,0BAA0B;;AAI1D,SAAU;EACR,OAAO,EAAE,eAAe;;AAG1B,CAAE;EACA,KAAK,EAAE,OAAO;EACd,eAAe,EAAE,OAAO;;AAG1B,MAAO;EACL,WAAW,EAAE,MAAM;;AAIrB,cAAe;EACb,KAAK,EAAE,KAAK;;AAGd,iBAAkB;EAChB,UAAU,EAAE,IAAI;EAChB,gBAAgB,EAAE,WAAW;EAC7B,kBAAkB,EAAE,WAAW;EAC/B,mBAAmB,EAAE,WAAW;EAChC,iBAAiB,EAAE,WAAW;;AAgBhC,iCAAkC;EAChC,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,8BAA8B;;AAIxC,eAAgB;EACd,gBAAgB,EAAE,sBAAsB;EACxC,MAAM,EAAE,gBAAgB;;AAG1B,2BAA4B;EAC1B,WAAW,EAAE,iBAAiB;;AAGhC,QAAS;EACL,UAAU,EAAE,eAAc;;AAG9B,cAAe;EACX,YAAY,EAAE,+BAA+B;;AAGjD,mCAAoC;EAClC,aAAa,EAAE,CAAC;EAChB,SAAS,EAAE,uBAAuB;;AAyBpC,mDAAoD;EAKlD,aAAa,EAAE,CAAC;;AAOlB,MAAO;EAKH,UAAU,EAAE,eAAe;;AAI/B,YAAa;EACX,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,yCAAwC;;AAGlD,iBAAkB;EAChB,WAAW,EAAE,CAAC;EACd,KAAK,EAAE,2BAA2B;EAClC,sBAAsB,EAAE,0BAA0B;EAClD,yBAAyB,EAAE,0BAA0B;EACrD,UAAU,EAAE,qCAAqC;EACjD,OAAO,EAAE,EAAE;;AAGb,mBAAoB;EAClB,OAAO,EAAE,IAAI;;AAGf,mBAAoB;EAClB,cAAc,EAAE,kBAAkB;EAClC,cAAc,EAAE,WAAW;;AAG7B,eAAe;EACX,UAAU,EAAE,qBAAqB;;AAGrC,sBAAuB;EACnB,cAAc,EAAE,IAAI;;AAGxB,mCAAoC;EAChC,cAAc,EAAE,IAAI;;AAGxB,iBAAkB;EAChB,QAAQ,EAAE,KAAK;EACf,UAAU,EAAE,qBAAqB;EACjC,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,IAAI;;AAGf,8BAA+B;EAC7B,OAAO,EAAE,GAAG;EACZ,gBAAgB,EAAE,KAAK;EACvB,mBAAmB,EAAE,OAAO;;AAG9B,6BAA8B;EAC5B,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,GAAG;EACR,WAAW,EAAE,EAAE;EACf,SAAS,EAAE,sCAAsC;;AAGnD,uCAAwC;EACtC,UAAU,EAAE,gCAAgC;;AAG9C,SAAU;EACR,UAAU,EAAE,iBAAiB;EAC7B,SAAS,EAAE,eAAe;EAC1B,aAAa,EAAE,YAAY;EAC3B,KAAK,EAAE,iBAAiB;EACxB,WAAW,EAAE,0BAA0B;EACvC,WAAW,EAAE,IAAI;;AAGnB,UAAW;EACP,YAAY,EAAE,MAAM;EACpB,aAAa,EAAE,MAAM;;AAGzB,gDAyCC;EAxCC,sBAAuB;IACrB,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,eAAe;IAC3B,MAAM,EAAE,sBAAsB;IAC9B,SAAS,EAAE,GAAG;IACd,YAAY,EAAE,eAAe;;EAG/B,sBAAuB;IACrB,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,GAAG;IAChB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,iCACjB;;EAEA,kCAAmC;IACjC,UAAU,EAAE,iCAAiC;;EAG/C,iCAAkC;IAChC,gBAAgB,EAAE,oBAAoB;;EAGxC,uCAAwC;IACtC,gBAAgB,EAAE,+BAA8B;;EAGlD,yBAA0B;IACxB,OAAO,EAAE,IAAI;;EAGf,mBAAoB;IAClB,OAAO,EAAE,YAAY;;EAGvB,WAAY;IACV,MAAM,EAAE,sBAAqB;AAIjC,oCAAqC;EACnC,WAAY;IACV,SAAS,EAAE,IAAI;AAInB,oCAAqC;EACnC,iBAAkB;IAChB,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,CAAC;IACd,KAAK,EAAE,IAAI;IACX,sBAAsB,EAAE,CAAC;IACzB,yBAAyB,EAAE,CAAC;;EAG9B,wBAAyB;IACvB,KAAK,EAAE,IAAI;;EAGb,MAAO;IACL,WAAW,EAAE,YAAW;IACxB,cAAc,EAAE,YAAW;IAC3B,eAAe,EAAE,iBAAgB;;EAGnC,WAAY;IACV,KAAK,EAAE,eAAc;IACrB,UAAU,EAAE,MAAM;AAItB,aAAc;EACZ,SAAS,EAAE,iCAAiC;EAC5C,SAAS,EAAE,iCAAiC;EAC5C,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;;AAGlB,qCAAsC;EACpC,aAAc;IACZ,QAAQ,EAAE,QAAQ;IAClB,UAAU,EAAE,wBAAwB;IACpC,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,oCAAoC;AAIpD,gLAAiL;EAC/K,mBAAmB,CAAC,uBAAuB;EAC3C,mBAAmB,CAAC,uBAAuB;EAC3C,mBAAmB,CAAC,uBAAuB;EAC3C,8BAA8B,CAAC,uBAAuB;EACtD,yBAAyB,CAAC,8BAA8B;;AAG1D,kBAAmB;EACf,gBAAgB,EAAE,0BAA0B;;AAGhD,iCAAiC;AACjC;gCACiC;EAC/B,kBAAkB,EAAE,IAAI;EACxB,MAAM,EAAE,CAAC;;AAGX,aAAa;AACb,kBAAmB;EACjB,eAAe,EAAE,SAAS;;AAG5B,uEAAwE;EACtE,OAAO,EAAE,IAAI;;AAGf,6EAA8E;EAC5E,OAAO,EAAE,eAAc;;AAGzB,kEAAmE;EACjE,OAAO,EAAE,IAAI;;AAGf,wEAAyE;EACvE,OAAO,EAAE,eAAc;;AAGzB,YAAa;EACX,YAAY,EAAE,GAAG;EACjB,WAAW,EAAE,iCAAiC;EAC9C,UAAU,EAAE,IAAI;EAChB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;EACnB,aAAa,EAAE,CAAC;EAChB,aAAa,EAAE,GAAG;;AAGpB,mDAAoD;EAClD,YAAY,EAAE,CAAC;EACf,WAAW,EAAE,eAAc;;AAG7B,iBAAkB;EAChB,YAAY,EAAE,MAAM;EACpB,aAAa,EAAE,MAAM;EACrB,WAAW,EAAE,MAAM",
4
4
  "sources": ["accrete.scss"],
5
5
  "names": [],
6
6
  "file": "accrete.css"