css-zero 3.1.0 → 4.0.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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +807 -0
  3. data/LICENSE.txt +21 -0
  4. data/app/assets/stylesheets/css-zero/animations.css +50 -50
  5. data/app/assets/stylesheets/css-zero/effects.css +14 -7
  6. data/app/assets/stylesheets/css-zero/filters.css +33 -41
  7. data/app/assets/stylesheets/css-zero/reset.css +19 -17
  8. data/app/assets/stylesheets/css-zero/transitions.css +12 -0
  9. data/app/assets/stylesheets/css-zero/typography.css +5 -2
  10. data/app/assets/stylesheets/css-zero/utilities.css +20 -23
  11. data/lib/css_zero/version.rb +1 -1
  12. data/lib/generators/css_zero/add/USAGE +1 -1
  13. data/lib/generators/css_zero/add/resources.yml +16 -13
  14. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/accordion.css +16 -6
  15. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/alert.css +1 -1
  16. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/autoanimate.css +2 -1
  17. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/avatar.css +11 -11
  18. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/badge.css +2 -3
  19. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/button.css +19 -9
  20. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/card.css +1 -1
  21. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/carousel.css +2 -2
  22. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/combobox.css +21 -17
  23. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/command.css +8 -15
  24. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/datepicker.css +27 -19
  25. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/dialog.css +14 -9
  26. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/dropzone.css +1 -1
  27. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/flash.css +49 -30
  28. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/group.css +4 -0
  29. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/input.css +1 -1
  30. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/keyboard.css +21 -0
  31. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/layouts.css +2 -2
  32. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/lexxy.css +46 -0
  33. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/lightbox.css +2 -2
  34. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/list.css +1 -1
  35. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/menu.css +5 -3
  36. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/pagination.css +17 -0
  37. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/popover.css +51 -5
  38. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/progress.css +8 -8
  39. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/sheet.css +18 -12
  40. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/sidebar_menu.css +3 -1
  41. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/switch.css +17 -7
  42. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/tabs.css +24 -8
  43. data/lib/generators/css_zero/add/templates/app/javascript/controllers/autosave_controller.js +1 -1
  44. data/lib/generators/css_zero/add/templates/app/javascript/controllers/chart_controller.js +22 -5
  45. data/lib/generators/css_zero/add/templates/app/javascript/controllers/combobox_controller.js +4 -4
  46. data/lib/generators/css_zero/add/templates/app/javascript/controllers/command_controller.js +5 -0
  47. data/lib/generators/css_zero/add/templates/app/javascript/controllers/dialog_controller.js +3 -5
  48. data/lib/generators/css_zero/add/templates/app/javascript/controllers/dropzone_controller.js +2 -2
  49. data/lib/generators/css_zero/add/templates/app/javascript/controllers/flash_controller.js +1 -1
  50. data/lib/generators/css_zero/add/templates/app/javascript/controllers/form_controller.js +4 -0
  51. data/lib/generators/css_zero/add/templates/app/javascript/controllers/interest_controller.js +27 -0
  52. data/lib/generators/css_zero/add/templates/app/javascript/controllers/sortable_controller.js +2 -2
  53. data/lib/generators/css_zero/add/templates/app/javascript/controllers/sound_controller.js +70 -0
  54. data/lib/generators/css_zero/authentication/templates/app/views/passwords/edit.html.erb.tt +1 -1
  55. data/lib/generators/css_zero/authentication/templates/app/views/passwords/new.html.erb.tt +1 -1
  56. data/lib/generators/css_zero/authentication/templates/app/views/sessions/new.html.erb.tt +2 -2
  57. data/lib/generators/css_zero/install/templates/app/assets/stylesheets/base.css +2 -3
  58. data/lib/generators/css_zero/install/templates/app/views/layouts/application.html.erb +2 -2
  59. data/lib/generators/css_zero/scaffold/templates/index.html.erb.tt +1 -1
  60. data/lib/generators/css_zero/scaffold/templates/partial.html.erb.tt +2 -2
  61. metadata +24 -6
  62. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/prose.css +0 -140
  63. data/lib/generators/css_zero/add/templates/app/assets/stylesheets/trix.css +0 -210
  64. data/lib/generators/css_zero/add/templates/app/javascript/controllers/popover_controller.js +0 -55
