lostcoords-ui 0.4.1 → 0.5.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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +303 -89
  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 +20 -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/components.css +25 -0
  9. data/app/assets/tailwind/lostcoords/ui/copy-button.css +9 -9
  10. data/app/assets/tailwind/lostcoords/ui/dialog.css +17 -17
  11. data/app/assets/tailwind/lostcoords/ui/disclosure.css +5 -5
  12. data/app/assets/tailwind/lostcoords/ui/emoji-picker.css +43 -43
  13. data/app/assets/tailwind/lostcoords/ui/field.css +2 -2
  14. data/app/assets/tailwind/lostcoords/ui/glass.css +9 -8
  15. data/app/assets/tailwind/lostcoords/ui/layout.css +2 -2
  16. data/app/assets/tailwind/lostcoords/ui/popover.css +14 -14
  17. data/app/assets/tailwind/lostcoords/ui/reading.css +24 -24
  18. data/app/assets/tailwind/lostcoords/ui/sheet.css +60 -60
  19. data/app/assets/tailwind/lostcoords/ui/squircle.css +7 -27
  20. data/app/assets/tailwind/lostcoords/ui/table.css +51 -0
  21. data/app/assets/tailwind/lostcoords/ui/theme.css +194 -225
  22. data/app/assets/tailwind/lostcoords/ui/tooltip.css +50 -0
  23. data/app/assets/tailwind/lostcoords/ui/typography.css +37 -61
  24. data/app/assets/tailwind/lostcoords/ui/ui.css +2 -21
  25. data/app/assets/tailwind/lostcoords/ui/utilities.css +14 -22
  26. data/app/helpers/lostcoords/ui/badge_helper.rb +67 -110
  27. data/app/helpers/lostcoords/ui/button_helper.rb +36 -33
  28. data/app/helpers/lostcoords/ui/card_helper.rb +9 -52
  29. data/app/helpers/lostcoords/ui/choice_helper.rb +83 -0
  30. data/app/helpers/lostcoords/ui/code_block_helper.rb +22 -0
  31. data/app/helpers/lostcoords/ui/copy_button_helper.rb +7 -7
  32. data/app/helpers/lostcoords/ui/description_list_helper.rb +12 -0
  33. data/app/helpers/lostcoords/ui/dialog_helper.rb +6 -13
  34. data/app/helpers/lostcoords/ui/feedback_helper.rb +25 -6
  35. data/app/helpers/lostcoords/ui/form_helper.rb +36 -59
  36. data/app/helpers/lostcoords/ui/glass_helper.rb +7 -7
  37. data/app/helpers/lostcoords/ui/layout_helper.rb +13 -11
  38. data/app/helpers/lostcoords/ui/menu_helper.rb +8 -8
  39. data/app/helpers/lostcoords/ui/navigation_helper.rb +131 -0
  40. data/app/helpers/lostcoords/ui/overlay_helper.rb +17 -0
  41. data/app/helpers/lostcoords/ui/primitives_helper.rb +39 -61
  42. data/app/helpers/lostcoords/ui/reading_helper.rb +2 -2
  43. data/app/helpers/lostcoords/ui/sheet_helper.rb +3 -45
  44. data/app/helpers/lostcoords/ui/structures_helper.rb +55 -64
  45. data/app/helpers/lostcoords/ui/table_helper.rb +11 -0
  46. data/app/helpers/lostcoords/ui/tailwind_helper.rb +13 -4
  47. data/app/helpers/lostcoords/ui/typography_helper.rb +11 -11
  48. data/app/javascript/lostcoords/ui/controllers/lc_code_block_controller.js +23 -0
  49. data/app/javascript/lostcoords/ui/controllers/{disclosure_controller.js → lc_collapsible_controller.js} +3 -3
  50. data/app/javascript/lostcoords/ui/controllers/{confirm_dialog_controller.js → lc_confirm_dialog_controller.js} +4 -4
  51. data/app/javascript/lostcoords/ui/controllers/{modal_controller.js → lc_dialog_controller.js} +1 -1
  52. data/app/javascript/lostcoords/ui/controllers/{emoji_picker_controller.js → lc_emoji_picker_controller.js} +4 -4
  53. data/app/javascript/lostcoords/ui/controllers/{row_menu_controller.js → lc_menu_controller.js} +3 -3
  54. data/app/javascript/lostcoords/ui/controllers/{ui_popover_controller.js → lc_popover_controller.js} +1 -1
  55. data/app/javascript/lostcoords/ui/controllers/{ui_selection_controller.js → lc_selection_controller.js} +1 -1
  56. data/app/javascript/lostcoords/ui/controllers/{sheet_controller.js → lc_sheet_controller.js} +15 -15
  57. data/app/javascript/lostcoords/ui/controllers/lc_tabs_controller.js +39 -0
  58. data/app/javascript/lostcoords/ui/controllers/{toast_controller.js → lc_toast_controller.js} +2 -2
  59. data/app/javascript/lostcoords/ui/controllers/lc_tooltip_controller.js +14 -0
  60. data/app/javascript/lostcoords/ui/helpers/catalog_picker.js +5 -5
  61. data/app/javascript/lostcoords/ui/helpers/context_dialog.js +6 -6
  62. data/app/javascript/lostcoords/ui/helpers/dialog.js +2 -2
  63. data/app/javascript/lostcoords/ui/helpers/dismiss_stack.js +7 -7
  64. data/app/javascript/lostcoords/ui/helpers/floating_panel.js +2 -2
  65. data/app/javascript/lostcoords/ui/helpers/sheet_motion.js +4 -4
  66. data/app/javascript/lostcoords/ui/index.js +51 -0
  67. data/app/views/lostcoords/ui/components/_emoji_picker.html.erb +30 -30
  68. data/app/views/lostcoords/ui/components/_lc_code_block.html.erb +18 -0
  69. data/app/views/lostcoords/ui/components/_lc_collapsible.html.erb +5 -0
  70. data/app/views/lostcoords/ui/components/_lc_dialog.html.erb +11 -8
  71. data/app/views/lostcoords/ui/components/_lc_floating_panel.html.erb +8 -0
  72. data/config/helper_renames.json +23 -25
  73. data/config/importmap.rb +10 -2
  74. data/config/locales/en.yml +23 -0
  75. data/config/locales/es.yml +23 -0
  76. data/config/locales/ja.yml +23 -0
  77. data/lib/lostcoords/ui/action_view.rb +5 -3
  78. data/lib/lostcoords/ui/builders.rb +1 -1
  79. data/lib/lostcoords/ui/form_builder.rb +113 -0
  80. data/lib/lostcoords/ui/parts.rb +154 -0
  81. data/lib/lostcoords/ui/tokens.rb +24 -1
  82. data/lib/lostcoords/ui/version.rb +1 -1
  83. metadata +33 -17
  84. data/app/views/lostcoords/ui/components/_form_alert.html.erb +0 -4
  85. data/app/views/lostcoords/ui/components/_lc_disclosure.html.erb +0 -5
  86. data/app/views/lostcoords/ui/components/_skeleton.html.erb +0 -4
  87. data/app/views/lostcoords/ui/components/_spinner.html.erb +0 -10
  88. data/app/views/lostcoords/ui/components/_ui_floating_panel.html.erb +0 -8
  89. /data/app/javascript/lostcoords/ui/controllers/{ui_copy_controller.js → lc_copy_controller.js} +0 -0
  90. /data/app/javascript/lostcoords/ui/controllers/{ui_toggle_controller.js → lc_toggle_controller.js} +0 -0
