adjacent-ui 0.1.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 (123) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +41 -0
  4. package/dist/button/button.css +177 -0
  5. package/dist/button/button.d.ts +25 -0
  6. package/dist/button/button.d.ts.map +1 -0
  7. package/dist/button/button.js +11 -0
  8. package/dist/button/button.js.map +1 -0
  9. package/dist/card/card.css +126 -0
  10. package/dist/card/card.d.ts +18 -0
  11. package/dist/card/card.d.ts.map +1 -0
  12. package/dist/card/card.js +38 -0
  13. package/dist/card/card.js.map +1 -0
  14. package/dist/checkbox/checkbox.css +116 -0
  15. package/dist/checkbox/checkbox.d.ts +13 -0
  16. package/dist/checkbox/checkbox.d.ts.map +1 -0
  17. package/dist/checkbox/checkbox.js +32 -0
  18. package/dist/checkbox/checkbox.js.map +1 -0
  19. package/dist/data-table/data-table.css +238 -0
  20. package/dist/data-table/data-table.d.ts +47 -0
  21. package/dist/data-table/data-table.d.ts.map +1 -0
  22. package/dist/data-table/data-table.js +58 -0
  23. package/dist/data-table/data-table.js.map +1 -0
  24. package/dist/divider/divider.css +35 -0
  25. package/dist/divider/divider.d.ts +12 -0
  26. package/dist/divider/divider.d.ts.map +1 -0
  27. package/dist/divider/divider.js +7 -0
  28. package/dist/divider/divider.js.map +1 -0
  29. package/dist/floating-action-button/floating-action-button.css +132 -0
  30. package/dist/floating-action-button/floating-action-button.d.ts +15 -0
  31. package/dist/floating-action-button/floating-action-button.d.ts.map +1 -0
  32. package/dist/floating-action-button/floating-action-button.js +8 -0
  33. package/dist/floating-action-button/floating-action-button.js.map +1 -0
  34. package/dist/index.d.ts +20 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +20 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/list/list.css +181 -0
  39. package/dist/list/list.d.ts +56 -0
  40. package/dist/list/list.d.ts.map +1 -0
  41. package/dist/list/list.js +33 -0
  42. package/dist/list/list.js.map +1 -0
  43. package/dist/menu/menu.css +170 -0
  44. package/dist/menu/menu.d.ts +70 -0
  45. package/dist/menu/menu.d.ts.map +1 -0
  46. package/dist/menu/menu.js +69 -0
  47. package/dist/menu/menu.js.map +1 -0
  48. package/dist/navigation/header/header.css +182 -0
  49. package/dist/navigation/header/header.d.ts +20 -0
  50. package/dist/navigation/header/header.d.ts.map +1 -0
  51. package/dist/navigation/header/header.js +23 -0
  52. package/dist/navigation/header/header.js.map +1 -0
  53. package/dist/navigation/index.d.ts +5 -0
  54. package/dist/navigation/index.d.ts.map +1 -0
  55. package/dist/navigation/index.js +5 -0
  56. package/dist/navigation/index.js.map +1 -0
  57. package/dist/navigation/link/link.d.ts +5 -0
  58. package/dist/navigation/link/link.d.ts.map +1 -0
  59. package/dist/navigation/link/link.js +6 -0
  60. package/dist/navigation/link/link.js.map +1 -0
  61. package/dist/navigation/shell/shell.css +21 -0
  62. package/dist/navigation/shell/shell.d.ts +22 -0
  63. package/dist/navigation/shell/shell.d.ts.map +1 -0
  64. package/dist/navigation/shell/shell.js +15 -0
  65. package/dist/navigation/shell/shell.js.map +1 -0
  66. package/dist/navigation/tabs/tabs.css +390 -0
  67. package/dist/navigation/tabs/tabs.d.ts +37 -0
  68. package/dist/navigation/tabs/tabs.d.ts.map +1 -0
  69. package/dist/navigation/tabs/tabs.js +74 -0
  70. package/dist/navigation/tabs/tabs.js.map +1 -0
  71. package/dist/page/page.css +15 -0
  72. package/dist/page/page.d.ts +32 -0
  73. package/dist/page/page.d.ts.map +1 -0
  74. package/dist/page/page.js +10 -0
  75. package/dist/page/page.js.map +1 -0
  76. package/dist/radio/radio.css +108 -0
  77. package/dist/radio/radio.d.ts +29 -0
  78. package/dist/radio/radio.d.ts.map +1 -0
  79. package/dist/radio/radio.js +23 -0
  80. package/dist/radio/radio.js.map +1 -0
  81. package/dist/runtime/use-display-mode.d.ts +9 -0
  82. package/dist/runtime/use-display-mode.d.ts.map +1 -0
  83. package/dist/runtime/use-display-mode.js +33 -0
  84. package/dist/runtime/use-display-mode.js.map +1 -0
  85. package/dist/runtime/use-keyboard.d.ts +8 -0
  86. package/dist/runtime/use-keyboard.d.ts.map +1 -0
  87. package/dist/runtime/use-keyboard.js +34 -0
  88. package/dist/runtime/use-keyboard.js.map +1 -0
  89. package/dist/runtime/use-viewport-tier.d.ts +10 -0
  90. package/dist/runtime/use-viewport-tier.d.ts.map +1 -0
  91. package/dist/runtime/use-viewport-tier.js +24 -0
  92. package/dist/runtime/use-viewport-tier.js.map +1 -0
  93. package/dist/snackbar/snackbar.css +95 -0
  94. package/dist/snackbar/snackbar.d.ts +15 -0
  95. package/dist/snackbar/snackbar.d.ts.map +1 -0
  96. package/dist/snackbar/snackbar.js +36 -0
  97. package/dist/snackbar/snackbar.js.map +1 -0
  98. package/dist/switch/switch.css +164 -0
  99. package/dist/switch/switch.d.ts +11 -0
  100. package/dist/switch/switch.d.ts.map +1 -0
  101. package/dist/switch/switch.js +11 -0
  102. package/dist/switch/switch.js.map +1 -0
  103. package/dist/tabs/tabs.css +165 -0
  104. package/dist/tabs/tabs.d.ts +25 -0
  105. package/dist/tabs/tabs.d.ts.map +1 -0
  106. package/dist/tabs/tabs.js +81 -0
  107. package/dist/tabs/tabs.js.map +1 -0
  108. package/dist/text/text.css +91 -0
  109. package/dist/text/text.d.ts +12 -0
  110. package/dist/text/text.d.ts.map +1 -0
  111. package/dist/text/text.js +17 -0
  112. package/dist/text/text.js.map +1 -0
  113. package/dist/text-area/text-area.css +11 -0
  114. package/dist/text-area/text-area.d.ts +13 -0
  115. package/dist/text-area/text-area.d.ts.map +1 -0
  116. package/dist/text-area/text-area.js +35 -0
  117. package/dist/text-area/text-area.js.map +1 -0
  118. package/dist/text-field/text-field.css +154 -0
  119. package/dist/text-field/text-field.d.ts +18 -0
  120. package/dist/text-field/text-field.d.ts.map +1 -0
  121. package/dist/text-field/text-field.js +32 -0
  122. package/dist/text-field/text-field.js.map +1 -0
  123. package/package.json +78 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+
