sheerly 0.0.1

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 (140) hide show
  1. package/README.md +3 -0
  2. package/lib/accordion.css +1 -0
  3. package/lib/accordion.d.ts +6 -0
  4. package/lib/alert.css +1 -0
  5. package/lib/alert.d.ts +8 -0
  6. package/lib/avatar.css +1 -0
  7. package/lib/avatar.d.ts +13 -0
  8. package/lib/badge.css +1 -0
  9. package/lib/badge.d.ts +5 -0
  10. package/lib/breadcrumb.css +1 -0
  11. package/lib/breadcrumb.d.ts +8 -0
  12. package/lib/button.css +1 -0
  13. package/lib/button.d.ts +7 -0
  14. package/lib/card.css +1 -0
  15. package/lib/card.d.ts +14 -0
  16. package/lib/carousel.css +1 -0
  17. package/lib/carousel.d.ts +21 -0
  18. package/lib/checkbox.css +1 -0
  19. package/lib/checkbox.d.ts +3 -0
  20. package/lib/cn.d.ts +5 -0
  21. package/lib/dialog.css +1 -0
  22. package/lib/dialog.d.ts +15 -0
  23. package/lib/dropdown-menu.css +1 -0
  24. package/lib/dropdown-menu.d.ts +49 -0
  25. package/lib/hover-card.css +1 -0
  26. package/lib/hover-card.d.ts +7 -0
  27. package/lib/index.css +1 -0
  28. package/lib/index.d.ts +33 -0
  29. package/lib/index.js +652 -0
  30. package/lib/input.css +1 -0
  31. package/lib/input.d.ts +5 -0
  32. package/lib/kbd.css +1 -0
  33. package/lib/kbd.d.ts +5 -0
  34. package/lib/label.css +1 -0
  35. package/lib/label.d.ts +5 -0
  36. package/lib/pagination.css +1 -0
  37. package/lib/pagination.d.ts +17 -0
  38. package/lib/popover.css +1 -0
  39. package/lib/popover.d.ts +7 -0
  40. package/lib/progress.css +1 -0
  41. package/lib/progress.d.ts +6 -0
  42. package/lib/radio.css +1 -0
  43. package/lib/radio.d.ts +5 -0
  44. package/lib/root.css +1 -0
  45. package/lib/select.css +1 -0
  46. package/lib/select.d.ts +10 -0
  47. package/lib/separator.css +1 -0
  48. package/lib/separator.d.ts +5 -0
  49. package/lib/sheet.css +1 -0
  50. package/lib/sheet.d.ts +16 -0
  51. package/lib/skeleton.css +1 -0
  52. package/lib/skeleton.d.ts +3 -0
  53. package/lib/slider.css +1 -0
  54. package/lib/slider.d.ts +3 -0
  55. package/lib/spinner.css +1 -0
  56. package/lib/spinner.d.ts +10 -0
  57. package/lib/switch.css +1 -0
  58. package/lib/switch.d.ts +5 -0
  59. package/lib/table.css +1 -0
  60. package/lib/table.d.ts +5 -0
  61. package/lib/tabs.css +1 -0
  62. package/lib/tabs.d.ts +13 -0
  63. package/lib/textarea.css +1 -0
  64. package/lib/textarea.d.ts +3 -0
  65. package/lib/toggle.css +1 -0
  66. package/lib/toggle.d.ts +16 -0
  67. package/lib/tooltip.css +1 -0
  68. package/lib/tooltip.d.ts +7 -0
  69. package/lib/typography.css +1 -0
  70. package/lib/typography.d.ts +9 -0
  71. package/package.json +33 -0
  72. package/src/accordion.css +108 -0
  73. package/src/accordion.tsx +15 -0
  74. package/src/alert.css +126 -0
  75. package/src/alert.tsx +25 -0
  76. package/src/avatar.css +75 -0
  77. package/src/avatar.tsx +30 -0
  78. package/src/badge.css +71 -0
  79. package/src/badge.tsx +19 -0
  80. package/src/breadcrumb.css +166 -0
  81. package/src/breadcrumb.tsx +71 -0
  82. package/src/button.css +214 -0
  83. package/src/button.tsx +30 -0
  84. package/src/card.css +99 -0
  85. package/src/card.tsx +41 -0
  86. package/src/carousel.css +183 -0
  87. package/src/carousel.tsx +30 -0
  88. package/src/checkbox.css +56 -0
  89. package/src/checkbox.tsx +10 -0
  90. package/src/cn.ts +7 -0
  91. package/src/dialog.css +175 -0
  92. package/src/dialog.tsx +47 -0
  93. package/src/dropdown-menu.css +257 -0
  94. package/src/dropdown-menu.tsx +88 -0
  95. package/src/hover-card.css +75 -0
  96. package/src/hover-card.tsx +16 -0
  97. package/src/index.css +33 -0
  98. package/src/index.ts +37 -0
  99. package/src/input.css +62 -0
  100. package/src/input.tsx +10 -0
  101. package/src/kbd.css +32 -0
  102. package/src/kbd.tsx +14 -0
  103. package/src/label.css +17 -0
  104. package/src/label.tsx +10 -0
  105. package/src/pagination.css +150 -0
  106. package/src/pagination.tsx +95 -0
  107. package/src/popover.css +65 -0
  108. package/src/popover.tsx +16 -0
  109. package/src/progress.css +79 -0
  110. package/src/progress.tsx +19 -0
  111. package/src/radio.css +61 -0
  112. package/src/radio.tsx +14 -0
  113. package/src/root.css +78 -0
  114. package/src/select.css +164 -0
  115. package/src/select.tsx +22 -0
  116. package/src/separator.css +14 -0
  117. package/src/separator.tsx +10 -0
  118. package/src/sheet.css +225 -0
  119. package/src/sheet.tsx +48 -0
  120. package/src/skeleton.css +15 -0
  121. package/src/skeleton.tsx +8 -0
  122. package/src/slider.css +68 -0
  123. package/src/slider.tsx +8 -0
  124. package/src/spinner.css +43 -0
  125. package/src/spinner.tsx +24 -0
  126. package/src/switch.css +79 -0
  127. package/src/switch.tsx +18 -0
  128. package/src/table.css +77 -0
  129. package/src/table.tsx +14 -0
  130. package/src/tabs.css +110 -0
  131. package/src/tabs.tsx +38 -0
  132. package/src/textarea.css +38 -0
  133. package/src/textarea.tsx +8 -0
  134. package/src/toggle.css +148 -0
  135. package/src/toggle.tsx +47 -0
  136. package/src/tooltip.css +60 -0
  137. package/src/tooltip.tsx +16 -0
  138. package/src/types.d.ts +42 -0
  139. package/src/typography.css +176 -0
  140. package/src/typography.tsx +13 -0