@@ -1,39 +1,39 @@
1
1
  @layer utilities {
2
- .ui-prose {
3
- --tw-prose-body: var(--ink-2);
4
- --tw-prose-headings: var(--ink);
5
- --tw-prose-lead: var(--ink-2);
6
- --tw-prose-links: var(--accent, var(--sky));
7
- --tw-prose-bold: var(--ink);
8
- --tw-prose-counters: var(--ink-3);
9
- --tw-prose-bullets: var(--ink-3);
10
- --tw-prose-hr: var(--hairline);
11
- --tw-prose-quotes: var(--ink);
12
- --tw-prose-quote-borders: var(--hairline);
13
- --tw-prose-captions: var(--ink-3);
14
- --tw-prose-code: var(--ink);
15
- --tw-prose-pre-code: var(--ink);
16
- --tw-prose-pre-bg: var(--paper-2);
17
- --tw-prose-th-borders: var(--hairline);
18
- --tw-prose-td-borders: var(--hairline);
2
+ .lc-prose {
3
+ --tw-prose-body: var(--muted-foreground);
4
+ --tw-prose-headings: var(--foreground);
5
+ --tw-prose-lead: var(--muted-foreground);
6
+ --tw-prose-links: var(--primary);
7
+ --tw-prose-bold: var(--foreground);
8
+ --tw-prose-counters: var(--muted-foreground);
9
+ --tw-prose-bullets: var(--muted-foreground);
10
+ --tw-prose-hr: var(--border);
11
+ --tw-prose-quotes: var(--foreground);
12
+ --tw-prose-quote-borders: var(--border);
13
+ --tw-prose-captions: var(--muted-foreground);
14
+ --tw-prose-code: var(--foreground);
15
+ --tw-prose-pre-code: var(--foreground);
16
+ --tw-prose-pre-bg: var(--muted);
17
+ --tw-prose-th-borders: var(--border);
18
+ --tw-prose-td-borders: var(--border);
19
19
 
20
20
  & :where(p, ul, ol, dl, blockquote, pre, table, figure, hr):not(:where(.not-prose, .not-prose *)) {
21
- margin-block: var(--ui-reading-flow, 1.25em) 0;
21
+ margin-block: var(--lc-reading-flow, 1.25em) 0;
22
22
  }
23
23
 
24
24
  & :where(h1, h2, h3, h4):not(:where(.not-prose, .not-prose *)) {
25
- margin-block: calc(var(--ui-reading-flow, 1.25em) * 1.6) 0;
25
+ margin-block: calc(var(--lc-reading-flow, 1.25em) * 1.6) 0;
26
26
  font-family: var(--font-display, inherit);
27
- line-height: var(--ui-reading-heading-leading, 1.25);
27
+ line-height: var(--lc-reading-heading-leading, 1.25);
28
28
  text-wrap: balance;
29
29
  }
30
30
 
31
31
  & :where(h1, h2, h3, h4) + :where(p, ul, ol):not(:where(.not-prose, .not-prose *)) {
32
- margin-block-start: calc(var(--ui-reading-flow, 1.25em) * 0.5);
32
+ margin-block-start: calc(var(--lc-reading-flow, 1.25em) * 0.5);
33
33
  }
34
34
 
35
35
  & :where(li > p, li > ul, li > ol):not(:where(.not-prose, .not-prose *)) {
36
- margin-block-start: calc(var(--ui-reading-flow, 1.25em) * 0.5);
36
+ margin-block-start: calc(var(--lc-reading-flow, 1.25em) * 0.5);
37
37
  }
38
38
 
39
39
  & > :where(:first-child):not(:where(.not-prose, .not-prose *)) {
@@ -47,13 +47,13 @@
47
47
  }
48
48
 
49
49
  &:lang(ja) :where(h1, h2, h3, h4):not(:where(.not-prose, .not-prose *)) {
50
- line-height: var(--ui-reading-heading-leading, 1.4);
50
+ line-height: var(--lc-reading-heading-leading, 1.4);
51
51
  letter-spacing: normal;
52
52
  }
53
53
  }
54
54
 
55
55
  @supports (word-break: auto-phrase) {
56
- .ui-prose:lang(ja) :where(h1, h2, h3, h4):not(:where(.not-prose, .not-prose *)) {
56
+ .lc-prose:lang(ja) :where(h1, h2, h3, h4):not(:where(.not-prose, .not-prose *)) {
57
57
  word-break: auto-phrase;
58
58
  }
59
59
  }
@@ -1,74 +1,74 @@
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
7
  (sheet_controller), 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);
13
+ z-index: var(--lc-z-sheet);
14
14
  inline-size: 100%;
15
- max-block-size: calc(var(--sheet-floor, 100dvh) * 0.9);
15
+ max-block-size: calc(var(--lc-sheet-floor, 100dvh) * 0.9);
16
16
  overflow-y: auto;
17
17
  overscroll-behavior: contain;
18
18
  padding-block-end: max(env(safe-area-inset-bottom), 1rem);
19
- border: 1px solid var(--glass-edge);
19
+ border: 1px solid var(--lc-glass-edge);
20
20
  border-start-start-radius: var(--radius-3xl);
21
21
  border-start-end-radius: var(--radius-3xl);
22
22
 
23
23
  /* Published as a variable, not just applied, because the sticky chrome
24
24
  that rides on top of the sheet — the grabber bar, the pinned action
25
25
  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
26
+ mode the sheet is a lightened paper-2/paper-3 mix while --background is
27
27
  0.045 lightness darker, which is exactly the band you could see. */
28
- --sheet-bg: var(--paper);
28
+ --lc-sheet-bg: var(--background);
29
29
  @supports (background: light-dark(white, black)) {
30
- --sheet-bg: light-dark(var(--paper), color-mix(in oklab, var(--paper-2) 92%, var(--paper-3)));
30
+ --lc-sheet-bg: light-dark(var(--background), color-mix(in oklab, var(--muted) 92%, var(--accent)));
31
31
  }
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));
32
+ background: var(--lc-sheet-bg);
33
+ color: var(--foreground);
34
+ box-shadow: 0 -12px 40px -12px color-mix(in oklab, var(--foreground) 45%, transparent);
35
+ transform: translateY(var(--lc-sheet-offscreen));
36
36
  transition:
