lostcoords-ui 0.4.1 → 0.6.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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +364 -96
  3. data/app/assets/tailwind/lostcoords/ui/avatar.css +6 -6
  4. data/app/assets/tailwind/lostcoords/ui/base.css +45 -0
  5. data/app/assets/tailwind/lostcoords/ui/card.css +23 -22
  6. data/app/assets/tailwind/lostcoords/ui/choice.css +39 -0
  7. data/app/assets/tailwind/lostcoords/ui/code-block.css +10 -0
  8. data/app/assets/tailwind/lostcoords/ui/{disclosure.css → collapsible.css} +6 -6
  9. data/app/assets/tailwind/lostcoords/ui/components/code-block.css +5 -0
  10. data/app/assets/tailwind/lostcoords/ui/components/collapsible.css +5 -0
  11. data/app/assets/tailwind/lostcoords/ui/components/dialog.css +9 -0
  12. data/app/assets/tailwind/lostcoords/ui/components/emoji-picker.css +5 -0
  13. data/app/assets/tailwind/lostcoords/ui/components/menu.css +5 -0
  14. data/app/assets/tailwind/lostcoords/ui/components/prose.css +3 -0
  15. data/app/assets/tailwind/lostcoords/ui/components/table.css +3 -0
  16. data/app/assets/tailwind/lostcoords/ui/components/toast.css +5 -0
  17. data/app/assets/tailwind/lostcoords/ui/components/tooltip.css +4 -0
  18. data/app/assets/tailwind/lostcoords/ui/components.css +12 -0
  19. data/app/assets/tailwind/lostcoords/ui/copy-button.css +9 -9
  20. data/app/assets/tailwind/lostcoords/ui/core.css +21 -0
  21. data/app/assets/tailwind/lostcoords/ui/dialog.css +17 -17
  22. data/app/assets/tailwind/lostcoords/ui/emoji-picker.css +86 -88
  23. data/app/assets/tailwind/lostcoords/ui/field.css +2 -2
  24. data/app/assets/tailwind/lostcoords/ui/glass.css +9 -8
  25. data/app/assets/tailwind/lostcoords/ui/layout.css +2 -2
  26. data/app/assets/tailwind/lostcoords/ui/popover.css +14 -14
  27. data/app/assets/tailwind/lostcoords/ui/prose.css +66 -0
  28. data/app/assets/tailwind/lostcoords/ui/sheet.css +62 -63
  29. data/app/assets/tailwind/lostcoords/ui/squircle.css +7 -27
  30. data/app/assets/tailwind/lostcoords/ui/table.css +51 -0
  31. data/app/assets/tailwind/lostcoords/ui/theme.css +209 -225
  32. data/app/assets/tailwind/lostcoords/ui/toast.css +23 -0
  33. data/app/assets/tailwind/lostcoords/ui/tooltip.css +51 -0
  34. data/app/assets/tailwind/lostcoords/ui/typography.css +31 -61
  35. data/app/assets/tailwind/lostcoords/ui/ui.css +2 -21
  36. data/app/assets/tailwind/lostcoords/ui/utilities.css +14 -22
  37. data/app/helpers/lostcoords/ui/badge_helper.rb +67 -110
  38. data/app/helpers/lostcoords/ui/button_helper.rb +44 -35
  39. data/app/helpers/lostcoords/ui/card_helper.rb +9 -52
  40. data/app/helpers/lostcoords/ui/choice_helper.rb +87 -0
  41. data/app/helpers/lostcoords/ui/code_block_helper.rb +22 -0
  42. data/app/helpers/lostcoords/ui/collapsible_helper.rb +9 -0
  43. data/app/helpers/lostcoords/ui/copy_button_helper.rb +7 -7
  44. data/app/helpers/lostcoords/ui/description_list_helper.rb +12 -0
  45. data/app/helpers/lostcoords/ui/dialog_helper.rb +15 -17
  46. data/app/helpers/lostcoords/ui/emoji_picker_helper.rb +6 -0
  47. data/app/helpers/lostcoords/ui/feedback_helper.rb +25 -6
  48. data/app/helpers/lostcoords/ui/form_helper.rb +36 -59
  49. data/app/helpers/lostcoords/ui/glass_helper.rb +7 -7
  50. data/app/helpers/lostcoords/ui/layout_helper.rb +13 -11
  51. data/app/helpers/lostcoords/ui/menu_helper.rb +45 -10
  52. data/app/helpers/lostcoords/ui/navigation_helper.rb +144 -0
  53. data/app/helpers/lostcoords/ui/primitives_helper.rb +39 -61
  54. data/app/helpers/lostcoords/ui/reading_helper.rb +2 -2
  55. data/app/helpers/lostcoords/ui/render_attributes_helper.rb +17 -1
  56. data/app/helpers/lostcoords/ui/sheet_helper.rb +7 -45
  57. data/app/helpers/lostcoords/ui/structures_helper.rb +26 -125
  58. data/app/helpers/lostcoords/ui/table_helper.rb +11 -0
  59. data/app/helpers/lostcoords/ui/tailwind_helper.rb +13 -4
  60. data/app/helpers/lostcoords/ui/toast_helper.rb +22 -0
  61. data/app/helpers/lostcoords/ui/tooltip_helper.rb +17 -0
  62. data/app/helpers/lostcoords/ui/typography_helper.rb +41 -11
  63. data/app/javascript/lostcoords/ui/controllers/lc_code_block_controller.js +23 -0
  64. data/app/javascript/lostcoords/ui/controllers/{disclosure_controller.js → lc_collapsible_controller.js} +4 -4
  65. data/app/javascript/lostcoords/ui/controllers/{confirm_dialog_controller.js → lc_confirm_dialog_controller.js} +4 -4
  66. data/app/javascript/lostcoords/ui/controllers/{modal_controller.js → lc_dialog_controller.js} +1 -1
  67. data/app/javascript/lostcoords/ui/controllers/{emoji_picker_controller.js → lc_emoji_picker_controller.js} +38 -10
  68. data/app/javascript/lostcoords/ui/controllers/lc_kbd_controller.js +12 -0
  69. data/app/javascript/lostcoords/ui/controllers/{row_menu_controller.js → lc_menu_controller.js} +25 -3
  70. data/app/javascript/lostcoords/ui/controllers/{ui_popover_controller.js → lc_popover_controller.js} +1 -1
  71. data/app/javascript/lostcoords/ui/controllers/{ui_selection_controller.js → lc_selection_controller.js} +7 -15
  72. data/app/javascript/lostcoords/ui/controllers/{sheet_controller.js → lc_sheet_controller.js} +17 -17
  73. data/app/javascript/lostcoords/ui/controllers/lc_shortcut_controller.js +45 -0
  74. data/app/javascript/lostcoords/ui/controllers/lc_tabs_controller.js +42 -0
  75. data/app/javascript/lostcoords/ui/controllers/{toast_controller.js → lc_toast_controller.js} +2 -2
  76. data/app/javascript/lostcoords/ui/controllers/lc_toast_region_controller.js +62 -0
  77. data/app/javascript/lostcoords/ui/controllers/lc_tooltip_controller.js +54 -0
  78. data/app/javascript/lostcoords/ui/helpers/catalog_picker.js +77 -25
  79. data/app/javascript/lostcoords/ui/helpers/context_dialog.js +6 -6
  80. data/app/javascript/lostcoords/ui/helpers/dialog.js +2 -2
  81. data/app/javascript/lostcoords/ui/helpers/dismiss_stack.js +30 -7
  82. data/app/javascript/lostcoords/ui/helpers/floating_panel.js +7 -8
  83. data/app/javascript/lostcoords/ui/helpers/menu_keys.js +19 -18
  84. data/app/javascript/lostcoords/ui/helpers/roving_focus.js +175 -0
  85. data/app/javascript/lostcoords/ui/helpers/sheet_motion.js +4 -4
  86. data/app/javascript/lostcoords/ui/helpers/shortcuts.js +162 -0
  87. data/app/javascript/lostcoords/ui/helpers/top_layer.js +48 -10
  88. data/app/javascript/lostcoords/ui/index.js +57 -0
  89. data/app/views/lostcoords/ui/components/_emoji_picker.html.erb +46 -46
  90. data/app/views/lostcoords/ui/components/_emoji_picker_grid.html.erb +3 -3
  91. data/app/views/lostcoords/ui/components/_lc_code_block.html.erb +18 -0
  92. data/app/views/lostcoords/ui/components/_lc_collapsible.html.erb +5 -0
  93. data/app/views/lostcoords/ui/components/_lc_dialog.html.erb +11 -8
  94. data/app/views/lostcoords/ui/components/_lc_floating_panel.html.erb +8 -0
  95. data/config/importmap.rb +10 -2
  96. data/config/locales/en.yml +23 -0
  97. data/config/locales/es.yml +23 -0
  98. data/config/locales/ja.yml +23 -0
  99. data/lib/lostcoords/ui/action_view.rb +6 -3
  100. data/lib/lostcoords/ui/builders.rb +2 -2
  101. data/lib/lostcoords/ui/form_builder.rb +126 -0
  102. data/lib/lostcoords/ui/parts.rb +154 -0
  103. data/lib/lostcoords/ui/stylesheets.rb +25 -0
  104. data/lib/lostcoords/ui/tokens.rb +24 -1
  105. data/lib/lostcoords/ui/version.rb +1 -1
  106. data/lib/tasks/lostcoords_ui.rake +11 -0
  107. metadata +54 -21
  108. data/app/assets/tailwind/lostcoords/ui/reading.css +0 -60
  109. data/app/views/lostcoords/ui/components/_form_alert.html.erb +0 -4
  110. data/app/views/lostcoords/ui/components/_lc_disclosure.html.erb +0 -5
  111. data/app/views/lostcoords/ui/components/_skeleton.html.erb +0 -4
  112. data/app/views/lostcoords/ui/components/_spinner.html.erb +0 -10
  113. data/app/views/lostcoords/ui/components/_ui_floating_panel.html.erb +0 -8
  114. data/config/helper_renames.json +0 -113
  115. data/script/migrate_helpers.rb +0 -136
  116. /data/app/javascript/lostcoords/ui/controllers/{ui_copy_controller.js → lc_copy_controller.js} +0 -0
  117. /data/app/javascript/lostcoords/ui/controllers/{ui_toggle_controller.js → lc_toggle_controller.js} +0 -0
