@greese/ui 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -2
  3. package/bin/greese-utilities.mjs +56 -0
  4. package/dist/_layers.scss +2 -0
  5. package/dist/_maps.scss +1884 -0
  6. package/dist/_tokens-base.scss +174 -0
  7. package/dist/_tokens.scss +2140 -0
  8. package/dist/base.css +67 -0
  9. package/dist/colorScheme.d.ts +16 -0
  10. package/dist/colorScheme.js +13 -0
  11. package/dist/contrast.d.ts +15 -0
  12. package/dist/contrast.js +43 -0
  13. package/dist/css/Accordion.css +9 -0
  14. package/dist/css/ActionSelect.css +6 -0
  15. package/dist/css/Alert.css +84 -0
  16. package/dist/css/AppBar.css +35 -0
  17. package/dist/css/AspectRatio.css +40 -0
  18. package/dist/css/AutoLayout.css +508 -0
  19. package/dist/css/Avatar.css +88 -0
  20. package/dist/css/Badge.css +66 -0
  21. package/dist/css/Box.css +640 -0
  22. package/dist/css/Breadcrumbs.css +57 -0
  23. package/dist/css/Button.css +275 -0
  24. package/dist/css/ButtonGroup.css +40 -0
  25. package/dist/css/Card.css +101 -0
  26. package/dist/css/Carousel.css +170 -0
  27. package/dist/css/Center.css +11 -0
  28. package/dist/css/ChatBubble.css +128 -0
  29. package/dist/css/Checkbox.css +65 -0
  30. package/dist/css/Chip.css +124 -0
  31. package/dist/css/ChoiceGroup.css +57 -0
  32. package/dist/css/Code.css +29 -0
  33. package/dist/css/Collapsible.css +126 -0
  34. package/dist/css/ColorPicker.css +191 -0
  35. package/dist/css/Combobox.css +90 -0
  36. package/dist/css/Container.css +30 -0
  37. package/dist/css/Countdown.css +25 -0
  38. package/dist/css/DateField.css +15 -0
  39. package/dist/css/Dialog.css +640 -0
  40. package/dist/css/Diff.css +103 -0
  41. package/dist/css/Divider.css +19 -0
  42. package/dist/css/Dock.css +91 -0
  43. package/dist/css/Field.css +33 -0
  44. package/dist/css/Fieldset.css +54 -0
  45. package/dist/css/FileInput.css +65 -0
  46. package/dist/css/Footer.css +72 -0
  47. package/dist/css/Grid.css +998 -0
  48. package/dist/css/Header.css +89 -0
  49. package/dist/css/Heading.css +6 -0
  50. package/dist/css/Icon.css +12 -0
  51. package/dist/css/IconButton.css +7 -0
  52. package/dist/css/Image.css +69 -0
  53. package/dist/css/Indicator.css +41 -0
  54. package/dist/css/Input.css +115 -0
  55. package/dist/css/Key.css +42 -0
  56. package/dist/css/Link.css +72 -0
  57. package/dist/css/List.css +52 -0
  58. package/dist/css/Media.css +8 -0
  59. package/dist/css/Menu.css +161 -0
  60. package/dist/css/Motion.css +1356 -0
  61. package/dist/css/NumberField.css +49 -0
  62. package/dist/css/OtpField.css +90 -0
  63. package/dist/css/PageTransition.css +979 -0
  64. package/dist/css/Pagination.css +43 -0
  65. package/dist/css/Popover.css +93 -0
  66. package/dist/css/Progress.css +101 -0
  67. package/dist/css/RadialProgress.css +44 -0
  68. package/dist/css/Radio.css +41 -0
  69. package/dist/css/Rating.css +100 -0
  70. package/dist/css/ScrollSpy.css +6 -0
  71. package/dist/css/SegmentedControl.css +101 -0
  72. package/dist/css/Select.css +115 -0
  73. package/dist/css/Sidebar.css +207 -0
  74. package/dist/css/Skeleton.css +48 -0
  75. package/dist/css/Slider.css +75 -0
  76. package/dist/css/Spacer.css +34 -0
  77. package/dist/css/SpeedDial.css +165 -0
  78. package/dist/css/Spinner.css +44 -0
  79. package/dist/css/Stack.css +528 -0
  80. package/dist/css/Stat.css +107 -0
  81. package/dist/css/Status.css +86 -0
  82. package/dist/css/Steps.css +201 -0
  83. package/dist/css/Swap.css +49 -0
  84. package/dist/css/Switch.css +66 -0
  85. package/dist/css/Table.css +269 -0
  86. package/dist/css/Tabs.css +119 -0
  87. package/dist/css/Text.css +60 -0
  88. package/dist/css/TextRotate.css +147 -0
  89. package/dist/css/Textarea.css +107 -0
  90. package/dist/css/ThemeProvider.css +6 -0
  91. package/dist/css/Tile.css +18 -0
  92. package/dist/css/Toast.css +110 -0
  93. package/dist/css/ToggleButton.css +20 -0
  94. package/dist/css/Tooltip.css +94 -0
  95. package/dist/css/Type.css +211 -0
  96. package/dist/css/Visibility.css +78 -0
  97. package/dist/css/VisuallyHidden.css +15 -0
  98. package/dist/css/core.css +251 -0
  99. package/dist/css.d.ts +29 -0
  100. package/dist/css.js +28 -0
  101. package/dist/effect-classes.d.ts +8 -0
  102. package/dist/effect-classes.js +5 -0
  103. package/dist/effects/css.d.ts +71 -0
  104. package/dist/effects/css.js +184 -0
  105. package/dist/effects/definitions.d.ts +555 -0
  106. package/dist/effects/definitions.js +379 -0
  107. package/dist/effects/frames.d.ts +18 -0
  108. package/dist/effects/frames.js +68 -0
  109. package/dist/effects/sequence.d.ts +33 -0
  110. package/dist/effects/sequence.js +106 -0
  111. package/dist/effects.d.ts +30 -0
  112. package/dist/effects.js +30 -0
  113. package/dist/greese.css +11907 -0
  114. package/dist/index.d.ts +10 -0
  115. package/dist/index.js +10 -0
  116. package/dist/kebab.d.ts +2 -0
  117. package/dist/kebab.js +2 -0
  118. package/dist/palette.css +249 -0
  119. package/dist/palette.d.ts +599 -0
  120. package/dist/palette.js +334 -0
  121. package/dist/shapes.d.ts +193 -0
  122. package/dist/shapes.js +852 -0
  123. package/dist/storage.d.ts +47 -0
  124. package/dist/storage.js +118 -0
  125. package/dist/style-manifest.json +3010 -0
  126. package/dist/theme.d.ts +71 -0
  127. package/dist/theme.js +180 -0
  128. package/dist/tokens.css +253 -0
  129. package/dist/tokens.d.ts +343 -0
  130. package/dist/tokens.js +179 -0
  131. package/dist/typography.d.ts +55 -0
  132. package/dist/typography.js +144 -0
  133. package/dist/utilities.css +6975 -0
  134. package/dist/utilities.d.ts +82 -0
  135. package/dist/utilities.js +636 -0
  136. package/dist/utilitiesFiles.d.ts +18 -0
  137. package/dist/utilitiesFiles.js +26 -0
  138. package/dist/vite.d.ts +40 -0
  139. package/dist/vite.js +43 -0
  140. package/package.json +131 -4
  141. package/src/components/Accordion/Accordion.scss +9 -0
  142. package/src/components/ActionSelect/ActionSelect.scss +6 -0
  143. package/src/components/Alert/Alert.scss +71 -0
  144. package/src/components/AppBar/AppBar.scss +43 -0
  145. package/src/components/AspectRatio/AspectRatio.scss +22 -0
  146. package/src/components/AutoLayout/AutoLayout.scss +90 -0
  147. package/src/components/Avatar/Avatar.scss +91 -0
  148. package/src/components/Badge/Badge.scss +52 -0
  149. package/src/components/Box/Box.scss +63 -0
  150. package/src/components/Breadcrumbs/Breadcrumbs.scss +59 -0
  151. package/src/components/Button/Button.scss +231 -0
  152. package/src/components/ButtonGroup/ButtonGroup.scss +56 -0
  153. package/src/components/Card/Card.scss +99 -0
  154. package/src/components/Carousel/Carousel.scss +161 -0
  155. package/src/components/Center/Center.scss +11 -0
  156. package/src/components/ChatBubble/ChatBubble.scss +119 -0
  157. package/src/components/Checkbox/Checkbox.scss +66 -0
  158. package/src/components/Chip/Chip.scss +119 -0
  159. package/src/components/ChoiceGroup/ChoiceGroup.scss +69 -0
  160. package/src/components/Code/Code.scss +28 -0
  161. package/src/components/Collapsible/Collapsible.scss +136 -0
  162. package/src/components/ColorPicker/ColorPicker.scss +235 -0
  163. package/src/components/Combobox/Combobox.scss +83 -0
  164. package/src/components/Container/Container.scss +28 -0
  165. package/src/components/Countdown/Countdown.scss +28 -0
  166. package/src/components/DateField/DateField.scss +19 -0
  167. package/src/components/Dialog/Dialog.scss +268 -0
  168. package/src/components/Diff/Diff.scss +125 -0
  169. package/src/components/Divider/Divider.scss +22 -0
  170. package/src/components/Dock/Dock.scss +86 -0
  171. package/src/components/Field/Field.scss +38 -0
  172. package/src/components/Fieldset/Fieldset.scss +63 -0
  173. package/src/components/FileInput/FileInput.scss +66 -0
  174. package/src/components/Footer/Footer.scss +79 -0
  175. package/src/components/Grid/Grid.scss +86 -0
  176. package/src/components/Header/Header.scss +111 -0
  177. package/src/components/Heading/Heading.scss +7 -0
  178. package/src/components/Icon/Icon.scss +12 -0
  179. package/src/components/IconButton/IconButton.scss +6 -0
  180. package/src/components/Image/Image.scss +46 -0
  181. package/src/components/Indicator/Indicator.scss +48 -0
  182. package/src/components/Input/Input.scss +58 -0
  183. package/src/components/Key/Key.scss +48 -0
  184. package/src/components/Link/Link.scss +50 -0
  185. package/src/components/List/List.scss +62 -0
  186. package/src/components/Media/Media.scss +7 -0
  187. package/src/components/Menu/Menu.scss +91 -0
  188. package/src/components/Motion/Motion.scss +106 -0
  189. package/src/components/NumberField/NumberField.scss +44 -0
  190. package/src/components/OtpField/OtpField.scss +91 -0
  191. package/src/components/PageTransition/PageTransition.scss +168 -0
  192. package/src/components/Pagination/Pagination.scss +55 -0
  193. package/src/components/Popover/Popover.scss +13 -0
  194. package/src/components/Progress/Progress.scss +126 -0
  195. package/src/components/RadialProgress/RadialProgress.scss +65 -0
  196. package/src/components/Radio/Radio.scss +36 -0
  197. package/src/components/Rating/Rating.scss +121 -0
  198. package/src/components/ScrollSpy/ScrollSpy.scss +6 -0
  199. package/src/components/SegmentedControl/SegmentedControl.scss +107 -0
  200. package/src/components/Select/Select.scss +59 -0
  201. package/src/components/Sidebar/Sidebar.scss +88 -0
  202. package/src/components/Skeleton/Skeleton.scss +60 -0
  203. package/src/components/Slider/Slider.scss +96 -0
  204. package/src/components/Spacer/Spacer.scss +15 -0
  205. package/src/components/SpeedDial/SpeedDial.scss +109 -0
  206. package/src/components/Spinner/Spinner.scss +43 -0
  207. package/src/components/Stack/Stack.scss +57 -0
  208. package/src/components/Stat/Stat.scss +96 -0
  209. package/src/components/Status/Status.scss +60 -0
  210. package/src/components/Steps/Steps.scss +216 -0
  211. package/src/components/Swap/Swap.scss +62 -0
  212. package/src/components/Switch/Switch.scss +63 -0
  213. package/src/components/Table/Table.scss +183 -0
  214. package/src/components/Tabs/Tabs.scss +108 -0
  215. package/src/components/Text/Text.scss +34 -0
  216. package/src/components/TextRotate/TextRotate.scss +51 -0
  217. package/src/components/Textarea/Textarea.scss +56 -0
  218. package/src/components/ThemeProvider/ThemeProvider.scss +7 -0
  219. package/src/components/Tile/Tile.scss +23 -0
  220. package/src/components/Toast/Toast.scss +93 -0
  221. package/src/components/ToggleButton/ToggleButton.scss +23 -0
  222. package/src/components/Tooltip/Tooltip.scss +21 -0
  223. package/src/components/Type/Type.scss +35 -0
  224. package/src/components/Visibility/Visibility.scss +39 -0
  225. package/src/components/VisuallyHidden/VisuallyHidden.scss +17 -0
  226. package/src/styles/_breakpoint-vars.scss +16 -0
  227. package/src/styles/_config.scss +48 -0
  228. package/src/styles/_controls.scss +88 -0
  229. package/src/styles/_core.scss +4 -0
  230. package/src/styles/_effect.scss +51 -0
  231. package/src/styles/_floating.scss +141 -0
  232. package/src/styles/_kit.scss +1548 -0
  233. package/src/styles/_manifest.scss +670 -0
  234. package/src/styles/_mixins.scss +261 -0
  235. package/src/styles/_tones.scss +63 -0
  236. package/src/styles/_type-emit.scss +76 -0
  237. package/src/styles/_typography-vars.scss +8 -0
  238. package/src/styles/base.scss +80 -0
  239. package/src/styles/breakpoints.test.ts +73 -0
  240. package/src/styles/entryPoints.test.ts +68 -0
  241. package/src/styles/index.scss +93 -0
  242. package/src/styles/kit.test.ts +754 -0
  243. package/src/styles/public/_controls.scss +3 -0
  244. package/src/styles/public/_floating.scss +3 -0
  245. package/src/styles/public/_mixins.scss +5 -0
  246. package/src/styles/public/_tones.scss +4 -0
  247. package/themes/bevel.css +1077 -0
  248. package/themes/bevel.scss +1166 -0
  249. package/themes/depth.css +123 -0
  250. package/themes/depth.scss +46 -0
  251. package/themes/extrude.css +219 -0
  252. package/themes/extrude.scss +255 -0
  253. package/themes/folio.css +986 -0
  254. package/themes/folio.scss +1047 -0
  255. package/themes/gentle.css +66 -0
  256. package/themes/gentle.scss +39 -0
  257. package/themes/outline.css +127 -0
  258. package/themes/outline.scss +126 -0
  259. package/themes/pebble.css +65 -0
  260. package/themes/pebble.scss +69 -0
  261. package/themes/pocket.css +137 -0
  262. package/themes/pocket.scss +45 -0
  263. package/themes/ridge.css +927 -0
  264. package/themes/ridge.scss +998 -0
  265. package/themes/snappy.css +82 -0
  266. package/themes/snappy.scss +40 -0
  267. package/themes/soft.css +79 -0
  268. package/themes/soft.scss +84 -0
  269. package/themes/ticket.css +960 -0
  270. package/themes/ticket.scss +1031 -0
  271. package/themes/tilt.css +148 -0
  272. package/themes/tilt.scss +169 -0
  273. package/themes/wipe.css +186 -0
  274. package/themes/wipe.scss +46 -0