37
- transform var(--sheet-duration) var(--ease-sheet),
38
- display var(--sheet-duration) allow-discrete,
39
- overlay var(--sheet-duration) allow-discrete;
37
+ transform var(--lc-sheet-duration) var(--lc-ease-sheet),
38
+ display var(--lc-sheet-duration) allow-discrete,
39
+ overlay var(--lc-sheet-duration) allow-discrete;
40
40
  }
41
41
 
42
42
  /* Popover-API reveal (currency): top layer drives display, so showPopover()/
43
43
  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 {
44
+ .lc-sheet[popover] { display: none; flex-direction: column; max-block-size: min(calc(var(--lc-sheet-floor, 100svh) * 0.72), 34rem); }
45
+ .lc-sheet[popover]:popover-open {
46
46
  display: flex;
47
47
  transform: translateY(0);
48
48
 
49
- @starting-style { transform: translateY(var(--sheet-offscreen)); }
49
+ @starting-style { transform: translateY(var(--lc-sheet-offscreen)); }
50
50
  }
51
- .sheet[popover]::backdrop {
52
- background: var(--scrim);
51
+ .lc-sheet[popover]::backdrop {
52
+ background: var(--lc-scrim);
53
53
  backdrop-filter: blur(2px);
54
54
  opacity: 0;
55
55
  transition:
56
- opacity var(--sheet-duration) var(--ease-sheet),
57
- display var(--sheet-duration) allow-discrete,
58
- overlay var(--sheet-duration) allow-discrete;
56
+ opacity var(--lc-sheet-duration) var(--lc-ease-sheet),
57
+ display var(--lc-sheet-duration) allow-discrete,
58
+ overlay var(--lc-sheet-duration) allow-discrete;
59
59
 
60
60
  @media (prefers-reduced-motion: reduce) { transition: none; }
61
61
  }
62
- .sheet[popover]:popover-open::backdrop { opacity: 1; @starting-style { opacity: 0; } }
62
+ .lc-sheet[popover]:popover-open::backdrop { opacity: 1; @starting-style { opacity: 0; } }
63
63
 
64
64
  /* UIKit's 36×5 grabber. */