@@ -1,47 +1,66 @@
1
1
  .flash {
2
- animation: appear-then-fade 4s 300ms both;
3
- background-color: var(--flash-background, var(--color-text));
4
- border-radius: var(--rounded-full);
5
- color: var(--flash-color, var(--color-text-reversed));
6
- margin-block-start: var(--flash-position, var(--size-5));
7
- margin-inline: auto;
2
+ animation: flash-in-out 5s both;
3
+ animation-timing-function: var(--ease-bounce-2);
4
+ background-color: var(--color-surface);
5
+ border-radius: var(--rounded-lg);
6
+ border-width: var(--border);
7
+ box-shadow: var(--shadow-md);
8
+ color: var(--color-text);
9
+ font-size: var(--text-sm);
10
+ inline-size: var(--size-full);
11
+ margin: var(--flash-position, var(--size-6)) auto auto;
12
+ max-inline-size: calc(100% - 2rem);
8
13
 
9
14
  &:is(:hover, :focus-within) {
10
15
  animation-play-state: paused;
11
16
  }
12
- }
13
-
14
- .flash__content {
15
- align-items: center;
16
- column-gap: var(--size-2);
17
- display: flex;
18
- font-size: var(--text-fluid-base);
19
- justify-content: center;
20
- line-height: var(--leading-none);
21
- min-block-size: var(--size-11);
22
- padding: var(--size-1) var(--size-4);
23
- text-align: center;
24
- }
25
17
 
26
- .flash--positive {
27
- --flash-color: light-dark(var(--green-400), var(--green-600));
18
+ @media (width >= 40rem) {
19
+ max-inline-size: var(--flash-size, var(--max-i-sm));
20
+ }
28
21
  }
29
22
 
30
- .flash--negative {
31
- --flash-color: light-dark(var(--red-400), var(--red-600));
23
+ .flash__content {
24
+ padding: var(--size-4);
32
25
  }
33
26
 
34
27
  .flash--extended {
35
28
  animation-duration: 12s;
36
- animation-name: appear-then-fade-extended;
29
+ animation-name: flash-in-out-extended;
37
30
  }
38
31
 
39
- @keyframes appear-then-fade {
40
- 0%, 100% { opacity: 0; }
41
- 5%, 60% { opacity: 1; }
32
+ @keyframes flash-in-out {
33
+ 0% {
34
+ opacity: 0;
35
+ transform: translateY(-100%);
36
+ }
37
+
38
+ 8%, 92% {
39
+ opacity: 1;
40
+ transform: translateY(0);
41
+ animation-timing-function: ease-out;
42
+ }
43
+
44
+ 100% {
45
+ opacity: 0;
46
+ transform: translateY(-100%);
47
+ }
42
48
  }
43
49
 
44
- @keyframes appear-then-fade-extended {
45
- 0%, 100% { opacity: 0; }
46
- 2%, 90% { opacity: 1; }
50
+ @keyframes flash-in-out-extended {
51
+ 0% {
52
+ opacity: 0;
53
+ transform: translateY(-100%);
54
+ }
55
+
56
+ 3.3%, 96.7% {
57
+ opacity: 1;
58
+ transform: translateY(0);
59
+ animation-timing-function: ease-out;
60
+ }
61
+
62
+ 100% {
63
+ opacity: 0;
64
+ transform: translateY(-100%);
65
+ }
47
66
  }
@@ -2,6 +2,7 @@
2
2
  align-items: stretch;
3
3
  display: flex;
4
4
  flex-direction: row;
5
+ inline-size: fit-content;
5
6
 
6
7
  > :not(:first-child) {
7
8
  border-end-start-radius: 0;
@@ -15,6 +16,7 @@
15
16
  }
16
17
 
17
18
  > :focus-visible {
19
+ position: relative;
18
20
  z-index: 1;
19
21
  }
20
22
  }
@@ -23,6 +25,7 @@
23
25
  align-items: stretch;
24
26
  display: flex;
25
27
  flex-direction: column;
28
+ inline-size: fit-content;
26
29
 
27
30
  > :not(:first-child) {
28
31
  border-block-start: 0;
@@ -36,6 +39,7 @@
36
39
  }
37
40
 
38
41
  > :focus-visible {
42
+ position: relative;
39
43
  z-index: 1;
40
44
  }
41
45
  }
@@ -8,7 +8,7 @@
8
8
  box-shadow: var(--input-box-shadow, var(--shadow-xs));
9
9
  font-size: var(--input-font-size, var(--text-sm));
10
10
  inline-size: var(--input-inline-size, var(--size-full));
11
- padding: var(--input-padding, .375rem .75rem);
11
+ padding: var(--input-padding, .25rem .625rem);
12
12
  }
