mensa 0.8.0 → 0.8.2

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/.shipkit.yml +1 -1
  3. data/Gemfile.lock +2 -2
  4. data/app/assets/tailwind/mensa/engine.css +6 -0
  5. data/app/components/mensa/add_filter/component.css +68 -70
  6. data/app/components/mensa/add_filter/component.html.erb +1 -1
  7. data/app/components/mensa/column_customizer/component.css +33 -32
  8. data/app/components/mensa/column_customizer/component_controller.js +1 -1
  9. data/app/components/mensa/control_bar/component.css +121 -125
  10. data/app/components/mensa/empty_state/component.css +13 -13
  11. data/app/components/mensa/filter_pill/component.css +26 -26
  12. data/app/components/mensa/filter_pill_list/component.css +35 -37
  13. data/app/components/mensa/filter_pill_list/component_controller.js +13 -6
  14. data/app/components/mensa/group_by/component.css +28 -32
  15. data/app/components/mensa/group_by/component_controller.js +3 -3
  16. data/app/components/mensa/group_header/component.css +21 -23
  17. data/app/components/mensa/group_header/component_controller.js +7 -2
  18. data/app/components/mensa/search/component.css +53 -55
  19. data/app/components/mensa/table/component.css +7 -7
  20. data/app/components/mensa/table/component.html.erb +1 -0
  21. data/app/components/mensa/table/component_controller.js +3 -2
  22. data/app/components/mensa/view/component.css +10 -10
  23. data/app/components/mensa/view/component.html.erb +1 -1
  24. data/app/components/mensa/view/paging.css +2 -2
  25. data/app/components/mensa/views/component.css +103 -105
  26. data/app/javascript/mensa/controllers/application_controller.js +6 -0
  27. data/app/tables/mensa/base.rb +16 -2
  28. data/lib/generators/mensa/tailwind_config_generator.rb +4 -0
  29. data/lib/mensa/version.rb +1 -1
  30. data/lib/tasks/mensa_tasks.rake +3 -1
  31. data/mensa.gemspec +1 -1
  32. metadata +11 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9a9f69de3ec6ea7a204552adbe5182451252b6bcb6029cb0ed05502d461ccd28
4
- data.tar.gz: b94a39e616e35d1fc24b6cfdb288e85be31ea639a10b34a26aa8c797aac406cf
3
+ metadata.gz: c505462c2443fab0fc10d257d4a505ffc9d2433c77ee45948f1055c4a119e90f
4
+ data.tar.gz: b4e3674be1d4bd2c8d924ddc7f5e8bbeef954725b433ef4880a1aa521c181ba2
5
5
  SHA512:
6
- metadata.gz: ce4fed3fa64aaf100014b275281c3639c220d98c651504f0e62a43c9be7532027d4fcf1d03cd0741a7057e247b6e2abfd80517da69f07f4d6b19781fd47f0dbc
7
- data.tar.gz: 532df7e4b842659ae92ec9189fab594c8cf96bbe2456878e8bd0e732666167e73a147ec18900203822f8a7e9ea736ae2fb641944c4b2350df2e997a0899538c2
6
+ metadata.gz: e1f62d7406f7dcc68d8e51b910a75d1a0881705af1aa64431bb87599d026486072c9341a2e2a7486207c3a198a6ad9780c673521f351178d7d7a5cb79b064803
7
+ data.tar.gz: 613f8bbe512881383033fcb8e75d7850814dad7e69a61a76dfc6569ca5e83e96a9e69db921815a81131e9e5d10611dadabed4712254849630bd19cb3f5b8ed3b
data/.shipkit.yml CHANGED
@@ -1,2 +1,2 @@
1
1
  ---
2
- previous_version: 0.7.4
2
+ previous_version: 0.8.1
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mensa (0.7.4)
4
+ mensa (0.8.1)
5
5
  csv
6
6
  importmap-rails
7
7
  pagy (>= 43)
@@ -9,7 +9,7 @@ PATH
9
9
  rails (>= 7.1)