65
- :is([data-sheet-target~="handle"], dialog[data-controller~="sheet"])::before {
65
+ :is([data-lc-sheet-target~="handle"], dialog[data-controller~="lc-sheet"])::before {
66
66
  content: "";
67
67
  display: block;
68
68
  inline-size: 2.25rem;
69
69
  block-size: 0.3125rem;
70
70
  border-radius: 9999px;
71
- background: color-mix(in oklab, var(--ink-3) 45%, transparent);
71
+ background: color-mix(in oklab, var(--muted-foreground) 45%, transparent);
72
72
  }
73
73
  }
74
74
  }
@@ -76,67 +76,67 @@
76
76
  @layer modules {
77
77
  /* Phones: every modal dialog is an iOS sheet (sheet_controller). It floats
78
78
  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.
79
+ edges as it reaches the large detent: --lc-sheet-p runs 0 → 1 between them.
80
80
  Lives in this layer so it out-ranks a dialog's own frame. */
81
81
  @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)));
82
+ dialog[data-controller~="lc-sheet"] {
83
+ --lc-sheet-p: 0;
84
+ --lc-sheet-inset: 0.5rem;
85
+ --lc-sheet-radius: 2.25rem;
86
+ --lc-sheet-bg: var(--background);
87
+ --lc-sheet-gap: calc(var(--lc-sheet-inset) * (1 - var(--lc-sheet-p)));
88
88
 
89
89
  position: fixed;
90
90
 
91
- /* Anchored from the top edge, like .sheet: the keyboard covers it and
91
+ /* Anchored from the top edge, like .lc-sheet: the keyboard covers it and
92
92
  nothing moves. */
93
- inset: calc(var(--sheet-floor, 100dvh) - var(--sheet-gap)) 0 auto;
93
+ inset: calc(var(--lc-sheet-floor, 100dvh) - var(--lc-sheet-gap)) 0 auto;
94
94
  translate: 0 -100%;
95
- margin: 0 var(--sheet-gap);
95
+ margin: 0 var(--lc-sheet-gap);
96
96
  inline-size: auto;
97
97
  max-inline-size: none;
98
98
  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)));