3
+ ## Unpublished
4
+
5
+ ### 🛠 Breaking changes
6
+
7
+ ### 🎉 New features
8
+
9
+ ### 🐛 Bug fixes
10
+
11
+ ### 💡 Others
12
+
13
+ ## 0.1.0 - 2026-08-29
14
+
15
+ _This version does not introduce any user-facing changes._
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eric Kweyunga
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # adjacent-ui
2
+
3
+ Mobile-first components, navigation, and measurement hooks that theme from your own design tokens.
4
+
5
+ ## Documentation
6
+
7
+ - [Adjacent UI](https://github.com/erickweyunga/adjacent-framework/blob/main/docs/ui.md)
8
+ - [All the documentation](https://github.com/erickweyunga/adjacent-framework/blob/main/docs/README.md)
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ npm install adjacent-ui
14
+ ```
15
+
16
+ Most projects get this through the CLI instead, which installs and wires it up:
17
+
18
+ ```bash
19
+ npx adjacent-cli init
20
+ ```
21
+
22
+ Around twenty components with no colour or typography of their own: they read
23
+ the design tokens you already define, under the names Tailwind v4 and shadcn/ui
24
+ use, and fall back to system colours when you define none. Three hooks report
25
+ what only the browser can answer, and the navigation publishes the room it takes
26
+ so a page never hardcodes a height.
27
+
28
+ ## Issues
29
+
30
+ If you hit a problem using this package, please
31
+ [report it here](https://github.com/erickweyunga/adjacent-framework/issues/new).
32
+
33
+ ## Contributing
34
+
35
+ Issues and pull requests are welcome. Please read the
36
+ [contributing guide](https://github.com/erickweyunga/adjacent-framework/blob/main/CONTRIBUTING.md)
37
+ first.
38
+
39
+ ## License
40
+
41
+ MIT
@@ -0,0 +1,177 @@
1
+ @layer components {
2
+ .adj-button {
3
+ display: inline-flex;
4
+ gap: var(--adj-button-icon-gap, 0.5rem);
5
+ align-items: center;
6
+ justify-content: center;
7
+ box-sizing: border-box;
8
+ min-width: max-content;
9
+ margin: 0;
10
+ color: inherit;
11
+ font: inherit;
12
+ font-weight: 500;
13
+ line-height: 1;
14
+ white-space: nowrap;
15
+ appearance: none;
16
+ cursor: pointer;
17
+ border: 0;
18
+ outline: none;
19
+ transition:
20
+ color 140ms ease,
21
+ background-color 140ms ease,
22
+ border-color 140ms ease;
23
+ user-select: none;
24
+ }
25
+
26
+ .adj-button[data-shape="round"] {
27
+ border-radius: var(--radius-full, 9999px);
28
+ }
29
+
30
+ .adj-button[data-shape="square"] {
31
+ border-radius: var(--radius-lg, var(--radius, 0.625rem));
32
+ }
33
+
34
+ .adj-button[data-size="xs"] {
35
+ height: 2rem;
36
+ padding-inline: 0.75rem;
37
+ font-size: 0.75rem;
38
+ }
39
+
40
+ .adj-button[data-size="sm"] {
41
+ height: 2.5rem;
42
+ padding-inline: 1rem;
43
+ font-size: 0.875rem;
44
+ }
45
+
46
+ .adj-button[data-size="md"] {
47
+ height: 3.5rem;
48
+ padding-inline: 1.5rem;
49
+ font-size: 1rem;
50
+ }
51
+
52
+ .adj-button[data-size="lg"] {
53
+ height: 6rem;
54
+ padding-inline: 3rem;
55
+ font-size: 1.5rem;
56
+ }
57
+
58
+ .adj-button[data-size="xl"] {
59
+ height: 8.5rem;
60
+ padding-inline: 4rem;
61
+ font-size: 2rem;
62
+ }
63
+
64
+ .adj-button[data-variant="filled"] {
65
+ color: var(--adj-button-filled-color, var(--primary-foreground, Canvas));
66
+ background: var(--adj-button-filled-background, var(--primary, CanvasText));
67
+ }
68
+
69
+ .adj-button[data-variant="tonal"] {
70
+ color: var(--adj-button-tonal-color, var(--foreground, CanvasText));
71
+ background: var(--adj-button-tonal-background, color-mix(in srgb, CanvasText 12%, Canvas));
72
+ }
73
+
74
+ .adj-button[data-variant="outlined"] {
75
+ color: var(--adj-button-outlined-color, var(--foreground, CanvasText));
76
+ background: transparent;
77
+ border: 1px solid var(--adj-button-outline-color, color-mix(in srgb, CanvasText 42%, transparent));
78
+ }
79
+
80
+ .adj-button[data-variant="text"] {
81
+ color: var(--adj-button-text-color, var(--foreground, CanvasText));
82
+ background: transparent;
83
+ }
84
+
85
+ .adj-button[data-variant="text"]:hover:not(:disabled) {
86
+ background: var(
87
+ --adj-button-ghost-hover-background,
88
+ var(--accent, color-mix(in srgb, currentColor 8%, transparent))
89
+ );
90
+ filter: none;
91
+ }
92
+
93
+ .adj-button[data-variant="text"]:active:not(:disabled) {
94
+ background: var(
95
+ --adj-button-ghost-active-background,
96
+ color-mix(in srgb, var(--accent, currentColor) 72%, currentColor 8%)
97
+ );
98
+ filter: none;
99
+ }
100
+
101
+ .adj-button:hover:not(:disabled) {
102
+ filter: brightness(0.94);
103
+ }
104
+
105
+ .adj-button:focus-visible {
106
+ outline: 2px solid currentColor;
107
+ outline-offset: 2px;
108
+ }
109
+
110
+ .adj-button:disabled {
111
+ cursor: default;
112
+ opacity: 0.38;
113
+ }
114
+
115
+ .adj-button[data-pressed="true"] {
116
+ color: var(--adj-button-pressed-color, var(--primary-foreground, Canvas));
117
+ background: var(--adj-button-pressed-background, var(--primary, CanvasText));
118
+ }
119
+
120
+ .adj-button > svg {
121
+ flex: none;
122
+ }
123
+
124
+ .adj-icon-button {
125
+ width: var(--adj-icon-button-width);
126
+ min-width: var(--adj-icon-button-width);
127
+ padding-inline: 0;
128
+ }
129
+
130
+ .adj-icon-button[data-size="xs"] {
131
+ --adj-icon-button-size: 2rem;
132
+ }
133
+
134
+ .adj-icon-button[data-size="sm"] {
135
+ --adj-icon-button-size: 2.5rem;
136
+ }
137
+
138
+ .adj-icon-button[data-size="md"] {
139
+ --adj-icon-button-size: 3.5rem;
140
+ }
141
+
142
+ .adj-icon-button[data-size="lg"] {
143
+ --adj-icon-button-size: 6rem;
144
+ }
145
+
146
+ .adj-icon-button[data-size="xl"] {
147
+ --adj-icon-button-size: 8.5rem;
148
+ }
149
+
150
+ .adj-icon-button[data-width="narrow"] {
151
+ --adj-icon-button-width: calc(var(--adj-icon-button-size) * 0.8);
152
+ }
153
+
154
+ .adj-icon-button[data-width="default"] {
155
+ --adj-icon-button-width: var(--adj-icon-button-size);
156
+ }
157
+
158
+ .adj-icon-button[data-width="wide"] {
159
+ --adj-icon-button-width: calc(var(--adj-icon-button-size) * 1.5);
160
+ }
161
+
162
+ /*
163
+ * Not while pressed. This rule ties with the pressed one on specificity and
164
+ * comes after it, so without the exclusion it wins and a selected standard
165
+ * icon button draws its icon in the page's foreground colour on the primary
166
+ * background: two colours never meant to pair, and at their worst the icon is
167
+ * the same colour as the surface behind it and cannot be seen at all.
168
+ */
169
+ .adj-icon-button[data-icon-variant="standard"]:not([data-pressed="true"]) {
170
+ color: var(--adj-icon-button-standard-color, var(--foreground, CanvasText));
171
+ }
172
+
173
+ .adj-icon-button > svg {
174
+ width: 1.5rem;
175
+ height: 1.5rem;
176
+ }
177
+ }
@@ -0,0 +1,25 @@
1
+ import type { ButtonHTMLAttributes, ReactNode } from "react";
2
+ import "./button.css";
3
+ export type ButtonVariant = "filled" | "tonal" | "outlined" | "text";
4
+ export type ButtonSize = "xs" | "sm" | "md" | "lg" | "xl";
5
+ export type ButtonShape = "round" | "square";
6
+ export type IconButtonVariant = "filled" | "tonal" | "outlined" | "standard";
7
+ export type IconButtonWidth = "narrow" | "default" | "wide";
8
+ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
9
+ readonly pressed?: boolean;
10
+ readonly shape?: ButtonShape;
11
+ readonly size?: ButtonSize;
12
+ readonly variant?: ButtonVariant;
13
+ }
14
+ export declare function Button({ className, pressed, shape, size, type, variant, ...props }: ButtonProps): import("react").JSX.Element;
15
+ export interface IconButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "aria-label" | "children"> {
16
+ readonly "aria-label": string;
17
+ readonly children: ReactNode;
18
+ readonly selected?: boolean;
19
+ readonly shape?: ButtonShape;
20
+ readonly size?: ButtonSize;
21
+ readonly variant?: IconButtonVariant;
22
+ readonly width?: IconButtonWidth;
23
+ }
24
+ export declare function IconButton({ "aria-label": ariaLabel, children, className, selected, shape, size, variant, width, ...props }: IconButtonProps): import("react").JSX.Element;
25
+ //# sourceMappingURL=button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/button/button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7D,OAAO,cAAc,CAAC;AAEtB,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AACrE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC7C,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AAC7E,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,WAAY,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;CAClC;AAED,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,KAAgB,EAChB,IAAW,EACX,IAAe,EACf,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,WAAW,+BAeb;AAED,MAAM,WAAW,eACf,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IAChF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,wBAAgB,UAAU,CAAC,EACzB,YAAY,EAAE,SAAS,EACvB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,KAAgB,EAChB,IAAW,EACX,OAAoB,EACpB,KAAiB,EACjB,GAAG,KAAK,EACT,EAAE,eAAe,+BAkBjB"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import "./button.css";
3
+ export function Button({ className, pressed, shape = "square", size = "sm", type = "button", variant = "filled", ...props }) {
4
+ const classes = ["adj-button", className].filter(Boolean).join(" ");
5
+ return (_jsx("button", { "aria-pressed": pressed, className: classes, "data-pressed": pressed === undefined ? undefined : String(pressed), "data-shape": shape, "data-size": size, "data-variant": variant, type: type, ...props }));
6
+ }
7
+ export function IconButton({ "aria-label": ariaLabel, children, className, selected, shape = "square", size = "sm", variant = "standard", width = "default", ...props }) {
8
+ const classes = ["adj-icon-button", className].filter(Boolean).join(" ");
9
+ return (_jsx(Button, { "aria-label": ariaLabel, className: classes, "data-icon-variant": variant, "data-width": width, pressed: selected, shape: shape, size: size, variant: variant === "standard" ? "text" : variant, ...props, children: children }));
10
+ }
11
+ //# sourceMappingURL=button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/button/button.tsx"],"names":[],"mappings":";AAEA,OAAO,cAAc,CAAC;AAetB,MAAM,UAAU,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,KAAK,GAAG,QAAQ,EAChB,IAAI,GAAG,IAAI,EACX,IAAI,GAAG,QAAQ,EACf,OAAO,GAAG,QAAQ,EAClB,GAAG,KAAK,EACI;IACZ,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEpE,OAAO,CACL,iCACgB,OAAO,EACrB,SAAS,EAAE,OAAO,kBACJ,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,gBACrD,KAAK,eACN,IAAI,kBACD,OAAO,EACrB,IAAI,EAAE,IAAI,KACN,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAaD,MAAM,UAAU,UAAU,CAAC,EACzB,YAAY,EAAE,SAAS,EACvB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,KAAK,GAAG,QAAQ,EAChB,IAAI,GAAG,IAAI,EACX,OAAO,GAAG,UAAU,EACpB,KAAK,GAAG,SAAS,EACjB,GAAG,KAAK,EACQ;IAChB,MAAM,OAAO,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzE,OAAO,CACL,KAAC,MAAM,kBACO,SAAS,EACrB,SAAS,EAAE,OAAO,uBACC,OAAO,gBACd,KAAK,EACjB,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAC9C,KAAK,YAER,QAAQ,GACF,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,126 @@
1
+ @layer components {
2
+ .adj-card {
3
+ position: relative;
4
+ box-sizing: border-box;
5
+ overflow: hidden;
6
+ color: var(--adj-card-color, var(--foreground, CanvasText));
7
+ border-radius: var(--adj-card-radius, var(--radius, 0.625rem));
8
+ transition:
9
+ background-color 160ms ease,
10
+ border-color 160ms ease;
11
+ }
12
+
13
+ .adj-card[data-variant="outlined"] {
14
+ background: var(--adj-card-outlined-background, var(--background, Canvas));
15
+ border: 1px solid var(--adj-card-outline-color, var(--border, color-mix(in srgb, CanvasText 25%, transparent)));
16
+ }
17
+
18
+ .adj-card[data-variant="filled"] {
19
+ background: var(--adj-card-filled-background, var(--muted, color-mix(in srgb, CanvasText 8%, Canvas)));
20
+ border: 1px solid transparent;
21
+ }
22
+
23
+ .adj-card[data-dragged="true"] {
24
+ background: var(--adj-card-dragged-background, var(--muted, color-mix(in srgb, CanvasText 8%, Canvas)));
25
+ border-color: var(--adj-card-dragged-outline, var(--foreground, CanvasText));
26
+ }
27
+
28
+ .adj-card[data-selected="true"] {
29
+ background: var(--adj-card-selected-background, color-mix(in srgb, var(--primary, CanvasText) 12%, var(--background, Canvas)));
30
+ border-color: var(--adj-card-selected-outline, var(--primary, CanvasText));
31
+ }
32
+
33
+ .adj-card__media {
34
+ overflow: hidden;
35
+ }
36
+
37
+ .adj-card__media > img,
38
+ .adj-card__media > picture,
39
+ .adj-card__media > video {
40
+ display: block;
41
+ width: 100%;
42
+ }
43
+
44
+ .adj-card__content {
45
+ padding: var(--adj-card-content-padding, 1rem);
46
+ }
47
+
48
+ /*
49
+ * Padded like the content it sits above, because every part of a card is a
50
+ * direct child of it: a header without padding puts the title against the edge.
51
+ */
52
+ .adj-card__header {
53
+ display: grid;
54
+ gap: 0.25rem;
55
+ padding: var(--adj-card-content-padding, 1rem);
56
+ }
57
+
58
+ /* The header already padded the top of the card, so what follows does not. */
59
+ .adj-card__header + .adj-card__content,
60
+ .adj-card__header + .adj-card__actions {
61
+ padding-block-start: 0;
62
+ }
63
+
64
+ .adj-card__title,
65
+ .adj-card__subtitle,
66
+ .adj-card__description {
67
+ margin: 0;
68
+ }
69
+
70
+ .adj-card__title {
71
+ font-size: 1rem;
72
+ font-weight: 500;
73
+ line-height: 1.5rem;
74
+ }
75
+
76
+ .adj-card__subtitle,
77
+ .adj-card__description {
78
+ color: var(--adj-card-supporting-color, var(--muted-foreground, color-mix(in srgb, CanvasText 70%, Canvas)));
79
+ font-size: 0.875rem;
80
+ line-height: 1.25rem;
81
+ }
82
+
83
+ /*
84
+ * Only when it follows the title directly. Inside the header the grid gap
85
+ * already separates it from a subtitle, and doubling the two reads as a gap
86
+ * nobody asked for.
87
+ */
88
+ .adj-card__title + .adj-card__description {
89
+ margin-top: 0.5rem;
90
+ }
91
+
92
+ .adj-card__actions {
93
+ display: flex;
94
+ flex-wrap: wrap;
95
+ gap: 0.5rem;
96
+ align-items: center;
97
+ justify-content: flex-end;
98
+ /* Inline padding matches the content above, so an action lines up with it. */
99
+ padding: 0 var(--adj-card-content-padding, 1rem) var(--adj-card-content-padding, 1rem);
100
+ }
101
+
102
+ .adj-card__selection-indicator {
103
+ position: absolute;
104
+ inset-block-start: 0.5rem;
105
+ inset-inline-end: 0.5rem;
106
+ display: grid;
107
+ width: 1.5rem;
108
+ height: 1.5rem;
109
+ color: var(--adj-card-selection-indicator-color, var(--primary-foreground, Canvas));
110
+ background: var(--adj-card-selection-indicator-background, var(--primary, CanvasText));
111
+ border-radius: var(--radius-lg, var(--radius, 0.625rem));
112
+ place-items: center;
113
+ }
114
+
115
+ .adj-card__selection-indicator > svg {
116
+ width: 1rem;
117
+ height: 1rem;
118
+ fill: currentColor;
119
+ }
120
+
121
+ @media (prefers-reduced-motion: reduce) {
122
+ .adj-card {
123
+ transition: none;
124
+ }
125
+ }
126
+ }
@@ -0,0 +1,18 @@
1
+ import type { HTMLAttributes, ReactNode } from "react";
2
+ import "./card.css";
3
+ export type CardVariant = "filled" | "outlined";
4
+ export interface CardProps extends HTMLAttributes<HTMLDivElement> {
5
+ readonly dragged?: boolean;
6
+ readonly selected?: boolean;
7
+ readonly selectionIndicator?: ReactNode;
8
+ readonly variant?: CardVariant;
9
+ }
10
+ export declare function Card({ children, className, dragged, selected, selectionIndicator, variant, ...props }: CardProps): import("react").JSX.Element;
11
+ export declare function CardMedia({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
12
+ export declare function CardContent({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
13
+ export declare function CardHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
14
+ export declare function CardTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>): import("react").JSX.Element;
15
+ export declare function CardSubtitle({ className, ...props }: HTMLAttributes<HTMLParagraphElement>): import("react").JSX.Element;
16
+ export declare function CardDescription({ className, ...props }: HTMLAttributes<HTMLParagraphElement>): import("react").JSX.Element;
17
+ export declare function CardActions({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
18
+ //# sourceMappingURL=card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/card/card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,YAAY,CAAC;AAEpB,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,cAAc,CAAC;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;CAChC;AAED,wBAAgB,IAAI,CAAC,EACnB,QAAQ,EACR,SAAS,EACT,OAAe,EACf,QAAgB,EAChB,kBAAkB,EAClB,OAAoB,EACpB,GAAG,KAAK,EACT,EAAE,SAAS,+BAmBX;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BAGhF;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BAGlF;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BAGjF;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,kBAAkB,CAAC,+BAGpF;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,oBAAoB,CAAC,+BAGzF;AAED,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,oBAAoB,CAAC,+BAG5F;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BAGlF"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import "./card.css";
3
+ export function Card({ children, className, dragged = false, selected = false, selectionIndicator, variant = "outlined", ...props }) {
4
+ const classes = ["adj-card", className].filter(Boolean).join(" ");
5
+ return (_jsxs("div", { className: classes, "data-dragged": String(dragged), "data-selected": String(selected), "data-variant": variant, ...props, children: [children, selected ? (_jsx("span", { "aria-hidden": "true", className: "adj-card__selection-indicator", children: selectionIndicator ?? _jsx(DefaultSelectionIndicator, {}) })) : null] }));
6
+ }
7
+ export function CardMedia({ className, ...props }) {
8
+ const classes = ["adj-card__media", className].filter(Boolean).join(" ");
9
+ return _jsx("div", { className: classes, ...props });
10
+ }
11
+ export function CardContent({ className, ...props }) {
12
+ const classes = ["adj-card__content", className].filter(Boolean).join(" ");
13
+ return _jsx("div", { className: classes, ...props });
14
+ }
15
+ export function CardHeader({ className, ...props }) {
16
+ const classes = ["adj-card__header", className].filter(Boolean).join(" ");
17
+ return _jsx("div", { className: classes, ...props });
18
+ }
19
+ export function CardTitle({ className, ...props }) {
20
+ const classes = ["adj-card__title", className].filter(Boolean).join(" ");
21
+ return _jsx("h3", { className: classes, ...props });
22
+ }
23
+ export function CardSubtitle({ className, ...props }) {
24
+ const classes = ["adj-card__subtitle", className].filter(Boolean).join(" ");
25
+ return _jsx("p", { className: classes, ...props });
26
+ }
27
+ export function CardDescription({ className, ...props }) {
28
+ const classes = ["adj-card__description", className].filter(Boolean).join(" ");
29
+ return _jsx("p", { className: classes, ...props });
30
+ }
31
+ export function CardActions({ className, ...props }) {
32
+ const classes = ["adj-card__actions", className].filter(Boolean).join(" ");
33
+ return _jsx("div", { className: classes, ...props });
34
+ }
35
+ function DefaultSelectionIndicator() {
36
+ return (_jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", children: _jsx("path", { d: "m9.55 17.6-5.7-5.7 1.4-1.4 4.3 4.3 9.2-9.2 1.4 1.4-10.6 10.6Z" }) }));
37
+ }
38
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/card/card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ @layer components {
2
+ .adj-checkbox {
3
+ position: relative;
4
+ display: inline-flex;
5
+ gap: 0.75rem;
6
+ align-items: center;
7
+ min-width: 3rem;
8
+ min-height: 3rem;
9
+ color: var(--adj-checkbox-label-color, var(--foreground, CanvasText));
10
+ font: inherit;
11
+ cursor: pointer;
12
+ user-select: none;
13
+ }
14
+
15
+ .adj-checkbox[data-labeled="false"] {
16
+ justify-content: center;
17
+ width: 3rem;
18
+ }
19
+
20
+ .adj-checkbox__input {
21
+ position: absolute;
22
+ width: 1px;
23
+ height: 1px;
24
+ margin: -1px;
25
+ overflow: hidden;
26
+ clip: rect(0 0 0 0);
27
+ clip-path: inset(50%);
28
+ white-space: nowrap;
29
+ }
30
+
31
+ .adj-checkbox__control {
32
+ display: grid;
33
+ width: 1.125rem;
34
+ height: 1.125rem;
35
+ flex: none;
36
+ color: var(--adj-checkbox-icon-color, var(--primary-foreground, Canvas));
37
+ background: transparent;
38
+ border: 2px solid var(--adj-checkbox-outline-color, var(--foreground, CanvasText));
39
+ border-radius: var(
40
+ --radius-sm,
41
+ max(0px, calc(var(--radius, 0.625rem) - 4px))
42
+ );
43
+ transition:
44
+ background-color 120ms ease,
45
+ border-color 120ms ease;
46
+ place-items: center;
47
+ }
48
+
49
+ .adj-checkbox__check,
50
+ .adj-checkbox__indeterminate {
51
+ display: none;
52
+ width: 1rem;
53
+ height: 1rem;
54
+ fill: none;
55
+ stroke: currentColor;
56
+ stroke-linecap: square;
57
+ stroke-linejoin: miter;
58
+ stroke-width: 2;
59
+ }
60
+
61
+ .adj-checkbox__input:checked + .adj-checkbox__control,
62
+ .adj-checkbox__input:indeterminate + .adj-checkbox__control {
63
+ background: var(--adj-checkbox-selected-background, var(--primary, CanvasText));
64
+ border-color: var(--adj-checkbox-selected-background, var(--primary, CanvasText));
65
+ }
66
+
67
+ .adj-checkbox__input:checked + .adj-checkbox__control .adj-checkbox__check,
68
+ .adj-checkbox__input:indeterminate + .adj-checkbox__control .adj-checkbox__indeterminate {
69
+ display: block;
70
+ }
71
+
72
+ .adj-checkbox[data-error="true"] .adj-checkbox__control {
73
+ color: var(--adj-checkbox-error-icon-color, var(--background, Canvas));
74
+ border-color: var(--adj-checkbox-error-color, var(--destructive, #b3261e));
75
+ }
76
+
77
+ .adj-checkbox[data-error="true"] .adj-checkbox__input:checked + .adj-checkbox__control,
78
+ .adj-checkbox[data-error="true"] .adj-checkbox__input:indeterminate + .adj-checkbox__control {
79
+ background: var(--adj-checkbox-error-color, var(--destructive, #b3261e));
80
+ }
81
+
82
+ .adj-checkbox:hover .adj-checkbox__control {
83
+ background-color: color-mix(in srgb, currentColor 8%, transparent);
84
+ }
85
+
86
+ .adj-checkbox:hover .adj-checkbox__input:checked + .adj-checkbox__control,
87
+ .adj-checkbox:hover .adj-checkbox__input:indeterminate + .adj-checkbox__control {
88
+ background-color: color-mix(in srgb, var(--adj-checkbox-selected-background, var(--primary, CanvasText)) 88%, CanvasText);
89
+ }
90
+
91
+ .adj-checkbox[data-error="true"]:hover .adj-checkbox__input:checked + .adj-checkbox__control,
92
+ .adj-checkbox[data-error="true"]:hover .adj-checkbox__input:indeterminate + .adj-checkbox__control {
93
+ background-color: color-mix(in srgb, var(--adj-checkbox-error-color, var(--destructive, #b3261e)) 88%, CanvasText);
94
+ }
95
+
96
+ .adj-checkbox__input:focus-visible + .adj-checkbox__control {
97
+ outline: 2px solid var(--ring, currentColor);
98
+ outline-offset: 3px;
99
+ }
100
+
101
+ .adj-checkbox:has(.adj-checkbox__input:disabled) {
102
+ cursor: default;
103
+ opacity: 0.38;
104
+ }
105
+
106
+ .adj-checkbox__label {
107
+ font-size: 0.875rem;
108
+ line-height: 1.25rem;
109
+ }
110
+
111
+ @media (prefers-reduced-motion: reduce) {
112
+ .adj-checkbox__control {
113
+ transition: none;
114
+ }
115
+ }
116
+ }
@@ -0,0 +1,13 @@
1
+ import { type ChangeEvent, type ComponentPropsWithRef, type ReactNode } from "react";
2
+ import "./checkbox.css";
3
+ export type CheckboxState = boolean | "indeterminate";
4
+ export interface CheckboxProps extends Omit<ComponentPropsWithRef<"input">, "checked" | "children" | "defaultChecked" | "onChange" | "type"> {
5
+ readonly checked?: CheckboxState;
6
+ readonly defaultChecked?: boolean;
7
+ readonly error?: boolean;
8
+ readonly label?: ReactNode;
9
+ readonly onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
10
+ readonly onCheckedChange?: (checked: boolean) => void;
11
+ }
12
+ export declare function Checkbox({ checked, className, defaultChecked, disabled, error, label, onChange, onCheckedChange, ref, ...props }: CheckboxProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=checkbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/checkbox/checkbox.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,gBAAgB,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,eAAe,CAAC;AAEtD,MAAM,WAAW,aACf,SAAQ,IAAI,CACV,qBAAqB,CAAC,OAAO,CAAC,EAC9B,SAAS,GAAG,UAAU,GAAG,gBAAgB,GAAG,UAAU,GAAG,MAAM,CAChE;IACD,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACnE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACvD;AAED,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,SAAS,EACT,cAAc,EACd,QAAQ,EACR,KAAa,EACb,KAAK,EACL,QAAQ,EACR,eAAe,EACf,GAAG,EACH,GAAG,KAAK,EACT,EAAE,aAAa,+BAsDf"}
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useLayoutEffect, useRef, } from "react";
4
+ import "./checkbox.css";
5
+ export function Checkbox({ checked, className, defaultChecked, disabled, error = false, label, onChange, onCheckedChange, ref, ...props }) {
6
+ const inputRef = useRef(null);
7
+ const classes = ["adj-checkbox", className].filter(Boolean).join(" ");
8
+ const indeterminate = checked === "indeterminate";
9
+ useLayoutEffect(() => {
10
+ if (inputRef.current) {
11
+ inputRef.current.indeterminate = indeterminate;
12
+ }
13
+ }, [indeterminate]);
14
+ function setInputRef(node) {
15
+ inputRef.current = node;
16
+ if (typeof ref === "function") {
17
+ ref(node);
18
+ }
19
+ else if (ref) {
20
+ ref.current = node;
21
+ }
22
+ }
23
+ function handleChange(event) {
24
+ onChange?.(event);
25
+ onCheckedChange?.(event.currentTarget.checked);
26
+ if (indeterminate) {
27
+ event.currentTarget.indeterminate = true;
28
+ }
29
+ }
30
+ return (_jsxs("label", { className: classes, "data-error": String(error), "data-labeled": String(label !== undefined), children: [_jsx("input", { "aria-invalid": error || undefined, checked: checked === undefined ? undefined : checked === true, className: "adj-checkbox__input", defaultChecked: defaultChecked, disabled: disabled, onChange: handleChange, ref: setInputRef, type: "checkbox", ...props }), _jsxs("span", { "aria-hidden": "true", className: "adj-checkbox__control", children: [_jsx("svg", { className: "adj-checkbox__check", viewBox: "0 0 18 18", children: _jsx("path", { d: "m4 9 3.1 3.1L14 5.5" }) }), _jsx("svg", { className: "adj-checkbox__indeterminate", viewBox: "0 0 18 18", children: _jsx("path", { d: "M4 9h10" }) })] }), label !== undefined ? _jsx("span", { className: "adj-checkbox__label", children: label }) : null] }));
31
+ }
32
+ //# sourceMappingURL=checkbox.js.map