10
10
  rubyzip (>= 1.2.2)
11
11
  stimulus-rails
12
- tailwindcss-rails (~> 3.3)
12
+ tailwindcss-rails (>= 3.3, < 5)
13
13
  turbo-rails
14
14
  view_component (>= 3)
15
15
 
@@ -0,0 +1,6 @@
1
+ /* Entry point for tailwindcss-rails v4 (Tailwind CSS v4).
2
+ The host app includes it with: @import "../builds/tailwind/mensa";
3
+ Imported into the components layer so utility classes still override component styles, as they did in v3 */
4
+ @import "../../stylesheets/mensa/application.css" layer(components);
5
+
6
+ @source "../../..";
@@ -1,73 +1,71 @@
1
- .mensa-table {
2
- &__add_filter {
3
- @apply relative inline-flex items-center;
4
-
5
- &__trigger {
6
- /* Hidden by default; shown via sibling selector when filter pills exist */
7
- @apply hidden items-center justify-center w-5 h-5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 cursor-pointer transition-colors text-sm;
8
- }
9
-
10
- &__enter-hint {
11
- display: none;
12
- @apply text-xs text-gray-400 bg-gray-100 dark:bg-gray-700 rounded px-1.5 py-0.5 whitespace-nowrap;
13
- }
14
-
15
- &__checkbox {
16
- @apply h-4 w-4 flex-none rounded border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 inline-block;
17
-
18
- &--checked {
19
- @apply bg-gray-900 border-gray-900 dark:bg-white dark:border-white;
20
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='white'%3E%3Cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3E%3C/svg%3E");
21
- background-size: 100% 100%;
22
- background-repeat: no-repeat;
23
- background-position: center;
24
- }
25
- }
26
-
27
- &__popover_container {
28
- @apply p-4 fixed z-50 w-96 max-h-96 overflow-y-auto rounded-lg bg-white dark:bg-gray-800 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm;
29
-
30
- &__heading {
31
- @apply font-semibold text-gray-900 dark:text-gray-100 mb-2;
32
- }
33
-
34
- input&__input {
35
- @apply w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-3 py-2 text-sm text-gray-900 dark:text-gray-100 shadow-sm placeholder:text-gray-400 focus:border-primary-500 focus:ring-2 focus:ring-primary-500 focus:outline-none;
36
- }
37
-
38
- &__separator {
39
- @apply border-t border-gray-200 dark:border-gray-600 my-3 -mx-4;
40
- }
41
-
42
- &__values {
43
- @apply mb-2;
44
- }
45
-
46
- &__value {
47
- @apply flex items-center gap-2 py-1.5 px-2 rounded-md cursor-pointer text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 select-none;
48
-
49
- &__check {
50
- @apply w-4 flex-none inline-flex items-center justify-center text-xs;
51
- }
52
- }
53
-
54
- &__operators {
55
- @apply mb-2;
56
- }
57
-
58
- &__operator {
59
- @apply flex items-center gap-2 py-1.5 rounded-md cursor-pointer text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 select-none;
60
-
61
- &__check {
62
- @apply w-4 flex-none inline-flex items-center justify-center text-xs;
63
- }
64
- }
65
-
66
- &__clear {
67
- @apply flex items-center gap-2 mt-3 text-gray-500 dark:text-gray-400 no-underline hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer;
68
- }
69
- }
70
- }
1
+ .mensa-table__add_filter {
2
+ @apply relative inline-flex items-center;
3
+ }
4
+
5
+ .mensa-table__add_filter__trigger {
6
+ /* Hidden by default; shown via sibling selector when filter pills exist */
7
+ @apply hidden items-center justify-center w-5 h-5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 cursor-pointer transition-colors text-sm;
8
+ }
9
+
10
+ .mensa-table__add_filter__enter-hint {
11
+ display: none;
12
+ @apply text-xs text-gray-400 bg-gray-100 dark:bg-gray-700 rounded px-1.5 py-0.5 whitespace-nowrap;
13
+ }
14
+
15
+ .mensa-table__add_filter__checkbox {
16
+ @apply h-4 w-4 flex-none rounded border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 inline-block;
17
+ }
18
+
19
+ .mensa-table__add_filter__checkbox--checked {
20
+ @apply bg-gray-900 border-gray-900 dark:bg-white dark:border-white;
21
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='white'%3E%3Cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3E%3C/svg%3E");
22
+ background-size: 100% 100%;
23
+ background-repeat: no-repeat;
24
+ background-position: center;
25
+ }
26
+
27
+ .mensa-table__add_filter__popover_container {
28
+ @apply p-4 fixed z-50 w-96 max-h-96 overflow-y-auto rounded-lg bg-white dark:bg-gray-800 text-base shadow-lg ring-1 ring-black/5 focus:outline-none sm:text-sm;
29
+ }
30
+
31
+ .mensa-table__add_filter__popover_container__heading {
32
+ @apply font-semibold text-gray-900 dark:text-gray-100 mb-2;
33
+ }
34
+
35
+ input.mensa-table__add_filter__popover_container__input {
36
+ @apply w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 px-3 py-2 text-sm text-gray-900 dark:text-gray-100 shadow-sm placeholder:text-gray-400 focus:border-primary-500 focus:ring-2 focus:ring-primary-500 focus:outline-none;
37
+ }
38
+
39
+ .mensa-table__add_filter__popover_container__separator {
40
+ @apply border-t border-gray-200 dark:border-gray-600 my-3 -mx-4;
41
+ }
42
+
43
+ .mensa-table__add_filter__popover_container__values {
44
+ @apply mb-2;
45
+ }
46
+
47
+ .mensa-table__add_filter__popover_container__value {
48
+ @apply flex items-center gap-2 py-1.5 px-2 rounded-md cursor-pointer text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 select-none;
49
+ }
50
+
51
+ .mensa-table__add_filter__popover_container__value__check {
52
+ @apply w-4 flex-none inline-flex items-center justify-center text-xs;
53
+ }
54
+
55
+ .mensa-table__add_filter__popover_container__operators {
56
+ @apply mb-2;
57
+ }
58
+
59
+ .mensa-table__add_filter__popover_container__operator {
60
+ @apply flex items-center gap-2 py-1.5 rounded-md cursor-pointer text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 select-none;
61
+ }
62
+
63
+ .mensa-table__add_filter__popover_container__operator__check {
64
+ @apply w-4 flex-none inline-flex items-center justify-center text-xs;
65
+ }
66
+
67
+ .mensa-table__add_filter__popover_container__clear {
68
+ @apply flex items-center gap-2 mt-3 text-gray-500 dark:text-gray-400 no-underline hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer;
71
69
  }
72
70
 
73
71
  /* Show key hint on hover or keyboard highlight — covers column list and value popover */
@@ -9,7 +9,7 @@
9
9
  <i class="<%= Mensa.config.icons[:add_filter_trigger] %>"></i>
10
10
  </button>
11
11
 
12
- <ul class="hidden fixed z-50 w-96 max-h-96 overflow-auto rounded-lg bg-white p-2 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:bg-gray-800 sm:text-sm"
12
+ <ul class="hidden fixed z-50 w-96 max-h-96 overflow-auto rounded-lg bg-white p-2 text-base shadow-lg ring-1 ring-black/5 focus:outline-none dark:bg-gray-800 sm:text-sm"
13
13
  data-mensa-add-filter-target="filterList">
14
14
  <% table.columns.select(&:filter?).each do |column| %>
15
15
  <li class="text-gray-900 hover:bg-gray-100 relative flex cursor-default select-none items-center gap-2 rounded-md px-3 py-2 dark:text-gray-300 dark:hover:bg-gray-700"
@@ -1,40 +1,41 @@
1
- .mensa-table {
2
- &__column_customizer {
3
- &__popover {
4
- @apply fixed z-50 w-96 max-h-96 overflow-y-auto rounded-xl bg-white dark:bg-gray-800 shadow-lg ring-1 ring-black ring-opacity-5 py-2;
5
- }
1
+ .mensa-table__column_customizer {
6
2
 
7
- &__heading {
8
- @apply px-4 pt-2 pb-1 text-sm font-semibold tracking-wider text-gray-900 dark:text-gray-500;
9
- }
3
+ /* Show the correct visibility icon based on the row's data-visible attribute
4
+ without depending on specific Font Awesome class names. */
5
+ }
6
+
7
+ .mensa-table__column_customizer__popover {
8
+ @apply fixed z-50 w-96 max-h-96 overflow-y-auto rounded-xl bg-white dark:bg-gray-800 shadow-lg ring-1 ring-black/5 py-2;
9
+ }
10
+
11
+ .mensa-table__column_customizer__heading {
12
+ @apply px-4 pt-2 pb-1 text-sm font-semibold tracking-wider text-gray-900 dark:text-gray-500;
13
+ }
14
+
15
+ .mensa-table__column_customizer__row {
16
+ @apply flex items-center gap-3 px-4 py-2 hover:bg-gray-50 dark:hover:bg-gray-700 cursor-grab select-none;
17
+ }
10
18
 
11
- &__row {
12
- @apply flex items-center gap-3 px-4 py-2 hover:bg-gray-50 dark:hover:bg-gray-700 cursor-grab select-none;
13
- }
19
+ .mensa-table__column_customizer__handle {
20
+ @apply text-gray-300 dark:text-gray-600 text-xs flex-none;
21
+ }
14
22
 
15
- &__handle {
16
- @apply text-gray-300 dark:text-gray-600 text-xs flex-none;
17
- }
23
+ .mensa-table__column_customizer__name {
24
+ @apply flex-1 text-sm text-gray-700 dark:text-gray-200 truncate;
25
+ }
18
26
 
19
- &__name {
20
- @apply flex-1 text-sm text-gray-700 dark:text-gray-200 truncate;
27
+ .mensa-table__column_customizer__name--hidden {
28
+ @apply text-gray-400 dark:text-gray-500;
29
+ }
21
30
 
22
- &--hidden {
23
- @apply text-gray-400 dark:text-gray-500;
24
- }
25
- }
31
+ .mensa-table__column_customizer__visibility {
32
+ @apply flex-none text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 cursor-pointer;
33
+ }
26
34
 
27
- &__visibility {
28
- @apply flex-none text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 cursor-pointer;
29
- }
35
+ .mensa-table__column_customizer__row[data-visible="true"] [data-icon-role="hidden"] {
36
+ display: none;
37
+ }
30
38
 
31
- /* Show the correct visibility icon based on the row's data-visible attribute
32
- without depending on specific Font Awesome class names. */
33
- &__row[data-visible="true"] [data-icon-role="hidden"] {
34
- display: none;
35
- }
36
- &__row[data-visible="false"] [data-icon-role="visible"] {
37
- display: none;
38
- }
39
- }
39
+ .mensa-table__column_customizer__row[data-visible="false"] [data-icon-role="visible"] {
40
+ display: none;
40
41
  }
@@ -342,7 +342,7 @@ export default class ColumnCustomizerController extends ApplicationController {
342
342
 
343
343
  // Tables built with different params keep separate browser state.
344
344
  get storageName() {
345
- return this.storageKeyValue || this.tableNameValue;
345
+ return this.tableStorageKey || this.storageKeyValue || this.tableNameValue;
346
346
  }
347
347
 
348
348
  get _columnOrderKey() {
@@ -1,160 +1,156 @@
1
- .mensa-table {
2
- &__control_bar {
3
- &__button {
4
- @apply h-[26px] inline-flex items-center justify-center gap-1 cursor-pointer rounded-md px-1.5 text-sm text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-600 hover:text-gray-700 dark:hover:text-gray-200 focus:outline-none transition-colors;
5
- }
6
-
7
- &__badge {
8
- @apply absolute -top-1.5 -right-1.5 inline-flex items-center justify-center min-w-[1.125rem] h-[1.125rem] px-1 rounded-full bg-primary-600 text-white text-[0.625rem] font-semibold leading-none ring-2 ring-white dark:ring-gray-800;
9
- }
10
-
11
- &__save-dropdown {
12
- @apply fixed z-50 min-w-[10rem] rounded-lg bg-white dark:bg-gray-800 shadow-lg ring-1 ring-black/5 dark:ring-white/10 py-1 px-2;
13
- }
14
-
15
- &__save-dropdown-item {
16
- @apply w-full flex items-center px-3 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer text-left;
17
- }
18
- }
1
+ .mensa-table__control_bar__button {
2
+ @apply h-[26px] inline-flex items-center justify-center gap-1 cursor-pointer rounded-md px-1.5 text-sm text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-600 hover:text-gray-700 dark:hover:text-gray-200 focus:outline-none transition-colors;
3
+ }
19
4
 
20
- &__save-reset {
21
- @apply flex items-center gap-1;
22
- }
5
+ .mensa-table__control_bar__badge {
6
+ @apply absolute -top-1.5 -right-1.5 inline-flex items-center justify-center min-w-[1.125rem] h-[1.125rem] px-1 rounded-full bg-primary-600 text-white text-[0.625rem] font-semibold leading-none ring-2 ring-white dark:ring-gray-800;
7
+ }
23
8
 
24
- &__export-dialog {
25
- @apply w-[34rem] max-w-[92vw] max-h-[85vh] rounded-2xl border-0 p-0 bg-white dark:bg-gray-800 shadow-2xl ring-1 ring-black/5 dark:ring-white/10 text-gray-900 dark:text-gray-100;
9
+ .mensa-table__control_bar__save-dropdown {
10
+ @apply fixed z-50 min-w-[10rem] rounded-lg bg-white dark:bg-gray-800 shadow-lg ring-1 ring-black/5 dark:ring-white/10 py-1 px-2;
11
+ }
26
12
 
27
- &::backdrop {
28
- @apply bg-gray-900/40;
29
- backdrop-filter: blur(2px);
30
- }
13
+ .mensa-table__control_bar__save-dropdown-item {
14
+ @apply w-full flex items-center px-3 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer text-left;
15
+ }
31
16
 
32
- &__panel {
33
- @apply flex flex-col max-h-[85vh] overflow-hidden;
34
- }
17
+ .mensa-table__save-reset {
18
+ @apply flex items-center gap-1;
19
+ }
35
20
 
36
- &__header {
37
- @apply flex items-center justify-between gap-4 px-6 py-4 border-b border-gray-200 dark:border-gray-700;
38
- }
21
+ .mensa-table__export-dialog {
22
+ @apply w-[34rem] max-w-[92vw] max-h-[85vh] rounded-2xl border-0 p-0 bg-white dark:bg-gray-800 shadow-2xl ring-1 ring-black/5 dark:ring-white/10 text-gray-900 dark:text-gray-100;
39
23
 
40
- &__title {
41
- @apply text-lg font-semibold leading-6 text-gray-900 dark:text-gray-100;
42
- }
24
+ &::backdrop {
25
+ @apply bg-gray-900/40;
26
+ backdrop-filter: blur(2px);
27
+ }
28
+ }
43
29
 
44
- &__close {
45
- @apply cursor-pointer text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 focus:outline-none;
46
- }
30
+ .mensa-table__export-dialog__panel {
31
+ @apply flex flex-col max-h-[85vh] overflow-hidden;
32
+ }
47
33
 
48
- &__body {
49
- @apply flex flex-col gap-5 p-6 min-h-0 overflow-y-auto;
50
- }
34
+ .mensa-table__export-dialog__header {
35
+ @apply flex items-center justify-between gap-4 px-6 py-4 border-b border-gray-200 dark:border-gray-700;
36
+ }
51
37
 
52
- &__section-title {
53
- @apply text-sm font-semibold text-gray-900 dark:text-gray-100 mb-2;
54
- }
38
+ .mensa-table__export-dialog__title {
39
+ @apply text-lg font-semibold leading-6 text-gray-900 dark:text-gray-100;
40
+ }
55
41
 
56
- &__empty {
57
- @apply flex h-44 items-center justify-center rounded-lg ring-1 ring-gray-200 dark:ring-gray-700 px-3 text-center text-sm text-gray-500 dark:text-gray-400;
58
- }
42
+ .mensa-table__export-dialog__close {
43
+ @apply cursor-pointer text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 focus:outline-none;
44
+ }
59
45
 
60
- &__list {
61
- @apply flex flex-col divide-y divide-gray-100 dark:divide-gray-700 rounded-lg ring-1 ring-gray-200 dark:ring-gray-700 h-44 overflow-x-hidden overflow-y-auto;
62
- }
46
+ .mensa-table__export-dialog__body {
47
+ @apply flex flex-col gap-5 p-6 min-h-0 overflow-y-auto;
48
+ }
63
49
 
64
- &__item {
65
- @apply flex shrink-0 items-center gap-3 px-3 py-2.5;
66
- }
50
+ .mensa-table__export-dialog__section-title {
51
+ @apply text-sm font-semibold text-gray-900 dark:text-gray-100 mb-2;
52
+ }
67
53
 
68
- &__delete-form {
69
- @apply shrink-0;
70
- }
54
+ .mensa-table__export-dialog__empty {
55
+ @apply flex h-44 items-center justify-center rounded-lg ring-1 ring-gray-200 dark:ring-gray-700 px-3 text-center text-sm text-gray-500 dark:text-gray-400;
56
+ }
71
57
 
72
- &__delete {
73
- @apply inline-flex h-9 w-9 items-center justify-center rounded-md text-gray-400 dark:text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-red-600 dark:hover:text-red-400 focus:outline-none focus:ring-2 focus:ring-red-500/30 transition-colors cursor-pointer;
74
- }
58
+ .mensa-table__export-dialog__list {
59
+ @apply flex flex-col divide-y divide-gray-100 dark:divide-gray-700 rounded-lg ring-1 ring-gray-200 dark:ring-gray-700 h-44 overflow-x-hidden overflow-y-auto;
60
+ }
75
61
 
76
- &__item-info {
77
- @apply flex flex-col min-w-0 flex-1;
78
- }
62
+ .mensa-table__export-dialog__item {
63
+ @apply flex shrink-0 items-center gap-3 px-3 py-2.5;
64
+ }
79
65
 
80
- &__item-name {
81
- @apply text-sm font-medium text-gray-900 dark:text-gray-100 truncate;
82
- }
66
+ .mensa-table__export-dialog__delete-form {
67
+ @apply shrink-0;
68
+ }
83
69
 
84
- &__item-repeat {
85
- @apply text-xs font-normal text-gray-500 dark:text-gray-400;
86
- }
70
+ .mensa-table__export-dialog__delete {
71
+ @apply inline-flex h-9 w-9 items-center justify-center rounded-md text-gray-400 dark:text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-red-600 dark:hover:text-red-400 focus:outline-none focus:ring-2 focus:ring-red-500/30 transition-colors cursor-pointer;
72
+ }
87
73
 
88
- &__item-meta {
89
- @apply text-xs font-normal text-gray-400 dark:text-gray-500;
90
- }
74
+ .mensa-table__export-dialog__item-info {
75
+ @apply flex flex-col min-w-0 flex-1;
76
+ }
91
77
 
92
- &__item-password {
93
- @apply inline-flex items-center gap-1 text-xs text-gray-500 dark:text-gray-400;
94
- }
78
+ .mensa-table__export-dialog__item-name {
79
+ @apply text-sm font-medium text-gray-900 dark:text-gray-100 truncate;
80
+ }
95
81
 
96
- &__item-password-value {
97
- @apply rounded bg-gray-100 dark:bg-gray-700 px-1 py-0.5 font-mono text-[0.6875rem] text-gray-700 dark:text-gray-200;
98
- }
82
+ .mensa-table__export-dialog__item-repeat {
83
+ @apply text-xs font-normal text-gray-500 dark:text-gray-400;
84
+ }
99
85
 
100
- &__item-password-copy {
101
- @apply inline-flex h-5 w-5 items-center justify-center rounded text-gray-400 hover:bg-gray-100 hover:text-gray-700 dark:text-gray-500 dark:hover:bg-gray-700 dark:hover:text-gray-200 focus:outline-none focus:ring-2 focus:ring-gray-400 cursor-pointer;
102
- }
86
+ .mensa-table__export-dialog__item-meta {
87
+ @apply text-xs font-normal text-gray-400 dark:text-gray-500;
88
+ }
89
+
90
+ .mensa-table__export-dialog__item-password {
91
+ @apply inline-flex items-center gap-1 text-xs text-gray-500 dark:text-gray-400;
92
+ }
103
93
 
104
- &__download {
105
- @apply inline-flex items-center gap-1.5 rounded-md bg-white dark:bg-gray-700 px-2.5 py-1.5 text-sm font-medium text-primary-600 dark:text-primary-300 ring-1 ring-inset ring-gray-300 dark:ring-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600;
106
- }
94
+ .mensa-table__export-dialog__item-password-value {
95
+ @apply rounded bg-gray-100 dark:bg-gray-700 px-1 py-0.5 font-mono text-[0.6875rem] text-gray-700 dark:text-gray-200;
96
+ }
97
+
98
+ .mensa-table__export-dialog__item-password-copy {
99
+ @apply inline-flex h-5 w-5 items-center justify-center rounded text-gray-400 hover:bg-gray-100 hover:text-gray-700 dark:text-gray-500 dark:hover:bg-gray-700 dark:hover:text-gray-200 focus:outline-none focus:ring-2 focus:ring-gray-400 cursor-pointer;
100
+ }
107
101
 
108
- &__status {
109
- @apply inline-flex items-center gap-1.5 text-sm;
102
+ .mensa-table__export-dialog__download {
103
+ @apply inline-flex items-center gap-1.5 rounded-md bg-white dark:bg-gray-700 px-2.5 py-1.5 text-sm font-medium text-primary-600 dark:text-primary-300 ring-1 ring-inset ring-gray-300 dark:ring-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600;
104
+ }
105
+
106
+ .mensa-table__export-dialog__status {
107
+ @apply inline-flex items-center gap-1.5 text-sm;
108
+ }
109
+
110
+ .mensa-table__export-dialog__status--pending {
111
+ @apply text-gray-500 dark:text-gray-400;
112
+ }
110
113
 
111
- &--pending {
112
- @apply text-gray-500 dark:text-gray-400;
113
- }
114
+ .mensa-table__export-dialog__status--failed {
115
+ @apply text-red-600 dark:text-red-400 font-medium;
116
+ }
114
117
 
115
- &--failed {
116
- @apply text-red-600 dark:text-red-400 font-medium;
117
- }
118
- }
118
+ .mensa-table__export-dialog__form {
119
+ @apply flex flex-col gap-5 border-t border-gray-200 dark:border-gray-700 pt-5;
120
+ }
119
121
 
120
- &__form {
121
- @apply flex flex-col gap-5 border-t border-gray-200 dark:border-gray-700 pt-5;
122
- }
122
+ .mensa-table__export-dialog__fieldset {
123
+ @apply flex flex-col gap-2 border-0 p-0 m-0;
124
+ }
123
125
 
124
- &__fieldset {
125
- @apply flex flex-col gap-2 border-0 p-0 m-0;
126
- }
127
-
128
- &__option {
129
- @apply flex items-start gap-2.5 text-sm text-gray-700 dark:text-gray-300 cursor-pointer;
126
+ .mensa-table__export-dialog__option {
127
+ @apply flex items-start gap-2.5 text-sm text-gray-700 dark:text-gray-300 cursor-pointer;
130
128
 
131
- input {
132
- @apply mt-0.5 text-primary-600 focus:ring-primary-500;
133
- }
134
- }
129
+ input {
130
+ @apply mt-0.5 text-primary-600 focus:ring-primary-500;
131
+ }
132
+ }
135
133
 
136
- &__repeat-options {
137
- @apply pl-6;
138
- }
134
+ .mensa-table__export-dialog__repeat-options {
135
+ @apply pl-6;
136
+ }
139
137
 
140
- &__select {
141
- @apply w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-opacity-20 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100;
142
- }
138
+ .mensa-table__export-dialog__select {
139
+ @apply w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100;
140
+ }
143
141
 
144
- &__actions {
145
- @apply flex justify-end gap-2 pt-1;
146
- }
142
+ .mensa-table__export-dialog__actions {
143
+ @apply flex justify-end gap-2 pt-1;
144
+ }
147
145
 
148
- &__button {
149
- @apply inline-flex items-center gap-1.5 rounded-lg px-3.5 py-2 text-sm font-semibold shadow-sm focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition-colors;
146
+ .mensa-table__export-dialog__button {
147
+ @apply inline-flex items-center gap-1.5 rounded-lg px-3.5 py-2 text-sm font-semibold shadow-sm focus:outline-none focus:ring-2 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition-colors;
148
+ }
150
149
 
151
- &--secondary {
152
- @apply bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 ring-1 ring-inset ring-gray-300 dark:ring-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600 focus:ring-gray-400;
153
- }
150
+ .mensa-table__export-dialog__button--secondary {
151
+ @apply bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 ring-1 ring-inset ring-gray-300 dark:ring-gray-600 hover:bg-gray-50 dark:hover:bg-gray-600 focus:ring-gray-400;
152
+ }
154
153
 
155
- &--primary {
156
- @apply bg-primary-600 text-white hover:bg-primary-500 focus:ring-primary-500;
157
- }
158
- }
159
- }
154
+ .mensa-table__export-dialog__button--primary {
155
+ @apply bg-primary-600 text-white hover:bg-primary-500 focus:ring-primary-500;
160
156
  }
@@ -1,20 +1,20 @@
1
1
  .mensa-empty-state {
2
2
  @apply flex flex-col items-center justify-center py-16 px-6 text-center bg-white dark:bg-gray-800;
3
+ }
3
4
 
4
- &__icon {
5
- @apply text-gray-300 dark:text-gray-600 mb-6;
6
- font-size: 4.5rem;
7
- }
5
+ .mensa-empty-state__icon {
6
+ @apply text-gray-300 dark:text-gray-600 mb-6;
7
+ font-size: 4.5rem;
8
+ }
8
9
 
9
- &__title {
10
- @apply text-lg font-semibold text-gray-900 dark:text-gray-100 mb-2;
11
- }
10
+ .mensa-empty-state__title {
11
+ @apply text-lg font-semibold text-gray-900 dark:text-gray-100 mb-2;
12
+ }
12
13
 
13
- &__subtitle {
14
- @apply text-sm text-gray-500 dark:text-gray-400 mb-8 max-w-sm;
15
- }
14
+ .mensa-empty-state__subtitle {
15
+ @apply text-sm text-gray-500 dark:text-gray-400 mb-8 max-w-sm;
16
+ }
16
17
 
17
- &__button {
18
- @apply inline-flex items-center px-6 py-2.5 rounded-full text-sm font-semibold bg-gray-900 dark:bg-gray-100 text-white dark:text-gray-900 hover:bg-gray-700 dark:hover:bg-gray-300 cursor-pointer transition-colors focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2;
19
- }
18
+ .mensa-empty-state__button {
19
+ @apply inline-flex items-center px-6 py-2.5 rounded-full text-sm font-semibold bg-gray-900 dark:bg-gray-100 text-white dark:text-gray-900 hover:bg-gray-700 dark:hover:bg-gray-300 cursor-pointer transition-colors focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2;
20
20
  }