@@ -0,0 +1,150 @@
1
+ /*
2
+ * Pagination — page navigation with previous / next links. <nav>
3
+ *
4
+ * Structure:
5
+ * <nav class="sheerly-pagination" role="navigation" aria-label="pagination">
6
+ * <ul class="sheerly-pagination-content">
7
+ * <li class="sheerly-pagination-item">
8
+ * <a class="sheerly-pagination-link" data-role="previous" href="#">Previous</a>
9
+ * </li>
10
+ * <li class="sheerly-pagination-item">
11
+ * <a class="sheerly-pagination-link" href="#">1</a>
12
+ * </li>
13
+ * <li class="sheerly-pagination-item">
14
+ * <a class="sheerly-pagination-link" aria-current="page" href="#">2</a>
15
+ * </li>
16
+ * <li class="sheerly-pagination-item">
17
+ * <span class="sheerly-pagination-ellipsis" aria-hidden="true">…</span>
18
+ * </li>
19
+ * <li class="sheerly-pagination-item">
20
+ * <a class="sheerly-pagination-link" data-role="next" href="#">Next</a>
21
+ * </li>
22
+ * </ul>
23
+ * </nav>
24
+ *
25
+ * The Previous / Next chevron glyphs are embedded in CSS (masked ::before /
26
+ * ::after) and swap by data-role, so no <svg> child is required. Active page
27
+ * is marked with `aria-current="page"` (renders like the outline button).
28
+ */
29
+ .sheerly-pagination {
30
+ display: flex;
31
+ justify-content: center;
32
+ width: 100%;
33
+ margin-inline: auto;
34
+ font-family: "Geist Sans", system-ui, -apple-system, sans-serif;
35
+ }
36
+
37
+ .sheerly-pagination-content {
38
+ display: flex;
39
+ flex-direction: row;
40
+ flex-wrap: wrap;
41
+ align-items: center;
42
+ gap: 4px;
43
+ margin: 0;
44
+ padding: 0;
45
+ list-style: none;
46
+ }
47
+
48
+ .sheerly-pagination-item {
49
+ display: flex;
50
+ }
51
+
52
+ /* Base link — styled like a ghost button (32px). */
53
+ .sheerly-pagination-link {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ gap: 4px;
58
+ flex-shrink: 0;
59
+ min-width: 32px;
60
+ height: 32px;
61
+ padding: 0 10px;
62
+ border: 1px solid transparent;
63
+ border-radius: var(--sheerly-radius-lg);
64
+ background-color: transparent;
65
+ color: var(--sheerly-foreground);
66
+ font-size: 14px;
67
+ font-weight: 500;
68
+ line-height: 20px;
69
+ text-decoration: none;
70
+ white-space: nowrap;
71
+ user-select: none;
72
+ cursor: pointer;
73
+ transition: all 0.15s ease;
74
+ outline: none;
75
+
76
+ &:hover {
77
+ background-color: var(--sheerly-accent);
78
+ color: var(--sheerly-accent-foreground);
79
+ }
80
+
81
+ &:active {
82
+ translate: 0 1px;
83
+ }
84
+
85
+ &:focus-visible {
86
+ border-color: var(--sheerly-ring);
87
+ box-shadow: var(--sheerly-focus-ring);
88
+ }
89
+
90
+ &[aria-disabled="true"],
91
+ &:disabled {
92
+ pointer-events: none;
93
+ opacity: 0.5;
94
+ }
95
+
96
+ /* Active page — renders like the outline button. */
97
+ &[aria-current="page"] {
98
+ background-color: var(--sheerly-background);
99
+ border-color: var(--sheerly-border);
100
+ color: var(--sheerly-foreground);
101
+
102
+ &:hover {
103
+ background-color: var(--sheerly-accent);
104
+ }
105
+ }
106
+
107
+ & svg {
108
+ pointer-events: none;
109
+ flex-shrink: 0;
110
+ width: 16px;
111
+ height: 16px;
112
+ }
113
+
114
+ /* Previous / Next — embedded chevron glyph + gap for the text label. */
115
+ &[data-role="previous"],
116
+ &[data-role="next"] {
117
+ gap: 4px;
118
+ padding: 0 10px;
119
+ }
120
+
121
+ &[data-role="previous"]::before,
122
+ &[data-role="next"]::after {
123
+ content: "";
124
+ width: 16px;
125
+ height: 16px;
126
+ flex-shrink: 0;
127
+ background-color: currentColor;
128
+ }
129
+
130
+ &[data-role="previous"]::before {
131
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m15 18-6-6 6-6'/%3E%3C/svg%3E") center / contain no-repeat;
132
+ }
133
+
134
+ &[data-role="next"]::after {
135
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E") center / contain no-repeat;
136
+ }
137
+ }
138
+
139
+ /* Ellipsis — a non-interactive gap marker. */
140
+ .sheerly-pagination-ellipsis {
141
+ display: inline-flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ width: 32px;
145
+ height: 32px;
146
+ color: var(--sheerly-muted-foreground);
147
+ font-size: 14px;
148
+ line-height: 1;
149
+ user-select: none;
150
+ }
@@ -0,0 +1,95 @@
1
+ import type { AnchorHTMLAttributes, HTMLAttributes } from 'react'
2
+ import { cn } from './cn'
3
+
4
+ export function Pagination({ className, ...props }: HTMLAttributes<HTMLElement>) {
5
+ return (
6
+ <nav
7
+ role="navigation"
8
+ aria-label="pagination"
9
+ className={cn('sheerly-pagination', className)}
10
+ {...props}
11
+ />
12
+ )
13
+ }
14
+
15
+ export function PaginationContent({
16
+ className,
17
+ ...props
18
+ }: HTMLAttributes<HTMLUListElement>) {
19
+ return <ul className={cn('sheerly-pagination-content', className)} {...props} />
20
+ }
21
+
22
+ export function PaginationItem({ className, ...props }: HTMLAttributes<HTMLLIElement>) {
23
+ return <li className={cn('sheerly-pagination-item', className)} {...props} />
24
+ }
25
+
26
+ export interface PaginationLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
27
+ /** Marks the current page (renders like the outline button). */
28
+ isActive?: boolean
29
+ 'data-role'?: 'previous' | 'next'
30
+ }
31
+
32
+ export function PaginationLink({
33
+ className,
34
+ isActive,
35
+ ...props
36
+ }: PaginationLinkProps) {
37
+ return (
38
+ <a
39
+ aria-current={isActive ? 'page' : undefined}
40
+ className={cn('sheerly-pagination-link', className)}
41
+ {...props}
42
+ />
43
+ )
44
+ }
45
+
46
+ export function PaginationPrevious({
47
+ className,
48
+ text = 'Previous',
49
+ children,
50
+ ...props
51
+ }: PaginationLinkProps & { text?: string }) {
52
+ return (
53
+ <PaginationLink
54
+ aria-label="Go to previous page"
55
+ data-role="previous"
56
+ className={className}
57
+ {...props}
58
+ >
59
+ {children ?? text}
60
+ </PaginationLink>
61
+ )
62
+ }
63
+
64
+ export function PaginationNext({
65
+ className,
66
+ text = 'Next',
67
+ children,
68
+ ...props
69
+ }: PaginationLinkProps & { text?: string }) {
70
+ return (
71
+ <PaginationLink
72
+ aria-label="Go to next page"
73
+ data-role="next"
74
+ className={className}
75
+ {...props}
76
+ >
77
+ {children ?? text}
78
+ </PaginationLink>
79
+ )
80
+ }
81
+
82
+ export function PaginationEllipsis({
83
+ className,
84
+ ...props
85
+ }: HTMLAttributes<HTMLSpanElement>) {
86
+ return (
87
+ <span
88
+ aria-hidden
89
+ className={cn('sheerly-pagination-ellipsis', className)}
90
+ {...props}
91
+ >
92
+ &hellip;
93
+ </span>
94
+ )
95
+ }
@@ -0,0 +1,65 @@
1
+ /*
2
+ * Popover — a click-triggered floating panel using the invoker command API
3
+ * (command/commandfor) + anchor positioning.
4
+ *
5
+ * Unlike the tooltip, the content is NOT given a dark label style — it's a
6
+ * neutral popover surface (card-like) you fill with arbitrary content.
7
+ *
8
+ * Usage:
9
+ * <span class="sheerly-popover">
10
+ * <button class="sheerly-button" commandfor="pop" command="toggle-popover">Toggle</button>
11
+ * <div class="sheerly-popover-content" id="pop" popover>
12
+ * I am the popover
13
+ * <button class="sheerly-button" commandfor="pop" command="hide-popover">Hide</button>
14
+ * </div>
15
+ * </span>
16
+ *
17
+ * Position via --sheerly-popover-position:
18
+ * block-start | block-end | inline-start | inline-end
19
+ */
20
+
21
+ .sheerly-popover {
22
+ anchor-name: --sheerly-pop;
23
+ anchor-scope: --sheerly-pop;
24
+ display: inline-block;
25
+ width: fit-content;
26
+ }
27
+
28
+ .sheerly-popover-content {
29
+ position: fixed;
30
+ position-anchor: --sheerly-pop;
31
+ position-area: var(--sheerly-popover-position, block-end);
32
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
33
+ position-visibility: anchors-visible;
34
+ inset: unset;
35
+ margin: 6px;
36
+
37
+ /* Neutral popover surface */
38
+ background-color: var(--sheerly-popover);
39
+ color: var(--sheerly-popover-foreground);
40
+ font-family: "Geist Sans", system-ui, -apple-system, sans-serif;
41
+ font-size: 14px;
42
+ line-height: 20px;
43
+ width: max-content;
44
+ max-width: 288px;
45
+ padding: 16px;
46
+ border: 1px solid var(--sheerly-border);
47
+ border-radius: var(--sheerly-radius-md);
48
+ box-shadow: 0 4px 16px -4px oklch(0 0 0 / 8%), 0 1px 2px oklch(0 0 0 / 4%);
49
+ overflow: auto;
50
+
51
+ /* Popover animation */
52
+ opacity: 0;
53
+ transition:
54
+ opacity 0.15s ease,
55
+ display 0.15s allow-discrete,
56
+ overlay 0.15s allow-discrete;
57
+
58
+ &:popover-open {
59
+ opacity: 1;
60
+
61
+ @starting-style {
62
+ opacity: 0;
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,16 @@
1
+ import type { HTMLAttributes } from 'react'
2
+ import { cn } from './cn'
3
+
4
+ export type PopoverProps = HTMLAttributes<HTMLSpanElement>
5
+
6
+ /** Wrapper carrying the anchor. Nest the trigger button + content inside. */
7
+ export function Popover({ className, ...props }: PopoverProps) {
8
+ return <span className={cn('sheerly-popover', className)} {...props} />
9
+ }
10
+
11
+ export type PopoverContentProps = HTMLAttributes<HTMLDivElement>
12
+
13
+ /** The floating panel. Give it `popover` and an `id` matched by the trigger's `commandfor`. */
14
+ export function PopoverContent({ className, ...props }: PopoverContentProps) {
15
+ return <div className={cn('sheerly-popover-content', className)} {...props} />
16
+ }
@@ -0,0 +1,79 @@
1
+ /* Progress — native <progress> element (WebKit pseudo-elements only) */
2
+ .sheerly-progress {
3
+ width: 100%;
4
+ height: 8px;
5
+ appearance: none;
6
+ border: none;
7
+ border-radius: var(--sheerly-radius-full);
8
+ overflow: hidden;
9
+ background-color: var(--sheerly-border);
10
+
11
+ /* WebKit track (background) */
12
+ &::-webkit-progress-bar {
13
+ background-color: var(--sheerly-border);
14
+ border-radius: var(--sheerly-radius-full);
15
+ }
16
+
17
+ /* WebKit fill (indicator) */
18
+ &::-webkit-progress-value {
19
+ background-color: var(--sheerly-foreground);
20
+ border-radius: var(--sheerly-radius-full);
21
+ transition: width 0.3s ease;
22
+ }
23
+
24
+ /* Indeterminate state */
25
+ &:indeterminate {
26
+ &::-webkit-progress-bar {
27
+ background-color: var(--sheerly-border);
28
+ }
29
+ }
30
+
31
+ /* Default variant inherits the foreground fill set above */
32
+
33
+ &[data-variant="blue"] {
34
+ &::-webkit-progress-value {
35
+ background-color: oklch(0.546 0.245 262.88);
36
+ }
37
+ }
38
+
39
+ /* green / success */
40
+ &[data-variant="green"],
41
+ &[data-variant="success"] {
42
+ &::-webkit-progress-value {
43
+ background-color: oklch(0.527 0.154 150.07);
44
+ }
45
+ }
46
+
47
+ /* red / error */
48
+ &[data-variant="red"],
49
+ &[data-variant="error"] {
50
+ &::-webkit-progress-value {
51
+ background-color: var(--sheerly-destructive);
52
+ }
53
+ }
54
+
55
+ /* amber / warning */
56
+ &[data-variant="amber"],
57
+ &[data-variant="warning"] {
58
+ &::-webkit-progress-value {
59
+ background-color: oklch(0.666 0.179 58.32);
60
+ }
61
+ }
62
+
63
+ &[data-size="sm"] {
64
+ height: 4px;
65
+ }
66
+
67
+ &[data-size="lg"] {
68
+ height: 12px;
69
+ }
70
+ }
71
+
72
+ /* Dark mode */
73
+ .dark .sheerly-progress {
74
+ background-color: var(--sheerly-border);
75
+
76
+ &::-webkit-progress-bar {
77
+ background-color: var(--sheerly-border);
78
+ }
79
+ }
@@ -0,0 +1,19 @@
1
+ import type { ProgressHTMLAttributes } from 'react'
2
+ import { cn } from './cn'
3
+
4
+ export interface ProgressProps extends ProgressHTMLAttributes<HTMLProgressElement> {
5
+ 'data-variant'?:
6
+ | 'default'
7
+ | 'blue'
8
+ | 'green'
9
+ | 'success'
10
+ | 'red'
11
+ | 'error'
12
+ | 'amber'
13
+ | 'warning'
14
+ 'data-size'?: 'sm' | 'default' | 'lg'
15
+ }
16
+
17
+ export function Progress({ className, ...props }: ProgressProps) {
18
+ return <progress className={cn('sheerly-progress', className)} {...props} />
19
+ }
package/src/radio.css ADDED
@@ -0,0 +1,61 @@
1
+ /* Radio — <input type="radio"> inside a .sheerly-radio-group wrapper */
2
+ .sheerly-radio-group {
3
+ display: grid;
4
+ gap: 12px;
5
+ }
6
+
7
+ .sheerly-radio {
8
+ width: 16px;
9
+ height: 16px;
10
+ flex-shrink: 0;
11
+ border-radius: var(--sheerly-radius-full);
12
+ border: 1px solid var(--sheerly-input);
13
+ background-color: var(--sheerly-background);
14
+ transition: background-color 0.15s ease, border-color 0.15s ease;
15
+ outline: none;
16
+ cursor: pointer;
17
+ appearance: none;
18
+ display: grid;
19
+ place-content: center;
20
+
21
+ &::before {
22
+ content: "";
23
+ width: 6px;
24
+ height: 6px;
25
+ border-radius: var(--sheerly-radius-full);
26
+ transform: scale(0);
27
+ transition: transform 0.1s ease;
28
+ background-color: var(--sheerly-background);
29
+ }
30
+
31
+ &:hover {
32
+ border-color: var(--sheerly-border);
33
+ }
34
+
35
+ &:checked,
36
+ &[data-state="checked"] {
37
+ background-color: var(--sheerly-foreground);
38
+ border-color: var(--sheerly-foreground);
39
+
40
+ &::before {
41
+ transform: scale(1);
42
+ }
43
+ }
44
+
45
+ &:focus-visible {
46
+ border-color: var(--sheerly-ring);
47
+ box-shadow: var(--sheerly-focus-ring);
48
+ }
49
+
50
+ &:disabled {
51
+ background-color: var(--sheerly-muted);
52
+ border-color: var(--sheerly-border);
53
+ cursor: not-allowed;
54
+ opacity: 0.5;
55
+ }
56
+
57
+ &[aria-invalid="true"] {
58
+ border-color: var(--sheerly-destructive);
59
+ box-shadow: 0 0 0 3px oklch(from var(--sheerly-destructive) l c h / 20%);
60
+ }
61
+ }
package/src/radio.tsx ADDED
@@ -0,0 +1,14 @@
1
+ import type { HTMLAttributes, InputHTMLAttributes } from 'react'
2
+ import { cn } from './cn'
3
+
4
+ export type RadioGroupProps = HTMLAttributes<HTMLDivElement>
5
+
6
+ export function RadioGroup({ className, ...props }: RadioGroupProps) {
7
+ return <div className={cn('sheerly-radio-group', className)} {...props} />
8
+ }
9
+
10
+ export type RadioProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>
11
+
12
+ export function Radio({ className, ...props }: RadioProps) {
13
+ return <input type="radio" className={cn('sheerly-radio', className)} {...props} />
14
+ }
package/src/root.css ADDED
@@ -0,0 +1,78 @@
1
+ :root {
2
+ /* Radius (Nova: 0.625rem base) */
3
+ --sheerly-radius: 0.625rem;
4
+ --sheerly-radius-sm: calc(var(--sheerly-radius) * 0.6);
5
+ --sheerly-radius-md: calc(var(--sheerly-radius) * 0.8);
6
+ --sheerly-radius-lg: var(--sheerly-radius);
7
+ --sheerly-radius-xl: calc(var(--sheerly-radius) * 1.4);
8
+ --sheerly-radius-2xl: calc(var(--sheerly-radius) * 1.8);
9
+
10
+ /* Semantic colors (Nova light) */
11
+ --sheerly-background: oklch(1 0 0);
12
+ --sheerly-foreground: oklch(0.145 0 0);
13
+ --sheerly-card: oklch(1 0 0);
14
+ --sheerly-card-foreground: oklch(0.145 0 0);
15
+ --sheerly-popover: oklch(1 0 0);
16
+ --sheerly-popover-foreground: oklch(0.145 0 0);
17
+ --sheerly-primary: oklch(0.205 0 0);
18
+ --sheerly-primary-foreground: oklch(0.985 0 0);
19
+ --sheerly-secondary: oklch(0.97 0 0);
20
+ --sheerly-secondary-foreground: oklch(0.205 0 0);
21
+ --sheerly-muted: oklch(0.97 0 0);
22
+ --sheerly-muted-foreground: oklch(0.556 0 0);
23
+ --sheerly-accent: oklch(0.97 0 0);
24
+ --sheerly-accent-foreground: oklch(0.205 0 0);
25
+ --sheerly-destructive: oklch(0.577 0.245 27.325);
26
+ --sheerly-border: oklch(0.922 0 0);
27
+ --sheerly-input: oklch(0.922 0 0);
28
+ --sheerly-ring: oklch(0.708 0 0);
29
+
30
+ /* Sidebar */
31
+ --sheerly-sidebar: oklch(0.985 0 0);
32
+ --sheerly-sidebar-foreground: oklch(0.145 0 0);
33
+ --sheerly-sidebar-primary: oklch(0.205 0 0);
34
+ --sheerly-sidebar-primary-foreground: oklch(0.985 0 0);
35
+ --sheerly-sidebar-accent: oklch(0.97 0 0);
36
+ --sheerly-sidebar-accent-foreground: oklch(0.205 0 0);
37
+ --sheerly-sidebar-border: oklch(0.922 0 0);
38
+ --sheerly-sidebar-ring: oklch(0.708 0 0);
39
+ }
40
+
41
+ .dark {
42
+ /* Semantic colors (Nova dark) */
43
+ --sheerly-background: oklch(0.145 0 0);
44
+ --sheerly-foreground: oklch(0.985 0 0);
45
+ --sheerly-card: oklch(0.205 0 0);
46
+ --sheerly-card-foreground: oklch(0.985 0 0);
47
+ --sheerly-popover: oklch(0.205 0 0);
48
+ --sheerly-popover-foreground: oklch(0.985 0 0);
49
+ --sheerly-primary: oklch(0.922 0 0);
50
+ --sheerly-primary-foreground: oklch(0.205 0 0);
51
+ --sheerly-secondary: oklch(0.269 0 0);
52
+ --sheerly-secondary-foreground: oklch(0.985 0 0);
53
+ --sheerly-muted: oklch(0.269 0 0);
54
+ --sheerly-muted-foreground: oklch(0.708 0 0);
55
+ --sheerly-accent: oklch(0.269 0 0);
56
+ --sheerly-accent-foreground: oklch(0.985 0 0);
57
+ --sheerly-destructive: oklch(0.704 0.191 22.216);
58
+ --sheerly-border: oklch(1 0 0 / 10%);
59
+ --sheerly-input: oklch(1 0 0 / 15%);
60
+ --sheerly-ring: oklch(0.556 0 0);
61
+
62
+ /* Sidebar */
63
+ --sheerly-sidebar: oklch(0.205 0 0);
64
+ --sheerly-sidebar-foreground: oklch(0.985 0 0);
65
+ --sheerly-sidebar-primary: oklch(0.488 0.243 264.376);
66
+ --sheerly-sidebar-primary-foreground: oklch(0.985 0 0);
67
+ --sheerly-sidebar-accent: oklch(0.269 0 0);
68
+ --sheerly-sidebar-accent-foreground: oklch(0.985 0 0);
69
+ --sheerly-sidebar-border: oklch(1 0 0 / 10%);
70
+ --sheerly-sidebar-ring: oklch(0.556 0 0);
71
+ }
72
+
73
+ /* Utility (no shadcn equivalent) */
74
+ :root {
75
+ --sheerly-radius-full: 9999px;
76
+ /* Focus ring (Nova: 3px ring at ring/50%) */
77
+ --sheerly-focus-ring: 0 0 0 3px oklch(from var(--sheerly-ring) l c h / 50%);
78
+ }