13
13
 
14
14
  &:is([type="checkbox"], [type="radio"]) {
@@ -0,0 +1,21 @@
1
+ .kbd {
2
+ align-items: center;
3
+ background-color: var(--kbd-background, var(--color-secondary));
4
+ border-radius: var(--kbd-radius, var(--rounded-md));
5
+ color: var(--kbd-color, var(--color-text-subtle));
6
+ display: inline-flex;
7
+ font-family: inherit;
8
+ font-size: var(--kbd-font-size, var(--text-xs));
9
+ font-weight: var(--font-medium);
10
+ column-gap: var(--size-1);
11
+ justify-content: center;
12
+ padding-inline: var(--kbd-padding, var(--size-1));
13
+ pointer-events: none;
14
+ user-select: none;
15
+ }
16
+
17
+ .kbd--tooltip {
18
+ --kbd-background: rgb(from var(--color-text-reversed) r g b / .2);
19
+ --kbd-color: var(--color-text-reversed);
20
+ }
21
+
@@ -5,7 +5,7 @@
5
5
  grid-template-columns: var(--sidebar-width, 0) 1fr;
6
6
  grid-template-rows: auto 1fr;
7
7
 
8
- &:is(.closed) {
8
+ &.closed {
9
9
  --sidebar-border-width: 0;
10
10
  --sidebar-padding: 0;
11
11
  --sidebar-width: 0;
@@ -64,8 +64,8 @@
64
64
  #main {
65
65
  display: flex;
66
66
  flex-direction: column;
67
- gap: var(--size-4);
68
67
  grid-area: main;
69
68
  overflow: auto;
70
69
  padding: var(--size-4);
70
+ row-gap: var(--size-4);
71
71
  }
@@ -0,0 +1,46 @@
1
+ @import url("https://esm.sh/@37signals/lexxy@0.9.24/dist/stylesheets/lexxy.css");
2
+
3
+ :root {
4
+ --lexxy-color-ink: var(--color-text);
5
+ --lexxy-color-ink-medium: var(--color-text-subtle);
6
+ --lexxy-color-ink-light: var(--color-border-dark);
7
+ --lexxy-color-ink-lighter: var(--color-border);
8
+ --lexxy-color-ink-lightest: var(--color-border-light);
9
+ --lexxy-color-ink-inverted: var(--color-text-reversed);
10
+ --lexxy-color-accent-dark: var(--color-link);
11
+ --lexxy-color-accent-medium: var(--lexxy-color-accent-dark);
12
+ --lexxy-color-accent-light: var(--color-border-light);
13
+ --lexxy-color-accent-lightest: var(--lexxy-color-accent-light);
14
+ --lexxy-font-base: var(--font-system-ui);
15
+ --lexxy-font-mono: var(--font-monospace-code);
16
+ }
17
+
18
+ :where(lexxy-toolbar) {
19
+ background: var(--lexxy-color-canvas);
20
+ border-color: var(--lexxy-color-ink-lighter);
21
+ border-start-end-radius: .35rem;
22
+ border-start-start-radius: .35rem;
23
+ font-size: var(--text-base);
24
+ line-height: var(--leading-none);
25
+ }
26
+
27
+ .lexxy-editor__content {
28
+ outline: 0;
29
+ }
30
+
31
+ .lexxy-editor__toolbar-button::after {
32
+ box-sizing: content-box;
33
+ }
34
+
35
+ .lexxy-code-language-picker {
36
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m12 19.5c-.7 0-1.3-.3-1.7-.8l-9.8-11.1c-.7-.8-.6-1.9.2-2.6.8-.6 1.9-.6 2.5.2l8.6 9.8c0 .1.2.1.4 0l8.6-9.8c.7-.8 1.8-.9 2.6-.2s.9 1.8.2 2.6l-9.8 11.1c-.4.5-1.1.8-1.7.8z' fill='%23808080'/%3E%3C/svg%3E");
37
+ }
38
+
39
+ .lexxy--borderless {
40
+ lexxy-toolbar { border-radius: 0; }
41
+ lexxy-editor { border-block-end: 0; border-inline: 0; border-radius: 0; }
42
+ }
43
+
44
+ .lexxy--sticky-toolbar {
45
+ lexxy-toolbar { inset-block-start: 0; position: sticky; z-index: 10; }
46
+ }
@@ -2,8 +2,8 @@
2
2
  background-color: rgba(0, 0, 0, .8);
3
3
  block-size: 100dvh;
4
4
  inline-size: 100dvw;
5
- max-block-size: unset;
6
- max-inline-size: unset;
5
+ max-block-size: none;
6
+ max-inline-size: none;
7
7
  padding: var(--size-4);
8
8
 
9
9
  &[open] {
@@ -7,7 +7,7 @@
7
7
  .list-row {
8
8
  background-color: var(--item-background, transparent);
9
9
  border: 1px solid var(--item-border-color, var(--color-border));
10
- border-radius: var(--rounded-lg);
10
+ border-radius: var(--rounded-xl);
11
11
  font-size: var(--text-sm);
12
12
  padding: var(--size-4);
13
13
  }
@@ -7,9 +7,10 @@
7
7
  }
8
8
 
9
9
  .menu__header {
10
- font-size: var(--text-sm);
10
+ color: var(--color-text-subtle);
11
+ font-size: var(--text-xs);
11
12
  font-weight: var(--font-medium);
12
- padding: var(--size-1_5) var(--size-2);
13
+ padding: var(--size-1) var(--size-1_5);
13
14
  }
14
15
 
15
16
  .menu__group {
@@ -28,7 +29,8 @@
28
29
  --btn-font-weight: var(--font-normal);
29
30
  --btn-justify-content: start;
30
31
  --btn-outline-size: 0;
31
- --btn-padding: var(--size-1_5) var(--size-2);
32
+ --btn-padding: var(--size-1) var(--size-1_5);
33
+ --btn-radius: var(--rounded-md);
32
34
 
33
35
  &:focus-visible {
34
36
  --btn-background: var(--color-border-light);
@@ -0,0 +1,17 @@
1
+ .pagination {
2
+ align-items: center;
3
+ column-gap: var(--size-1);
4
+ display: flex;
5
+ }
6
+
7
+ .pagination__button {
8
+ --btn-background: transparent;
9
+ --btn-border-color: transparent;
10
+ --btn-box-shadow: none;
11
+ --btn-cursor: pointer;
12
+
13
+ &[aria-current="page"] {
14
+ --btn-border-color: var(--color-border);
15
+ }
16
+ }
17
+
@@ -1,19 +1,24 @@
1
1
  .popover {
2
2
  background-color: var(--color-surface);
3
- border-radius: var(--rounded-md);
3
+ border-radius: var(--rounded-lg);
4
4
  border-width: var(--border);
5
5
  box-shadow: var(--shadow-md);
6
6
  color: var(--color-text);
7
7
  inline-size: var(--popover-size, max-content);
8
8
 
9
+ /* Anchor position */
10
+ position-area: var(--popover-position, block-end);
11
+ position-try-fallbacks: var(--popover-position-try-fallbacks, flip-block);
12
+ margin-block: var(--popover-margin-block, .25rem 0);
13
+
9
14
  /* Setup transition */
10
15
  transition-behavior: allow-discrete;
11
- transition-duration: var(--time-150);
12
- transition-property: display, overlay, opacity, transform;
16
+ transition-duration: var(--time-300);
17
+ transition-property: display, opacity, overlay, transform;
18
+ transition-timing-function: var(--ease-spring-2);
13
19
 
14
20
  /* Exit stage to */
15
- opacity: 0;
16
- transform: var(--scale-95);
21
+ opacity: 0; transform: var(--scale-95);
17
22
 
18
23
  /* On stage */
19
24
  &:popover-open {
@@ -26,4 +31,45 @@
26
31
  opacity: 0; transform: var(--scale-95);
27
32
  }
28
33
  }
34
+
35
+ @supports (-webkit-hyphens: none) {
36
+ transition-behavior: normal;
37
+ }
38
+ }
39
+
40
+ .popover--unanchored {
41
+ --popover-position: none;
42
+ --popover-position-try-fallbacks: none;
43
+ --popover-margin-block: 0;
44
+ }
45
+
46
+ .popover--block-end-center {
47
+ --popover-position: block-end;
48
+ --popover-margin-block: .25rem 0;
49
+ }
50
+
51
+ .popover--block-end-start {
52
+ --popover-position: block-end span-inline-end;
53
+ --popover-margin-block: .25rem 0;
29
54
  }
55
+
56
+ .popover--block-end-end {
57
+ --popover-position: block-end span-inline-start;
58
+ --popover-margin-block: .25rem 0;
59
+ }
60
+
61
+ .popover--block-start-center {
62
+ --popover-position: block-start;
63
+ --popover-margin-block: 0 .25rem;
64
+ }
65
+
66
+ .popover--block-start-start {
67
+ --popover-position: block-start span-inline-end;
68
+ --popover-margin-block: 0 .25rem;
69
+ }
70
+
71
+ .popover--block-start-end {
72
+ --popover-position: block-start span-inline-start;
73
+ --popover-margin-block: 0 .25rem;
74
+ }
75
+
@@ -1,27 +1,27 @@
1
1
  .progress {
2
- --progress: var(--color-primary);
3
- --track: rgb(from var(--color-primary) r g b / .2);
2
+ --progress-bar-color: rgb(from var(--color-primary) r g b / .2);
3
+ --progress-value-color: var(--color-primary);
4
4
 
5
- background-color: var(--track);
5
+ background-color: var(--progress-bar-color);
6
6
  block-size: var(--size-2);
7
7
  border-radius: var(--rounded-full);
8
8
  inline-size: var(--size-full);
9
9
  overflow: hidden;
10
10
 
11
11
  &:indeterminate {
12
- animation: progress-loading 2s infinite;
13
- background: linear-gradient(to right, var(--track) 45%, var(--progress) 0%, var(--progress) 55%, var(--track) 0%);
12
+ animation: progress-loading 2s linear infinite;
13
+ background: linear-gradient(to right, var(--progress-bar-color) 45%, var(--progress-value-color) 0%, var(--progress-value-color) 55%, var(--progress-bar-color) 0%);
14
14
  background-position: right;
15
15
  background-size: 225% 100%;
16
16
  }
17
17
 
18
18
  /* Safari/Chromium */
19
19
  &::-webkit-progress-bar {
20
- background-color: var(--track);
20
+ background-color: var(--progress-bar-color);
21
21
  }
22
22
 
23
23
  &::-webkit-progress-value {
24
- background-color: var(--progress);
24
+ background-color: var(--progress-value-color);
25
25
  }
26
26
 
27
27
  &:indeterminate::-webkit-progress-bar {
@@ -30,7 +30,7 @@
30
30
 
31
31
  /* Firefox */
32
32
  &::-moz-progress-bar {
33
- background-color: var(--progress);
33
+ background-color: var(--progress-value-color);
34
34
  }
35
35
 
36
36
  &:indeterminate::-moz-progress-bar {
@@ -5,36 +5,42 @@
5
5
  box-shadow: var(--shadow-lg);
6
6
  color: var(--color-text);
7
7
  inline-size: var(--sheet-size, var(--size-3-4));
8
- margin-inline: var(--sheet-margin);
9
- max-block-size: unset;
8
+ margin-inline: var(--sheet-margin-inline);
9
+ max-block-size: none;
10
10
 
11
11
  &::backdrop {
12
- background-color: rgba(0, 0, 0, .5);
12
+ backdrop-filter: var(--blur-xs);
13
13
  }
14
14
 
15
15
  /* Setup transition */
16
16
  transition-behavior: allow-discrete;
17
17
  transition-duration: var(--time-300);
18
- transition-property: display, overlay, transform;
18
+ transition-property: display, overlay, opacity, transform;
19
+ transition-timing-function: var(--ease-spring-2);
19
20
 
20
21
  &::backdrop {
21
22
  transition-behavior: allow-discrete;
22
23
  transition-duration: var(--time-150);
23
24
  transition-property: display, overlay, opacity;
25
+ transition-timing-function: var(--ease-out-3);
24
26
  }
25
27
 
26
28
  /* Exit stage to */
27
- & { transform: var(--sheet-transform); }
29
+ & { opacity: 0; transform: var(--sheet-transform); }
28
30
  &::backdrop { opacity: 0; }
29
31
 
30
32
  /* On stage */
31
- &[open] { transform: translateX(0); }
33
+ &[open] { opacity: 1; transform: translateX(0); }
32
34
  &[open]::backdrop { opacity: 1; }
33
35
 
34
36
  /* Enter stage from */
35
37
  @starting-style {
36
- &[open] { transform: var(--sheet-transform); }
37
- &[open]::backdrop { opacity: 0;}
38
+ &[open] { opacity: 0; transform: var(--sheet-transform); }
39
+ &[open]::backdrop { opacity: 0; }
40
+ }
41
+
42
+ @supports (-webkit-hyphens: none) {
43
+ transition-behavior: normal;
38
44
  }
39
45
 
40
46
  @media (width >= 40rem) {
@@ -44,14 +50,14 @@
44
50
 
45
51
  .sheet--left {
46
52
  --sheet-border: 0 1px;
47
- --sheet-margin: 0 auto;
48
- --sheet-transform: translateX(-100%);
53
+ --sheet-margin-inline: 0 auto;
54
+ --sheet-transform: translateX(-2.5rem);
49
55
  }
50
56
 
51
57
  .sheet--right {
52
58
  --sheet-border: 1px 0;
53
- --sheet-margin: auto 0;
54
- --sheet-transform: translateX(100%);
59
+ --sheet-margin-inline: auto 0;
60
+ --sheet-transform: translateX(2.5rem);
55
61
  }
56
62
 
57
63
  .sheet__content {
@@ -33,7 +33,9 @@
33
33
  mask-image: url("chevron-right.svg");
34
34
  mask-size: cover;
35
35
  min-inline-size: var(--size-4);
36
- transition: transform var(--time-200);
36
+ transition-duration: var(--time-300);
37
+ transition-property: transform;
38
+ transition-timing-function: var(--ease-spring-2);
37
39
  }
38
40
 
39
41
  details[open] > &::after {
@@ -1,29 +1,39 @@
1
1
  .switch {
2
+ --switch-size: var(--size-4);
3
+ --switch-block-size: calc(var(--switch-size) + var(--border) * 2);
4
+ --switch-inline-size: calc(var(--switch-size) * 2);
5
+
6
+ align-items: center;
2
7
  appearance: none;
3
8
  background-color: var(--color-border);
4
9
  border-color: transparent;
5
10
  border-radius: var(--rounded-full);
6
- border-width: var(--border-2);
7
- block-size: var(--size-5);
8
- inline-size: var(--size-9);
9
- transition: background-color var(--time-150);
11
+ border-width: var(--border);
12
+ block-size: var(--switch-block-size);
13
+ display: inline-flex;
14
+ inline-size: var(--switch-inline-size);
15
+ transition-duration: var(--time-150);
16
+ transition-property: background-color;
17
+ transition-timing-function: var(--ease-out-3);
10
18
 
11
19
  &:checked {
12
20
  background-color: var(--color-primary);
13
21
  }
14
22
 
15
23
  &:checked::before {
16
- margin-inline-start: var(--size-4);
24
+ translate: calc(100% - var(--border) * 2);
17
25
  }
18
26
 
19
27
  &::before {
20
28
  aspect-ratio: var(--aspect-square);
21
29
  background-color: var(--color-text-reversed);
22
- block-size: var(--size-full);
30
+ block-size: var(--switch-size);
23
31
  border-radius: var(--rounded-full);
24
32
  content: "";
25
33
  display: block;
26
- transition: margin var(--time-150);
34
+ transition-duration: var(--time-300);
35
+ transition-property: translate;
36
+ transition-timing-function: var(--ease-spring-2);
27
37
  }
28
38
 
29
39
  &:focus-visible {
@@ -5,13 +5,28 @@
5
5
  }
6
6
 
7
7
  .tabs__list {
8
+ align-self: start;
8
9
  background-color: var(--color-border-light);
9
- block-size: var(--size-9);
10
- border-radius: var(--rounded-md);
10
+ block-size: var(--size-8);
11
+ border-radius: var(--rounded-lg);
11
12
  color: var(--color-text-subtle);
12
- column-gap: var(--size-2);
13
+ column-gap: var(--size-1);
13
14
  display: inline-flex;
14
15
  padding: var(--size-1);
16
+ position: relative;
17
+
18
+ &::before {
19
+ background-color: var(--color-bg);
20
+ border-radius: var(--rounded-lg);
21
+ box-shadow: var(--shadow-sm);
22
+ content: "";
23
+ inset: anchor(top) anchor(right) anchor(bottom) anchor(left);
24
+ position: absolute;
25
+ position-anchor: --tabs-selected;
26
+ transition-duration: var(--time-300);
27
+ transition-property: inset;
28
+ transition-timing-function: var(--ease-spring-2);
29
+ }
15
30
  }
16
31
 
17
32
  .tabs__button {
@@ -19,11 +34,12 @@
19
34
  --btn-border-color: transparent;
20
35
  --btn-box-shadow: none;
21
36
  --btn-hover-color: transparent;
22
- --btn-inline-size: var(--size-full);
23
37
 
24
- &:is([aria-selected="true"], [aria-current="page"]) {
25
- --btn-background: var(--color-bg);
26
- --btn-box-shadow: var(--shadow-sm);
27
- --btn-hover-color: var(--color-bg);
38
+ &[aria-selected="true"] {
39
+ anchor-name: --tabs-selected;
40
+ }
41
+
42
+ &[aria-current="page"] {
43
+ anchor-name: --tabs-selected;
28
44
  }
29
45
  }
@@ -1,5 +1,5 @@
1
1
  import { Controller } from "@hotwired/stimulus"
2
- import { FetchRequest } from "https://esm.sh/@rails/request.js@0.0.12?standalone"
2
+ import { FetchRequest } from "https://esm.sh/@rails/request.js@0.0.13?standalone"
3
3
 
4
4
  const AUTOSAVE_INTERVAL = 3000
5
5
 
@@ -1,16 +1,33 @@
1
1
  import { Controller } from "@hotwired/stimulus"
2
- import { Chart, registerables } from "https://esm.sh/chart.js@4.5.0?standalone"
2
+ import { Chart, registerables } from "https://esm.sh/chart.js@4.5.1?standalone"
3
3
 
4
4
  export default class extends Controller {
5
5
  static values = { type: { type: String, default: "line" }, data: Object, options: Object }
6
6
 
7
7
  initialize() {
8
+ const style = getComputedStyle(document.body)
8
9
  Chart.register(...registerables)
9
- Chart.defaults.backgroundColor = getComputedStyle(document.body).backgroundColor
10
- Chart.defaults.borderColor = getComputedStyle(document.body).borderColor
11
- Chart.defaults.color = getComputedStyle(document.body).color
12
- Chart.defaults.font.family = getComputedStyle(document.body).fontFamily
10
+ Chart.defaults.color = style.color
11
+ Chart.defaults.datasets.line.tension = 0.35
12
+ Chart.defaults.datasets.radar.tension = 0
13
+ Chart.defaults.elements.arc.borderRadius = 12
14
+ Chart.defaults.elements.bar.borderRadius = 12
15
+ Chart.defaults.elements.point.radius = 0
16
+ Chart.defaults.font.family = style.fontFamily
13
17
  Chart.defaults.font.size = 12
18
+ Chart.defaults.interaction.intersect = false
19
+ Chart.defaults.plugins.legend.display = false
20
+ Chart.defaults.plugins.legend.labels.usePointStyle = true
21
+ Chart.defaults.plugins.legend.position = "bottom"
22
+ Chart.defaults.plugins.tooltip.backgroundColor = style.backgroundColor
23
+ Chart.defaults.plugins.tooltip.bodyColor = style.color
24
+ Chart.defaults.plugins.tooltip.borderColor = style.borderColor
25
+ Chart.defaults.plugins.tooltip.borderWidth = 1
26
+ Chart.defaults.plugins.tooltip.boxPadding = 4
27
+ Chart.defaults.plugins.tooltip.caretSize = 0
28
+ Chart.defaults.plugins.tooltip.titleColor = style.color
29
+ Chart.defaults.plugins.tooltip.usePointStyle = true
30
+ Chart.defaults.scale.grid.color = style.borderColor
14
31
  }
15
32
 
16
33
  connect() {
@@ -1,6 +1,6 @@
1
1
  import { Controller } from "@hotwired/stimulus"
2
- import { get } from "https://esm.sh/@rails/request.js@0.0.12?standalone"
3
- import TomSelect from "https://esm.sh/tom-select@2.4.3/base?standalone"
2
+ import { get } from "https://esm.sh/@rails/request.js@0.0.13?standalone"
3
+ import TomSelect from "https://esm.sh/tom-select@2.6.1/base?standalone"
4
4
 
5
5
  export default class extends Controller {
6
6
  static values = { url: String, optionCreate: { type: String, default: "Add" }, noResults: { type: String, default: "No results found" } }
@@ -22,7 +22,7 @@ export default class extends Controller {
22
22
  }
23
23
 
24
24
  async load(query, callback) {
25
- const response = await get(this.urlValue, { responseKind: "json", query: { q: query } })
25
+ const response = await get(this.urlValue, { responseKind: "json", query: { q: query } })
26
26
  const jsonResponse = await response.json
27
27
  callback(jsonResponse)
28
28
  }
@@ -40,7 +40,7 @@ export default class extends Controller {
40
40
  option_create: (data, escape) => {
41
41
  return `<div class="create">${this.optionCreateValue} <b>${escape(data.input)}</b>...</div>`
42
42
  },
43
- no_results: () => {
43
+ no_results: () => {
44
44
  return `<div class="no-results">${this.noResultsValue}</div>`
45
45
  }
46
46
  }