99
+ max-block-size: calc(var(--lc-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(--lc-sheet-gap)));
101
101
  overflow: hidden auto;
102
102
  overscroll-behavior: contain;
103
103
  scrollbar-width: none;
104
- border: 1px solid var(--glass-edge);
104
+ border: 1px solid var(--lc-glass-edge);
105
105
  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);
106
+ var(--lc-sheet-radius) var(--lc-sheet-radius)
107
+ calc(var(--lc-sheet-radius) * (1 - var(--lc-sheet-p))) calc(var(--lc-sheet-radius) * (1 - var(--lc-sheet-p)));
108
+ background: var(--lc-sheet-bg);
109
+ box-shadow: var(--lc-glass-rim), 0 -8px 40px -12px rgb(0 0 0 / 0.28);
110
110
  opacity: 1;
111
- transform: translateY(var(--sheet-offscreen));
111
+ transform: translateY(var(--lc-sheet-offscreen));
112
112
  transform-origin: bottom center;
113
113
  transition:
114
- transform var(--sheet-duration) var(--ease-sheet),
115
- display var(--sheet-duration) allow-discrete,
116
- overlay var(--sheet-duration) allow-discrete;
114
+ transform var(--lc-sheet-duration) var(--lc-ease-sheet),
115
+ display var(--lc-sheet-duration) allow-discrete,
116
+ overlay var(--lc-sheet-duration) allow-discrete;
117
117
 
118
118
  &[open] {
119
119
  transform: none;
120
120
 
121
- @starting-style { transform: translateY(var(--sheet-offscreen)); }
121
+ @starting-style { transform: translateY(var(--lc-sheet-offscreen)); }
122
122
  }
123
123
 
124
124
  &::before {
125
125
  position: absolute;
126
- z-index: calc(var(--z-index-art) + 1);
126
+ z-index: 1;
127
127
  inset: 0.3125rem auto auto 50%;
128
128
  translate: -50% 0;
129
129
  pointer-events: none;
130
130
  }
131
131
 
132
132
  &::backdrop {
133
- background: var(--scrim-sheet);
133
+ background: var(--lc-scrim-sheet);
134
134
  backdrop-filter: none;
135
135
  opacity: 0;
136
136
  transition:
137
- opacity var(--sheet-duration) var(--ease-sheet),
138
- display var(--sheet-duration) allow-discrete,
139
- overlay var(--sheet-duration) allow-discrete;
137
+ opacity var(--lc-sheet-duration) var(--lc-ease-sheet),
138
+ display var(--lc-sheet-duration) allow-discrete,
139
+ overlay var(--lc-sheet-duration) allow-discrete;
140
140
  }
141
141
 
142
142
  &[open]::backdrop {
@@ -152,18 +152,18 @@
152
152
 
153
153
  /* Behind a large sheet the page shrinks back and rounds off, over black,
154
154
  as UIKit's page sheet does; sheet_controller drives the variables. */
155
- html[data-sheet-page] {
155
+ html[data-lc-sheet-page] {
156
156
  background: #000;
157
157
 
158
158
  > body {
159
- transform-origin: 50% var(--sheet-page-origin, 0);
159
+ transform-origin: 50% var(--lc-sheet-page-origin, 0);
160
160
  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));
161
+ translateY(calc(var(--lc-sheet-page-p, 0) * (max(env(safe-area-inset-top), 0.75rem) - 0.25rem)))
162
+ scale(var(--lc-sheet-page-scale, 1));
163
+ clip-path: inset(var(--lc-sheet-page-origin, 0) 0 0 round calc(var(--lc-sheet-page-p, 0) * 0.75rem));
164
164
  transition:
165
- transform var(--sheet-page-transition, 0s),
166
- clip-path var(--sheet-page-transition, 0s);
165
+ transform var(--lc-sheet-page-transition, 0s),
166
+ clip-path var(--lc-sheet-page-transition, 0s);
167
167
  }
168
168
  }
169
169
  }
@@ -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
+ }