package/dist/vite.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import { type ContentOptions } from './utilitiesFiles.ts';
2
+ import type { PurgeOptions } from './utilities.ts';
3
+ /** The module to import: `import 'virtual:greese-utilities.css'`. */
4
+ export declare const UTILITIES_MODULE = "virtual:greese-utilities.css";
5
+ interface ModuleNode {
6
+ id?: string | null;
7
+ }
8
+ /** The part of Vite's plugin API this uses, so @greese/ui needs no dependency on Vite. */
9
+ export interface UtilitiesPlugin {
10
+ name: string;
11
+ resolveId(id: string): string | undefined;
12
+ load(this: {
13
+ addWatchFile?: (file: string) => void;
14
+ }, id: string): Promise<string | undefined>;
15
+ handleHotUpdate(context: {
16
+ file: string;
17
+ server: {
18
+ moduleGraph: {
19
+ getModuleById(id: string): ModuleNode | undefined;
20
+ invalidateModule(m: ModuleNode): void;
21
+ };
22
+ };
23
+ }): ModuleNode[] | undefined;
24
+ }
25
+ /**
26
+ * A Vite plugin that serves only the utility classes your source uses, as
27
+ * `virtual:greese-utilities.css`: it reads the files `content` matches, keeps
28
+ * the classes they spell out (`purgeUtilities`), and rebuilds when one changes.
29
+ * The same CSS `greese-utilities --content …` writes to a file.
30
+ *
31
+ * ```ts
32
+ * // vite.config.ts
33
+ * import { greeseUtilities } from '@greese/ui/vite'
34
+ * export default { plugins: [greeseUtilities({ content: ['index.html', 'src/**\/*.{ts,tsx}'] })] }
35
+ * // main.tsx
36
+ * import 'virtual:greese-utilities.css'
37
+ * ```
38
+ */
39
+ export declare const greeseUtilities: (options: ContentOptions & Omit<PurgeOptions, "content">) => UtilitiesPlugin;
40
+ export {};
package/dist/vite.js ADDED
@@ -0,0 +1,43 @@
1
+ import { purgeFiles } from "./utilitiesFiles.js";
2
+ /** The module to import: `import 'virtual:greese-utilities.css'`. */
3
+ export const UTILITIES_MODULE = 'virtual:greese-utilities.css';
4
+ const RESOLVED = `\0${UTILITIES_MODULE}`;
5
+ /**
6
+ * A Vite plugin that serves only the utility classes your source uses, as
7
+ * `virtual:greese-utilities.css`: it reads the files `content` matches, keeps
8
+ * the classes they spell out (`purgeUtilities`), and rebuilds when one changes.
9
+ * The same CSS `greese-utilities --content …` writes to a file.
10
+ *
11
+ * ```ts
12
+ * // vite.config.ts
13
+ * import { greeseUtilities } from '@greese/ui/vite'
14
+ * export default { plugins: [greeseUtilities({ content: ['index.html', 'src/**\/*.{ts,tsx}'] })] }
15
+ * // main.tsx
16
+ * import 'virtual:greese-utilities.css'
17
+ * ```
18
+ */
19
+ export const greeseUtilities = (options) => {
20
+ let files = new Set();
21
+ return {
22
+ name: 'greese-utilities',
23
+ resolveId: (id) => (id === UTILITIES_MODULE ? RESOLVED : undefined),
24
+ async load(id) {
25
+ if (id !== RESOLVED)
26
+ return undefined;
27
+ const result = await purgeFiles(options);
28
+ files = new Set(result.files);
29
+ for (const file of files)
30
+ this.addWatchFile?.(file);
31
+ return result.css;
32
+ },
33
+ handleHotUpdate({ file, server }) {
34
+ if (!files.has(file))
35
+ return undefined;
36
+ const module = server.moduleGraph.getModuleById(RESOLVED);
37
+ if (!module)
38
+ return undefined;
39
+ server.moduleGraph.invalidateModule(module);
40
+ return [module];
41
+ },
42
+ };
43
+ };
package/package.json CHANGED
@@ -1,6 +1,133 @@
1
1
  {
2
2
  "name": "@greese/ui",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "greese ui's CSS and design tokens: a framework-free stylesheet, per-component CSS, custom properties, Sass kit and TypeScript constants. Works in plain HTML, or under any framework.",
5
+ "keywords": [
6
+ "css",
7
+ "design-system",
8
+ "design-tokens",
9
+ "css-variables",
10
+ "theme",
11
+ "dark-mode",
12
+ "sass",
13
+ "scss",
14
+ "web-components",
15
+ "framework-agnostic",
16
+ "mobile-first"
17
+ ],
18
+ "author": "Chris Moody",
19
+ "license": "MIT",
20
+ "homepage": "https://chris-moody.github.io/greese/",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/chris-moody/greese.git",
24
+ "directory": "packages/ui"
25
+ },
26
+ "bugs": {
27
+ "url": "https://github.com/chris-moody/greese/issues"
28
+ },
29
+ "type": "module",
30
+ "sideEffects": [
31
+ "*.css"
32
+ ],
33
+ "bin": {
34
+ "greese-utilities": "./bin/greese-utilities.mjs"
35
+ },
36
+ "files": [
37
+ "LICENSE",
38
+ "bin",
39
+ "dist",
40
+ "src/styles",
41
+ "src/components/**/*.scss",
42
+ "themes"
43
+ ],
44
+ "exports": {
45
+ ".": {
46
+ "types": "./dist/index.d.ts",
47
+ "default": "./dist/index.js"
48
+ },
49
+ "./effects": {
50
+ "types": "./dist/effects.d.ts",
51
+ "default": "./dist/effects.js"
52
+ },
53
+ "./effect-classes": {
54
+ "types": "./dist/effect-classes.d.ts",
55
+ "default": "./dist/effect-classes.js"
56
+ },
57
+ "./utilities": {
58
+ "types": "./dist/utilities.d.ts",
59
+ "default": "./dist/utilities.js"
60
+ },
61
+ "./shapes": {
62
+ "types": "./dist/shapes.d.ts",
63
+ "default": "./dist/shapes.js"
64
+ },
65
+ "./utilities-files": {
66
+ "types": "./dist/utilitiesFiles.d.ts",
67
+ "default": "./dist/utilitiesFiles.js"
68
+ },
69
+ "./vite": {
70
+ "types": "./dist/vite.d.ts",
71
+ "default": "./dist/vite.js"
72
+ },
73
+ "./utilities.css": "./dist/utilities.css",
74
+ "./styles.css": "./dist/greese.css",
75
+ "./base.css": "./dist/base.css",
76
+ "./css/*": "./dist/css/*",
77
+ "./tokens.css": "./dist/tokens.css",
78
+ "./palette.css": "./dist/palette.css",
79
+ "./themes/*": "./themes/*",
80
+ "./scss": {
81
+ "sass": "./src/styles/index.scss"
82
+ },
83
+ "./scss/kit": {
84
+ "sass": "./src/styles/_kit.scss"
85
+ },
86
+ "./scss/config": {
87
+ "sass": "./src/styles/_config.scss"
88
+ },
89
+ "./scss/mixins": {
90
+ "sass": "./src/styles/public/_mixins.scss"
91
+ },
92
+ "./scss/tones": {
93
+ "sass": "./src/styles/public/_tones.scss"
94
+ },
95
+ "./scss/floating": {
96
+ "sass": "./src/styles/public/_floating.scss"
97
+ },
98
+ "./scss/controls": {
99
+ "sass": "./src/styles/public/_controls.scss"
100
+ },
101
+ "./scss/tokens": "./dist/_tokens.scss",
102
+ "./scss/layers": "./dist/_layers.scss",
103
+ "./scss/maps": "./dist/_maps.scss",
104
+ "./style-manifest.json": "./dist/style-manifest.json",
105
+ "./package.json": "./package.json"
106
+ },
107
+ "publishConfig": {
108
+ "access": "public"
109
+ },
110
+ "scripts": {
111
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
112
+ "build": "npm run clean && tsc -p tsconfig.build.json && node scripts/build-tokens.ts && node scripts/build-utilities.ts && node scripts/build-styles.ts",
113
+ "watch": "node scripts/watch.ts",
114
+ "check-types": "tsc --noEmit",
115
+ "lint": "eslint src scripts --max-warnings 0 && stylelint \"src/**/*.scss\" --max-warnings 0",
116
+ "test": "vitest run",
117
+ "size": "size-limit"
118
+ },
119
+ "devDependencies": {
120
+ "@greese/eslint-config": "*",
121
+ "@greese/typescript-config": "*",
122
+ "@size-limit/preset-small-lib": "^14.2.0",
123
+ "@types/node": "^24.0.0",
124
+ "eslint": "^9.39.0",
125
+ "jsdom": "^30.1.3",
126
+ "sass-embedded": "^1.105.2",
127
+ "size-limit": "^14.2.0",
128
+ "stylelint": "^17.16.0",
129
+ "stylelint-config-standard-scss": "^17.0.0",
130
+ "typescript": "~6.0.3",
131
+ "vitest": "^5.0.5"
132
+ }
133
+ }
@@ -0,0 +1,9 @@
1
+ @layer greese.components {
2
+ .greese-Accordion {
3
+ border-block-start: 1px solid var(--greese-color-border);
4
+ }
5
+
6
+ .greese-AccordionItem {
7
+ border-block-end: 1px solid var(--greese-color-border);
8
+ }
9
+ }
@@ -0,0 +1,6 @@
1
+ @layer greese.components {
2
+ // Never wider than its container: the select gives up width first.
3
+ .greese-ActionSelect {
4
+ max-inline-size: 100%;
5
+ }
6
+ }
@@ -0,0 +1,71 @@
1
+ @use '../../styles/tones';
2
+
3
+ @layer greese.components {
4
+ @include tones.classes(
5
+ 'greese-Alert',
6
+ 'greese-alert-tone',
7
+ (info, positive, warning, negative, neutral, primary, secondary, tertiary)
8
+ );
9
+
10
+ .greese-Alert {
11
+ display: flex;
12
+ gap: var(--greese-space-3);
13
+ align-items: flex-start;
14
+ padding: var(--greese-space-3) var(--greese-space-4);
15
+ font-size: var(--greese-type-p3-font-size);
16
+ line-height: var(--greese-line-height-snug);
17
+ color: var(--greese-color-fg);
18
+ border: 1px solid transparent;
19
+ border-radius: var(--greese-corner-panel);
20
+ }
21
+
22
+ .greese-Alert--soft {
23
+ background-color: color-mix(
24
+ in oklab,
25
+ var(--greese-alert-tone) 10%,
26
+ var(--greese-color-canvas)
27
+ );
28
+ border-color: color-mix(in oklab, var(--greese-alert-tone) 25%, transparent);
29
+ }
30
+
31
+ .greese-Alert--outline {
32
+ border-color: var(--greese-alert-tone);
33
+ }
34
+
35
+ .greese-Alert-icon {
36
+ display: inline-flex;
37
+ flex-shrink: 0;
38
+ margin-block: 0.1em;
39
+ color: var(--greese-alert-tone);
40
+
41
+ > svg {
42
+ inline-size: 1.25em;
43
+ block-size: 1.25em;
44
+ }
45
+ }
46
+
47
+ .greese-Alert-body {
48
+ display: flex;
49
+ flex: 1 1 auto;
50
+ flex-direction: column;
51
+ gap: var(--greese-space-1);
52
+ min-inline-size: 0;
53
+ }
54
+
55
+ .greese-Alert-title {
56
+ margin: 0;
57
+ font-weight: var(--greese-font-weight-semibold);
58
+ }
59
+
60
+ .greese-Alert-actions {
61
+ display: flex;
62
+ flex-wrap: wrap;
63
+ gap: var(--greese-space-2);
64
+ margin-block-start: var(--greese-space-2);
65
+ }
66
+
67
+ .greese-Alert-dismiss {
68
+ margin-block: calc(-1 * var(--greese-space-1));
69
+ margin-inline-end: calc(-1 * var(--greese-space-2));
70
+ }
71
+ }
@@ -0,0 +1,43 @@
1
+ @use '../../styles/mixins';
2
+
3
+ @layer greese.components {
4
+ .greese-AppBar {
5
+ @include mixins.component-root;
6
+
7
+ display: flex;
8
+ gap: var(--greese-space-3);
9
+ align-items: center;
10
+ min-block-size: 3.5rem;
11
+ padding-block-start: env(safe-area-inset-top);
12
+ padding-inline: max(var(--greese-space-4), env(safe-area-inset-left))
13
+ max(var(--greese-space-4), env(safe-area-inset-right));
14
+ color: var(--greese-color-fg);
15
+ background-color: var(--greese-color-surface-overlay);
16
+ border-block-end: 1px solid var(--greese-color-border);
17
+ }
18
+
19
+ .greese-AppBar--sticky {
20
+ position: sticky;
21
+ inset-block-start: 0;
22
+ z-index: var(--greese-z-index-sticky);
23
+ }
24
+
25
+ // Shadow fades in over the first few rem of scroll, with no JS.
26
+ @supports (animation-timeline: scroll()) {
27
+ .greese-AppBar--elevate {
28
+ animation: greese-appbar-elevate linear both;
29
+ animation-range: 0 3rem;
30
+ animation-timeline: scroll(nearest block);
31
+ }
32
+ }
33
+
34
+ @keyframes greese-appbar-elevate {
35
+ from {
36
+ box-shadow: none;
37
+ }
38
+
39
+ to {
40
+ box-shadow: var(--greese-shadow-md);
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,22 @@
1
+ @use '../../styles/mixins';
2
+
3
+ @layer greese.components {
4
+ .greese-AspectRatio {
5
+ position: relative;
6
+ overflow: hidden;
7
+
8
+ > :is(img, video, iframe, picture, canvas, svg) {
9
+ display: block;
10
+ inline-size: 100%;
11
+ block-size: 100%;
12
+ object-fit: cover;
13
+ border: 0;
14
+ }
15
+ }
16
+
17
+ .greese-AspectRatio--contain > :is(img, video, picture, canvas, svg) {
18
+ object-fit: contain;
19
+ }
20
+
21
+ @include mixins.responsive-prop('greese-AspectRatio', 'ratio', aspect-ratio);
22
+ }
@@ -0,0 +1,90 @@
1
+ @use '../../styles/mixins';
2
+
3
+ // Registered so they never inherit: a nested item without a size must not
4
+ // pick up its parent item's.
5
+ @property --greese-autolayoutitem-s {
6
+ syntax: '*';
7
+ inherits: false;
8
+ }
9
+
10
+ @property --greese-autolayoutitem-m {
11
+ syntax: '*';
12
+ inherits: false;
13
+ }
14
+
15
+ @layer greese.components {
16
+ .greese-AutoLayout {
17
+ // Plain custom properties: items inherit the row's columns and gap.
18
+ --greese-autolayout-columns: 12;
19
+ --greese-autolayout-column-gap: 0px;
20
+
21
+ display: flex;
22
+ flex-wrap: wrap;
23
+ min-inline-size: 0;
24
+ }
25
+
26
+ // Each item claims its share of the row less its share of the gaps, so
27
+ // `n` items of `columns / n` fill a row exactly: basis = p·100% − (1 − p)·gap.
28
+ .greese-AutoLayoutItem {
29
+ --greese-autolayoutitem-columns: var(--greese-autolayout-columns, 12);
30
+ --greese-autolayoutitem-size: var(
31
+ --greese-autolayoutitem-s,
32
+ var(--greese-autolayoutitem-columns)
33
+ );
34
+ --greese-autolayoutitem-max: var(
35
+ --greese-autolayoutitem-m,
36
+ var(--greese-autolayoutitem-size)
37
+ );
38
+ --greese-autolayoutitem-p: calc(
39
+ var(--greese-autolayoutitem-size) / var(--greese-autolayoutitem-columns)
40
+ );
41
+ --greese-autolayoutitem-q: calc(
42
+ var(--greese-autolayoutitem-max) / var(--greese-autolayoutitem-columns)
43
+ );
44
+ --greese-autolayoutitem-gap: var(--greese-autolayout-column-gap, 0px);
45
+
46
+ // Each item's share of the gaps beside it.
47
+ --greese-autolayoutitem-p-gap: calc(
48
+ (1 - var(--greese-autolayoutitem-p)) * var(--greese-autolayoutitem-gap)
49
+ );
50
+ --greese-autolayoutitem-q-gap: calc(
51
+ (1 - var(--greese-autolayoutitem-q)) * var(--greese-autolayoutitem-gap)
52
+ );
53
+
54
+ box-sizing: border-box;
55
+
56
+ // Grows by the columns it may add, never shrinks below its size.
57
+ flex: max(0, var(--greese-autolayoutitem-max) - var(--greese-autolayoutitem-size)) 0
58
+ calc(var(--greese-autolayoutitem-p) * 100% - var(--greese-autolayoutitem-p-gap));
59
+ min-inline-size: 0;
60
+ max-inline-size: calc(
61
+ var(--greese-autolayoutitem-q) * 100% - var(--greese-autolayoutitem-q-gap)
62
+ );
63
+ }
64
+
65
+ // `gap` sets both gaps and tells the items the column gap.
66
+ @include mixins.responsive-prop(
67
+ 'greese-AutoLayout',
68
+ 'gap',
69
+ (column-gap, row-gap, --greese-autolayout-column-gap),
70
+ mixins.space-tokens()
71
+ );
72
+
73
+ // After `gap`, so it wins where both apply.
74
+ @include mixins.responsive-prop(
75
+ 'greese-AutoLayout',
76
+ 'row-gap',
77
+ row-gap,
78
+ mixins.space-tokens()
79
+ );
80
+ @include mixins.responsive-prop(
81
+ 'greese-AutoLayoutItem',
82
+ 'size',
83
+ --greese-autolayoutitem-s
84
+ );
85
+ @include mixins.responsive-prop(
86
+ 'greese-AutoLayoutItem',
87
+ 'max',
88
+ --greese-autolayoutitem-m
89
+ );
90
+ }
@@ -0,0 +1,91 @@
1
+ @use '../../styles/mixins';
2
+
3
+ $sizes: (
4
+ xs: 1rem,
5
+ sm: 1.5rem,
6
+ md: 2.25rem,
7
+ lg: 3rem,
8
+ xl: 4rem,
9
+ );
10
+
11
+ @layer greese.components {
12
+ .greese-Avatar {
13
+ @include mixins.component-root;
14
+
15
+ display: inline-flex;
16
+ flex-shrink: 0;
17
+ inline-size: var(--greese-avatar-size);
18
+ block-size: var(--greese-avatar-size);
19
+ overflow: hidden;
20
+ font-size: calc(var(--greese-avatar-size) * 0.4);
21
+ font-weight: var(--greese-font-weight-semibold);
22
+ line-height: 1;
23
+ vertical-align: middle;
24
+ user-select: none;
25
+ border-radius: var(--greese-corner-round);
26
+
27
+ > img {
28
+ inline-size: 100%;
29
+ block-size: 100%;
30
+ object-fit: cover;
31
+ }
32
+ }
33
+
34
+ @each $size, $value in $sizes {
35
+ .greese-Avatar--#{$size} {
36
+ --greese-avatar-size: #{$value};
37
+ }
38
+ }
39
+
40
+ .greese-Avatar--square {
41
+ border-radius: var(--greese-corner-panel);
42
+ }
43
+
44
+ .greese-Avatar-fallback {
45
+ display: grid;
46
+ place-items: center;
47
+ inline-size: 100%;
48
+ block-size: 100%;
49
+ color: var(--greese-color-primary);
50
+ background-color: color-mix(
51
+ in oklab,
52
+ var(--greese-color-primary) 16%,
53
+ var(--greese-color-canvas)
54
+ );
55
+ }
56
+
57
+ .greese-Avatar--count .greese-Avatar-fallback {
58
+ color: var(--greese-color-fg-muted);
59
+ background-color: var(--greese-color-surface);
60
+ }
61
+
62
+ .greese-AvatarGroup {
63
+ display: inline-flex;
64
+ align-items: center;
65
+ isolation: isolate;
66
+ }
67
+
68
+ // On the group and its avatars, so the group's size wins over each
69
+ // avatar's own (an Avatar is `md` unless told otherwise), and the count
70
+ // matches them.
71
+ @each $size, $value in $sizes {
72
+ .greese-AvatarGroup--#{$size},
73
+ .greese-AvatarGroup--#{$size} .greese-Avatar {
74
+ --greese-avatar-size: #{$value};
75
+ }
76
+ }
77
+
78
+ .greese-AvatarGroup-item {
79
+ position: relative;
80
+ display: inline-flex;
81
+ border-radius: var(--greese-corner-round);
82
+
83
+ > .greese-Avatar {
84
+ box-shadow: 0 0 0 2px var(--greese-color-canvas);
85
+ }
86
+
87
+ & + & {
88
+ margin-inline-start: calc(var(--greese-avatar-size) * -0.25);
89
+ }
90
+ }
91
+ }
@@ -0,0 +1,52 @@
1
+ @use '../../styles/tones';
2
+
3
+ @layer greese.components {
4
+ @include tones.classes(
5
+ 'greese-Badge',
6
+ 'greese-badge-tone',
7
+ (neutral, primary, secondary, tertiary, accent, positive, negative, warning, info)
8
+ );
9
+
10
+ // Every variant is opaque: mixed over a surface, never over transparent,
11
+ // so whatever a badge is pinned to (an Indicator's avatar or icon) doesn't
12
+ // show through it. Set the surface to what it sits on, if not the canvas.
13
+ .greese-Badge {
14
+ --greese-badge-surface: var(--greese-color-canvas);
15
+
16
+ display: inline-flex;
17
+ gap: var(--greese-space-1);
18
+ align-items: center;
19
+ padding: 0.125rem 0.5rem;
20
+ font-size: var(--greese-type-caption-font-size);
21
+ font-weight: var(--greese-font-weight-semibold);
22
+ line-height: var(--greese-line-height-snug);
23
+ white-space: nowrap;
24
+ vertical-align: middle;
25
+ border: 1px solid transparent;
26
+ border-radius: var(--greese-corner-pill);
27
+ }
28
+
29
+ .greese-Badge--soft {
30
+ color: var(--greese-badge-tone);
31
+ background-color: color-mix(
32
+ in oklab,
33
+ var(--greese-badge-tone) 14%,
34
+ var(--greese-badge-surface)
35
+ );
36
+ }
37
+
38
+ .greese-Badge--solid {
39
+ color: var(--greese-badge-tone-on);
40
+ background-color: var(--greese-badge-tone);
41
+ }
42
+
43
+ .greese-Badge--outline {
44
+ color: var(--greese-badge-tone);
45
+ background-color: var(--greese-badge-surface);
46
+ border-color: color-mix(
47
+ in oklab,
48
+ var(--greese-badge-tone) 55%,
49
+ var(--greese-badge-surface)
50
+ );
51
+ }
52
+ }
@@ -0,0 +1,63 @@
1
+ @use '../../styles/mixins';
2
+
3
+ @layer greese.components {
4
+ .greese-Box {
5
+ @include mixins.component-root;
6
+ }
7
+ }
8
+
9
+ // Style props are utilities: they win over any component's own styles (a
10
+ // Container's default gutter, say) regardless of source order.
11
+ @layer greese.utilities {
12
+ $space: (
13
+ m: margin,
14
+ mx: margin-inline,
15
+ my: margin-block,
16
+ mt: margin-block-start,
17
+ mb: margin-block-end,
18
+ ms: margin-inline-start,
19
+ me: margin-inline-end,
20
+ p: padding,
21
+ px: padding-inline,
22
+ py: padding-block,
23
+ pt: padding-block-start,
24
+ pb: padding-block-end,
25
+ ps: padding-inline-start,
26
+ pe: padding-inline-end,
27
+ gap: gap,
28
+ );
29
+
30
+ @each $prop, $property in $space {
31
+ @include mixins.responsive-prop('greese-Box', $prop, $property);
32
+ }
33
+
34
+ @include mixins.responsive-prop('greese-Box', 'w', inline-size);
35
+ @include mixins.responsive-prop('greese-Box', 'max-w', max-inline-size);
36
+ @include mixins.responsive-prop(
37
+ 'greese-Box',
38
+ 'display',
39
+ display,
40
+ (
41
+ block: block,
42
+ inline: inline,
43
+ inline-block: inline-block,
44
+ flex: flex,
45
+ inline-flex: inline-flex,
46
+ grid: grid,
47
+ inline-grid: inline-grid,
48
+ none: none,
49
+ contents: contents,
50
+ )
51
+ );
52
+ @include mixins.responsive-prop(
53
+ 'greese-Box',
54
+ 'text-align',
55
+ text-align,
56
+ (
57
+ start: start,
58
+ center: center,
59
+ end: end,
60
+ justify: justify,
61
+ )
62
+ );
63
+ }