@@ -1,142 +1,141 @@
1
1
  @layer components {
2
2
  @media (width < 40rem) {
3
- .sheet {
3
+ .lc-sheet {
4
4
  position: fixed;
5
5
 
6
6
  /* Anchored from the top edge at the screen height it opened at
7
- (sheet_controller), then lifted by its own height. In-app browsers
7
+ (lc-sheet), then lifted by its own height. In-app browsers
8
8
  (Brave, Chrome) resize the page under the keyboard; anything hung
9
9
  from the bottom edge jumps a frame as they do, but the top holds. */
10
- inset: var(--sheet-floor, 100dvh) 0 auto;
10
+ inset: var(--lc-sheet-floor, 100dvh) 0 auto;
11
11
  translate: 0 -100%;
12
12
  margin: 0;
13
- z-index: var(--z-index-prompt);
14
13
  inline-size: 100%;
15
- max-block-size: calc(var(--sheet-floor, 100dvh) * 0.9);
14
+ max-block-size: calc(var(--lc-sheet-floor, 100dvh) * 0.9);
16
15
  overflow-y: auto;
17
16
  overscroll-behavior: contain;
18
17
  padding-block-end: max(env(safe-area-inset-bottom), 1rem);
19
- border: 1px solid var(--glass-edge);
18
+ border: 1px solid var(--lc-glass-edge);
20
19
  border-start-start-radius: var(--radius-3xl);
21
20
  border-start-end-radius: var(--radius-3xl);
22
21
 
23
22
  /* Published as a variable, not just applied, because the sticky chrome
24
23
  that rides on top of the sheet — the grabber bar, the pinned action
25
24
  row — has to paint the *same* surface or it reads as a seam. In dark
26
- mode the sheet is a lightened paper-2/paper-3 mix while --paper is
25
+ mode the sheet is a lightened paper-2/paper-3 mix while --background is
27
26
  0.045 lightness darker, which is exactly the band you could see. */
28
- --sheet-bg: var(--paper);
27
+ --lc-sheet-bg: var(--background);
29
28
  @supports (background: light-dark(white, black)) {
30
- --sheet-bg: light-dark(var(--paper), color-mix(in oklab, var(--paper-2) 92%, var(--paper-3)));
29
+ --lc-sheet-bg: light-dark(var(--background), color-mix(in oklab, var(--muted) 92%, var(--accent)));
31
30
  }
32
- background: var(--sheet-bg);
33
- color: var(--ink);
34
- box-shadow: 0 -12px 40px -12px color-mix(in oklab, var(--ink) 45%, transparent);
35
- transform: translateY(var(--sheet-offscreen));
31
+ background: var(--lc-sheet-bg);
32
+ color: var(--foreground);
33
+ box-shadow: 0 -12px 40px -12px color-mix(in oklab, var(--foreground) 45%, transparent);
34
+ transform: translateY(var(--lc-sheet-offscreen));
36
35
  transition:
37
- transform var(--sheet-duration) var(--ease-sheet),
38
- display var(--sheet-duration) allow-discrete,
39
- overlay var(--sheet-duration) allow-discrete;
36
+ transform var(--lc-sheet-duration) var(--lc-ease-sheet),
37
+ display var(--lc-sheet-duration) allow-discrete,
38
+ overlay var(--lc-sheet-duration) allow-discrete;
40
39
  }
41
40
 
42
41
  /* Popover-API reveal (currency): top layer drives display, so showPopover()/
43
42
  hidePopover() animate the slide both ways, with a native ::backdrop. */
44
- .sheet[popover] { display: none; flex-direction: column; max-block-size: min(calc(var(--sheet-floor, 100svh) * 0.72), 34rem); }
45
- .sheet[popover]:popover-open {
43
+ .lc-sheet[popover] { display: none; flex-direction: column; max-block-size: min(calc(var(--lc-sheet-floor, 100svh) * 0.72), 34rem); }
44
+ .lc-sheet[popover]:popover-open {
46
45
  display: flex;
47
46
  transform: translateY(0);
48
47
 
49
- @starting-style { transform: translateY(var(--sheet-offscreen)); }
48
+ @starting-style { transform: translateY(var(--lc-sheet-offscreen)); }
50
49
  }
51
- .sheet[popover]::backdrop {
52
- background: var(--scrim);
50
+ .lc-sheet[popover]::backdrop {
51
+ background: var(--lc-scrim);
53
52
  backdrop-filter: blur(2px);
54
53
  opacity: 0;
55
54
  transition:
56
- opacity var(--sheet-duration) var(--ease-sheet),
57
- display var(--sheet-duration) allow-discrete,
58
- overlay var(--sheet-duration) allow-discrete;
55
+ opacity var(--lc-sheet-duration) var(--lc-ease-sheet),
56
+ display var(--lc-sheet-duration) allow-discrete,
57
+ overlay var(--lc-sheet-duration) allow-discrete;
59
58
 
60
59
  @media (prefers-reduced-motion: reduce) { transition: none; }
61
60
  }
62
- .sheet[popover]:popover-open::backdrop { opacity: 1; @starting-style { opacity: 0; } }
61
+ .lc-sheet[popover]:popover-open::backdrop { opacity: 1; @starting-style { opacity: 0; } }
63
62
 
64
63
  /* UIKit's 36×5 grabber. */
65
- :is([data-sheet-target~="handle"], dialog[data-controller~="sheet"])::before {
64
+ :is([data-lc-sheet-target~="handle"], dialog[data-controller~="lc-sheet"])::before {
66
65
  content: "";
67
66
  display: block;
68
67
  inline-size: 2.25rem;
69
68
  block-size: 0.3125rem;
70
69
  border-radius: 9999px;
71
- background: color-mix(in oklab, var(--ink-3) 45%, transparent);
70
+ background: color-mix(in oklab, var(--muted-foreground) 45%, transparent);
72
71
  }
73
72
  }
74
73
  }
75
74
 
76
75
  @layer modules {
77
- /* Phones: every modal dialog is an iOS sheet (sheet_controller). It floats
76
+ /* Phones: every modal dialog is an iOS sheet (lc-sheet). It floats
78
77
  inset with all corners round while it is short, and docks to the screen
79
- edges as it reaches the large detent: --sheet-p runs 0 → 1 between them.
78
+ edges as it reaches the large detent: --lc-sheet-p runs 0 → 1 between them.
80
79
  Lives in this layer so it out-ranks a dialog's own frame. */
81
80
  @media (width < 40rem) {
82
- dialog[data-controller~="sheet"] {
83
- --sheet-p: 0;
84
- --sheet-inset: 0.5rem;
85
- --sheet-radius: 2.25rem;
86
- --sheet-bg: var(--paper);
87
- --sheet-gap: calc(var(--sheet-inset) * (1 - var(--sheet-p)));
81
+ dialog[data-controller~="lc-sheet"] {
82
+ --lc-sheet-p: 0;
83
+ --lc-sheet-inset: 0.5rem;
84
+ --lc-sheet-radius: 2.25rem;
85
+ --lc-sheet-bg: var(--background);
86
+ --lc-sheet-gap: calc(var(--lc-sheet-inset) * (1 - var(--lc-sheet-p)));
88
87
 
89
88
  position: fixed;
90
89
 
91
- /* Anchored from the top edge, like .sheet: the keyboard covers it and
90
+ /* Anchored from the top edge, like .lc-sheet: the keyboard covers it and
92
91
  nothing moves. */
93
- inset: calc(var(--sheet-floor, 100dvh) - var(--sheet-gap)) 0 auto;
92
+ inset: calc(var(--lc-sheet-floor, 100dvh) - var(--lc-sheet-gap)) 0 auto;
94
93
  translate: 0 -100%;
95
- margin: 0 var(--sheet-gap);
94
+ margin: 0 var(--lc-sheet-gap);
96
95
  inline-size: auto;
97
96
  max-inline-size: none;
98
97
  block-size: auto;
99
- max-block-size: calc(var(--sheet-floor, 100dvh) - max(env(safe-area-inset-top), 0.75rem) - 0.625rem);
100
- padding: 0 0 max(0px, calc(env(safe-area-inset-bottom) - var(--sheet-gap)));
98
+ max-block-size: calc(var(--lc-sheet-floor, 100dvh) - max(env(safe-area-inset-top), 0.75rem) - 0.625rem);
99
+ padding: 0 0 max(0px, calc(env(safe-area-inset-bottom) - var(--lc-sheet-gap)));
101
100
  overflow: hidden auto;
102
101
  overscroll-behavior: contain;
103
102
  scrollbar-width: none;
104
- border: 1px solid var(--glass-edge);
103
+ border: 1px solid var(--lc-glass-edge);
105
104
  border-radius:
106
- var(--sheet-radius) var(--sheet-radius)
107
- calc(var(--sheet-radius) * (1 - var(--sheet-p))) calc(var(--sheet-radius) * (1 - var(--sheet-p)));
108
- background: var(--sheet-bg);
109
- box-shadow: var(--glass-rim), 0 -8px 40px -12px rgb(0 0 0 / 0.28);
105
+ var(--lc-sheet-radius) var(--lc-sheet-radius)
106
+ calc(var(--lc-sheet-radius) * (1 - var(--lc-sheet-p))) calc(var(--lc-sheet-radius) * (1 - var(--lc-sheet-p)));
107
+ background: var(--lc-sheet-bg);
108
+ box-shadow: var(--lc-glass-rim), 0 -8px 40px -12px rgb(0 0 0 / 0.28);
110
109
  opacity: 1;
111
- transform: translateY(var(--sheet-offscreen));
110
+ transform: translateY(var(--lc-sheet-offscreen));
112
111
  transform-origin: bottom center;
113
112
  transition:
114
- transform var(--sheet-duration) var(--ease-sheet),
115
- display var(--sheet-duration) allow-discrete,
116
- overlay var(--sheet-duration) allow-discrete;
113
+ transform var(--lc-sheet-duration) var(--lc-ease-sheet),
114
+ display var(--lc-sheet-duration) allow-discrete,
115
+ overlay var(--lc-sheet-duration) allow-discrete;
117
116
 
118
117
  &[open] {
119
118
  transform: none;
120
119
 
121
- @starting-style { transform: translateY(var(--sheet-offscreen)); }
120
+ @starting-style { transform: translateY(var(--lc-sheet-offscreen)); }
122
121
  }
123
122
 
124
123
  &::before {
125
124
  position: absolute;
126
- z-index: calc(var(--z-index-art) + 1);
125
+ z-index: 1;
127
126
  inset: 0.3125rem auto auto 50%;
128
127
  translate: -50% 0;
129
128
  pointer-events: none;
130
129
  }
131
130
 
132
131
  &::backdrop {
133
- background: var(--scrim-sheet);
132
+ background: var(--lc-scrim-sheet);
134
133
  backdrop-filter: none;
135
134
  opacity: 0;
136
135
  transition:
137
- opacity var(--sheet-duration) var(--ease-sheet),
138
- display var(--sheet-duration) allow-discrete,
139
- overlay var(--sheet-duration) allow-discrete;
136
+ opacity var(--lc-sheet-duration) var(--lc-ease-sheet),
137
+ display var(--lc-sheet-duration) allow-discrete,
138
+ overlay var(--lc-sheet-duration) allow-discrete;
140
139
  }
141
140
 
142
141
  &[open]::backdrop {
@@ -151,19 +150,19 @@
151
150
  }
152
151
 
153
152
  /* Behind a large sheet the page shrinks back and rounds off, over black,
154
- as UIKit's page sheet does; sheet_controller drives the variables. */
155
- html[data-sheet-page] {
153
+ as UIKit's page sheet does; lc-sheet drives the variables. */
154
+ html[data-lc-sheet-page] {
156
155
  background: #000;
157
156
 
158
157
  > body {
159
- transform-origin: 50% var(--sheet-page-origin, 0);
158
+ transform-origin: 50% var(--lc-sheet-page-origin, 0);
160
159
  transform:
161
- translateY(calc(var(--sheet-page-p, 0) * (max(env(safe-area-inset-top), 0.75rem) - 0.25rem)))
162
- scale(var(--sheet-page-scale, 1));
163
- clip-path: inset(var(--sheet-page-origin, 0) 0 0 round calc(var(--sheet-page-p, 0) * 0.75rem));
160
+ translateY(calc(var(--lc-sheet-page-p, 0) * (max(env(safe-area-inset-top), 0.75rem) - 0.25rem)))
161
+ scale(var(--lc-sheet-page-scale, 1));
162
+ clip-path: inset(var(--lc-sheet-page-origin, 0) 0 0 round calc(var(--lc-sheet-page-p, 0) * 0.75rem));
164
163
  transition:
165
- transform var(--sheet-page-transition, 0s),
166
- clip-path var(--sheet-page-transition, 0s);
164
+ transform var(--lc-sheet-page-transition, 0s),
165
+ clip-path var(--lc-sheet-page-transition, 0s);
167
166
  }
168
167
  }
169
168
  }
@@ -1,31 +1,11 @@
1
- /* WebKit ignores corner-shape and keeps plain rounded corners. A squircle reads
2
- tighter than a circular arc of the same radius, so the 12/16/24 tiers grow. */
3
- @layer theme {
1
+ /* Squircle corners where the browser supports corner-shape. WebKit keeps plain
2
+ rounded corners. A squircle reads tighter than a circular arc of the same
3
+ radius, so its radius grows by a third. Library surfaces carry this class;
4
+ host elements are never matched by their rounded-* classes. */
5
+ @utility lc-squircle {
4
6
  @supports (corner-shape: squircle) {
5
- body {
6
- --radius-xl: 1.125rem;
7
- --radius-2xl: 1.5rem;
8
- --radius-3xl: 2rem;
9
-
10
- & :is(
11
- [class*="rounded-xl"], [class*="rounded-2xl"], [class*="rounded-3xl"],
12
- [class*="rounded-t-"], [class*="rounded-b-"],
13
- [class*="rounded-ss-"], [class*="rounded-se-"],
14
- [class*="rounded-es-"], [class*="rounded-ee-"],
15
- [class*="[&_button]:rounded-xl"] button,
16
- [class*="before:rounded-xl"]::before
17
- ):not([class*="rounded-full"]) {
18
- corner-shape: squircle;
19
- }
20
- }
21
- }
22
- }
23
-
24
- /* For surfaces whose radius comes from a variable or a stylesheet, which the class
25
- match above can't see. The card, dialog, menu, badge and picker builders carry it. */
26
- @utility squircle {
27
- @supports (corner-shape: squircle) {
28
- &:not([class*="rounded-full"]) {
7
+ &:not([class*="rounded-full"], [class*="rounded-pill"]) {
8
+ --lc-corner-scale: 1.333;
29
9
  corner-shape: squircle;
30
10
  }
31
11
  }
@@ -0,0 +1,51 @@
1
+ @layer components {
2
+ .lc-table {
3
+ --table-rule: color-mix(in oklab, var(--foreground) 8%, transparent);
4
+ border-collapse: collapse;
5
+
6
+ & :where(th, td) {
7
+ padding: var(--spacing-heading) var(--spacing-content);
8
+ }
9
+
10
+ & :where(th) {
11
+ text-align: inherit;
12
+ font-weight: 600;
13
+ }
14
+
15
+ & :where(thead th) {
16
+ background-color: var(--muted);
17
+ color: var(--muted-foreground);
18
+ font-size: var(--text-caption);
19
+ line-height: var(--text-caption--line-height);
20
+ border-block-end: thin solid color-mix(in oklab, var(--foreground) 14%, transparent);
21
+ }
22
+
23
+ & :where(tbody tr > *) {
24
+ border-block-end: thin solid var(--table-rule);
25
+ }
26
+
27
+ & :where(tbody:last-of-type tr:last-child > *) {
28
+ border-block-end: 0;
29
+ }
30
+
31
+ & :where(tbody tr) {
32
+ transition: background-color 150ms ease-out;
33
+ }
34
+
35
+ & :where(tbody tr:hover) {
36
+ background-color: color-mix(in oklab, var(--foreground) 4%, transparent);
37
+ }
38
+
39
+ & :where(caption) {
40
+ padding: 0 var(--spacing-content) var(--spacing-heading);
41
+ color: var(--muted-foreground);
42
+ text-align: start;
43
+ }
44
+ }
45
+
46
+ @media (prefers-reduced-motion: reduce) {
47
+ .lc-table :where(tbody tr) {
48
+ transition: none;
49
+ }
50
+ }
51
+ }