@graphprotocol/gds-css 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 (136) hide show
  1. package/README.md +80 -0
  2. package/dist/component-registry.d.ts +90 -0
  3. package/dist/component-registry.d.ts.map +1 -0
  4. package/dist/component-registry.js +93 -0
  5. package/dist/component-registry.js.map +1 -0
  6. package/dist/css-props/getCSSPropRawValue.d.ts +4 -0
  7. package/dist/css-props/getCSSPropRawValue.d.ts.map +1 -0
  8. package/dist/css-props/getCSSPropRawValue.js +41 -0
  9. package/dist/css-props/getCSSPropRawValue.js.map +1 -0
  10. package/dist/css-props/index.d.ts +5 -0
  11. package/dist/css-props/index.d.ts.map +1 -0
  12. package/dist/css-props/index.js +5 -0
  13. package/dist/css-props/index.js.map +1 -0
  14. package/dist/css-props/parseCSSPropValue.d.ts +7 -0
  15. package/dist/css-props/parseCSSPropValue.d.ts.map +1 -0
  16. package/dist/css-props/parseCSSPropValue.js +70 -0
  17. package/dist/css-props/parseCSSPropValue.js.map +1 -0
  18. package/dist/css-props/registerCSSProps.d.ts +7 -0
  19. package/dist/css-props/registerCSSProps.d.ts.map +1 -0
  20. package/dist/css-props/registerCSSProps.js +231 -0
  21. package/dist/css-props/registerCSSProps.js.map +1 -0
  22. package/dist/css-props/types.d.ts +29 -0
  23. package/dist/css-props/types.d.ts.map +1 -0
  24. package/dist/css-props/types.js +2 -0
  25. package/dist/css-props/types.js.map +1 -0
  26. package/dist/css-states/index.d.ts +3 -0
  27. package/dist/css-states/index.d.ts.map +1 -0
  28. package/dist/css-states/index.js +3 -0
  29. package/dist/css-states/index.js.map +1 -0
  30. package/dist/css-states/registerCSSStates.d.ts +23 -0
  31. package/dist/css-states/registerCSSStates.d.ts.map +1 -0
  32. package/dist/css-states/registerCSSStates.js +119 -0
  33. package/dist/css-states/registerCSSStates.js.map +1 -0
  34. package/dist/css-states/states.d.ts +71 -0
  35. package/dist/css-states/states.d.ts.map +1 -0
  36. package/dist/css-states/states.js +140 -0
  37. package/dist/css-states/states.js.map +1 -0
  38. package/dist/design-tokens.generated.d.ts +1167 -0
  39. package/dist/design-tokens.generated.d.ts.map +1 -0
  40. package/dist/design-tokens.generated.js +2675 -0
  41. package/dist/design-tokens.generated.js.map +1 -0
  42. package/dist/index.d.ts +7 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +7 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/tailwind-customizations/index.d.ts +3 -0
  47. package/dist/tailwind-customizations/index.d.ts.map +1 -0
  48. package/dist/tailwind-customizations/index.js +3 -0
  49. package/dist/tailwind-customizations/index.js.map +1 -0
  50. package/dist/tailwind-customizations/registerUtilities.d.ts +9 -0
  51. package/dist/tailwind-customizations/registerUtilities.d.ts.map +1 -0
  52. package/dist/tailwind-customizations/registerUtilities.js +59 -0
  53. package/dist/tailwind-customizations/registerUtilities.js.map +1 -0
  54. package/dist/tailwind-customizations/registerVariants.d.ts +8 -0
  55. package/dist/tailwind-customizations/registerVariants.d.ts.map +1 -0
  56. package/dist/tailwind-customizations/registerVariants.js +197 -0
  57. package/dist/tailwind-customizations/registerVariants.js.map +1 -0
  58. package/dist/tailwind-customizations/variants.d.ts +72 -0
  59. package/dist/tailwind-customizations/variants.d.ts.map +1 -0
  60. package/dist/tailwind-customizations/variants.js +153 -0
  61. package/dist/tailwind-customizations/variants.js.map +1 -0
  62. package/dist/tailwind-plugin.d.ts +4 -0
  63. package/dist/tailwind-plugin.d.ts.map +1 -0
  64. package/dist/tailwind-plugin.js +12 -0
  65. package/dist/tailwind-plugin.js.map +1 -0
  66. package/dist/types.d.ts +4 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +2 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/utils/cssUnescape.d.ts +20 -0
  71. package/dist/utils/cssUnescape.d.ts.map +1 -0
  72. package/dist/utils/cssUnescape.js +44 -0
  73. package/dist/utils/cssUnescape.js.map +1 -0
  74. package/dist/utils/index.d.ts +6 -0
  75. package/dist/utils/index.d.ts.map +1 -0
  76. package/dist/utils/index.js +6 -0
  77. package/dist/utils/index.js.map +1 -0
  78. package/dist/utils/pxToTw.d.ts +3 -0
  79. package/dist/utils/pxToTw.d.ts.map +1 -0
  80. package/dist/utils/pxToTw.js +5 -0
  81. package/dist/utils/pxToTw.js.map +1 -0
  82. package/dist/utils/twToPx.d.ts +3 -0
  83. package/dist/utils/twToPx.d.ts.map +1 -0
  84. package/dist/utils/twToPx.js +5 -0
  85. package/dist/utils/twToPx.js.map +1 -0
  86. package/dist/utils/twToRem.d.ts +3 -0
  87. package/dist/utils/twToRem.d.ts.map +1 -0
  88. package/dist/utils/twToRem.js +5 -0
  89. package/dist/utils/twToRem.js.map +1 -0
  90. package/dist/utils/wrapSelector.d.ts +10 -0
  91. package/dist/utils/wrapSelector.d.ts.map +1 -0
  92. package/dist/utils/wrapSelector.js +57 -0
  93. package/dist/utils/wrapSelector.js.map +1 -0
  94. package/package.json +65 -0
  95. package/src/component-registry.ts +213 -0
  96. package/src/css-props/getCSSPropRawValue.ts +52 -0
  97. package/src/css-props/index.ts +4 -0
  98. package/src/css-props/parseCSSPropValue.ts +81 -0
  99. package/src/css-props/registerCSSProps.ts +274 -0
  100. package/src/css-props/types.ts +35 -0
  101. package/src/css-states/index.ts +2 -0
  102. package/src/css-states/registerCSSStates.ts +136 -0
  103. package/src/css-states/states.ts +160 -0
  104. package/src/design-tokens.generated.ts +2799 -0
  105. package/src/index.ts +6 -0
  106. package/src/tailwind-customizations/index.ts +2 -0
  107. package/src/tailwind-customizations/registerUtilities.ts +65 -0
  108. package/src/tailwind-customizations/registerVariants.ts +296 -0
  109. package/src/tailwind-customizations/variants.ts +190 -0
  110. package/src/tailwind-plugin.ts +14 -0
  111. package/src/types.ts +4 -0
  112. package/src/utils/cssUnescape.ts +49 -0
  113. package/src/utils/index.ts +5 -0
  114. package/src/utils/pxToTw.ts +4 -0
  115. package/src/utils/twToPx.ts +4 -0
  116. package/src/utils/twToRem.ts +4 -0
  117. package/src/utils/wrapSelector.ts +60 -0
  118. package/styles/fonts/EuclidCircularA-Bold.woff2 +0 -0
  119. package/styles/fonts/EuclidCircularA-BoldItalic.woff2 +0 -0
  120. package/styles/fonts/EuclidCircularA-Light.woff2 +0 -0
  121. package/styles/fonts/EuclidCircularA-LightItalic.woff2 +0 -0
  122. package/styles/fonts/EuclidCircularA-Medium.woff2 +0 -0
  123. package/styles/fonts/EuclidCircularA-MediumItalic.woff2 +0 -0
  124. package/styles/fonts/EuclidCircularA-Regular.woff2 +0 -0
  125. package/styles/fonts/EuclidCircularA-RegularItalic.woff2 +0 -0
  126. package/styles/fonts/EuclidCircularA-Semibold.woff2 +0 -0
  127. package/styles/fonts/EuclidCircularA-SemiboldItalic.woff2 +0 -0
  128. package/styles/fonts.css +83 -0
  129. package/styles/global.css +203 -0
  130. package/styles/layers.css +8 -0
  131. package/styles/tailwind.css +13 -0
  132. package/styles/tailwind.vscode.css +11 -0
  133. package/styles/theme.css +420 -0
  134. package/styles/typography.css +198 -0
  135. package/styles/utilities.css +305 -0
  136. package/styles/variants.css +34 -0
@@ -0,0 +1,231 @@
1
+ import cssesc from 'cssesc';
2
+ import { parseNumber } from '@graphprotocol/gds-utils';
3
+ import { getRegisteredComponent, getRegisteredComponents, } from "../component-registry.js";
4
+ import { getCSSPropRawValue } from "./getCSSPropRawValue.js";
5
+ /**
6
+ * Registers CSS Props functionality in the Tailwind plugin. This includes custom properties,
7
+ * utilities, and variants for prop-based styling.
8
+ */
9
+ export function registerCSSProps(api) {
10
+ const componentsByCSSProp = getRegisteredComponents(true).reduce((outerMap, component) => {
11
+ for (const cssProp of Object.values(component.cssProps)) {
12
+ const innerMap = outerMap.get(cssProp.kebabName) ??
13
+ outerMap.set(cssProp.kebabName, new Map()).get(cssProp.kebabName);
14
+ innerMap.set(component.kebabName, component);
15
+ }
16
+ return outerMap;
17
+ }, new Map());
18
+ const cssPropKebabNames = [...componentsByCSSProp.keys()];
19
+ /** Register a couple non-inherited custom properties for each prop name. */
20
+ for (const cssPropKebabName of cssPropKebabNames) {
21
+ api.addBase({
22
+ [`@property --gds-default-${cssPropKebabName}`]: {
23
+ syntax: "'*'",
24
+ inherits: 'false',
25
+ },
26
+ [`@property --gds-passed-${cssPropKebabName}`]: {
27
+ syntax: "'*'",
28
+ inherits: 'false',
29
+ },
30
+ [`@property --gds-prop-${cssPropKebabName}`]: {
31
+ syntax: "'*'",
32
+ inherits: 'false',
33
+ },
34
+ });
35
+ }
36
+ /** Register a custom property for each component-prop pair to restrict the allowed values. */
37
+ for (const component of getRegisteredComponents()) {
38
+ for (const cssProp of Object.values(component.cssProps)) {
39
+ const syntax = (() => {
40
+ switch (cssProp.type) {
41
+ case 'values':
42
+ return `'${cssProp.values.map((value) => getCSSPropRawValue(cssProp, value)).join(' | ')}'`;
43
+ case 'string':
44
+ return "'<string>'";
45
+ case 'number':
46
+ return "'<number>'";
47
+ case 'length':
48
+ return "'<length-percentage>'";
49
+ case 'color':
50
+ return "'<color>'";
51
+ default:
52
+ return "'*'";
53
+ }
54
+ })();
55
+ api.addBase({
56
+ [`@property --gds-${component.kebabName}-${cssProp.kebabName}`]: {
57
+ syntax,
58
+ /**
59
+ * We only need this property to inherit if the type is not `values`, because `values` CSS
60
+ * props are accessed via style queries.
61
+ */
62
+ inherits: cssProp.type === 'values' ? 'false' : 'true',
63
+ 'initial-value': (() => {
64
+ if (cssProp.type === 'length' &&
65
+ typeof cssProp.initialValue === 'string' &&
66
+ /(cap|ch|em|ex|ic|lh)$/.test(cssProp.initialValue)) {
67
+ // `initial-value` cannot be font-size-relative
68
+ return '100%';
69
+ }
70
+ return getCSSPropRawValue(cssProp, cssProp.initialValue);
71
+ })(),
72
+ },
73
+ });
74
+ }
75
+ /**
76
+ * Base styles for each component, including defining the default value of each CSS prop and
77
+ * applying the value passed via the React prop, if any. See `getCSSPropsAttributes` for details
78
+ * on how each prop type is handled.
79
+ */
80
+ api.addBase({
81
+ '@layer components': {
82
+ [`.${component.className}`]: {
83
+ '--tw-sort': 'container-type',
84
+ ...(component.containerName ? { 'container-name': component.containerName } : {}),
85
+ ...Object.values(component.cssProps).reduce((rules, cssProp) => {
86
+ return {
87
+ ...rules,
88
+ [`--gds-passed-or-default-${cssProp.kebabName}`]: `var(--gds-passed-${cssProp.kebabName}, var(--gds-default-${cssProp.kebabName}, ${getCSSPropRawValue(cssProp, cssProp.initialValue)}))`,
89
+ [`--gds-${component.kebabName}-${cssProp.kebabName}`]: `var(--gds-prop-${cssProp.kebabName}, var(--gds-passed-or-default-${cssProp.kebabName}))`,
90
+ };
91
+ }, {}),
92
+ },
93
+ },
94
+ });
95
+ }
96
+ function parseBareValueNumber(bareValue, increment = 0.25) {
97
+ const number = parseNumber(bareValue, { strict: true });
98
+ if (number === null || number < 0 || !Number.isInteger(number * (1 / increment)))
99
+ return null;
100
+ return number;
101
+ }
102
+ /** Register `prop-{prop}-{value}` and `default-{prop}-{value}` utilities. */
103
+ for (const [cssPropKebabName, components] of componentsByCSSProp) {
104
+ const cssProps = [...components.values()].flatMap((component) => {
105
+ const cssProp = component.findCSSPropByKebabName(cssPropKebabName);
106
+ return cssProp ? [cssProp] : [];
107
+ });
108
+ const cssPropTypes = cssProps.map((cssProp) => cssProp.type);
109
+ const matchUtilitiesType = ['any'];
110
+ const matchUtilitiesValues = {
111
+ inherit: 'inherit',
112
+ };
113
+ cssProps.forEach((cssProp) => {
114
+ ;
115
+ [...(cssProp.values ?? []), ...(cssProp.suggestedValues ?? [])].forEach((value) => {
116
+ matchUtilitiesValues[String(value)] = getCSSPropRawValue(cssProp, value);
117
+ });
118
+ });
119
+ if (cssPropTypes.includes('number') && !cssPropTypes.includes('length')) {
120
+ const bareValueFunction = (value) => {
121
+ const numberValue = parseBareValueNumber(value.value);
122
+ if (numberValue === null)
123
+ return undefined;
124
+ return String(numberValue);
125
+ };
126
+ matchUtilitiesValues['__BARE_VALUE__'] = bareValueFunction;
127
+ }
128
+ if (cssPropTypes.includes('length')) {
129
+ for (const [spacingKey, spacingValue] of Object.entries(api.theme('spacing'))) {
130
+ matchUtilitiesValues[spacingKey] =
131
+ parseNumber(spacingKey, { strict: true }) !== null
132
+ ? `--spacing(${spacingKey})`
133
+ : spacingValue;
134
+ }
135
+ const bareValueFunction = (value) => {
136
+ const numberValue = parseBareValueNumber(value.value);
137
+ if (numberValue === null)
138
+ return undefined;
139
+ return `--spacing(${numberValue})`;
140
+ };
141
+ matchUtilitiesValues['__BARE_VALUE__'] = bareValueFunction;
142
+ }
143
+ if (cssPropTypes.includes('color')) {
144
+ matchUtilitiesType.push('color'); // Allows using opacity modifiers
145
+ for (const colorKey in api.theme('colors')) {
146
+ matchUtilitiesValues[colorKey] = getCSSPropRawValue({ type: 'color', defaultValue: 'current' }, colorKey);
147
+ }
148
+ }
149
+ api.matchUtilities(Object.fromEntries(['prop', 'default'].map((utilityType) => [
150
+ `${utilityType}-${cssPropKebabName}`,
151
+ (value) => ({
152
+ [`--gds-${utilityType}-${cssPropKebabName}`]: value,
153
+ }),
154
+ ])), {
155
+ type: matchUtilitiesType,
156
+ values: matchUtilitiesValues,
157
+ });
158
+ }
159
+ /**
160
+ * Register `@prop-{prop}-{value}/{component}` and `@prop-not-{prop}-{value}/{component}` variants
161
+ * for props of type `values`, for components to use internally.
162
+ */
163
+ for (const variant of ['@prop-not', '@prop']) {
164
+ api.matchVariant(variant, (cssPropKebabNameAndValue, { modifier: componentKebabName }) => {
165
+ /**
166
+ * If the modifier is explicitly `dummy`, consider the variant invalid by returning an empty
167
+ * selector list (no CSS will be generated for it).
168
+ */
169
+ if (componentKebabName === 'dummy')
170
+ return [];
171
+ /**
172
+ * Default a missing modifier to `dummy` instead of considering the variant invalid so that
173
+ * it's suggested by Tailwind IntelliSense.
174
+ */
175
+ const component = getRegisteredComponent(componentKebabName ?? 'dummy');
176
+ /**
177
+ * If no component is found (i.e. the modifier is not a valid component name), consider the
178
+ * variant invalid.
179
+ */
180
+ if (!component)
181
+ return [];
182
+ try {
183
+ const { cssPropKebabName, value } = JSON.parse(cssPropKebabNameAndValue);
184
+ if (typeof cssPropKebabName !== 'string' ||
185
+ (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean'))
186
+ return [];
187
+ const cssProp = component.findCSSPropByKebabName(cssPropKebabName);
188
+ /**
189
+ * Only consider the variant valid if the prop exists on the component and is of type
190
+ * `values`, and the value is valid for it (unless the component is `dummy`, which is used
191
+ * to list all variants in IntelliSense regardless of the component).
192
+ */
193
+ if ((!cssProp || cssProp.type !== 'values' || !cssProp.values.includes(value)) &&
194
+ component.kebabName !== 'dummy') {
195
+ return [];
196
+ }
197
+ const rawValue = cssProp ? getCSSPropRawValue(cssProp, value) : String(value);
198
+ return [
199
+ /** Style query selector for modern browsers. */
200
+ `@container ${component.containerName} ${variant === '@prop-not' ? 'not' : ''} style(--gds-${component.kebabName}-${cssPropKebabName}: ${rawValue})`,
201
+ /**
202
+ * Fallback selector for browsers without style query support, which unfortunately
203
+ * cannot be queried, but happens to be the same browsers that don't support view
204
+ * transitions (except for Firefox which introduced support for view transitions in
205
+ * version 144 but not style queries). Note that we don't want the polyfill rules to be
206
+ * applied when style queries are supported to prevent bugs on the first render, where
207
+ * polyfill attributes are present even when the polyfill is not needed (see
208
+ * `useCSSPropsPolyfill` for an explanation why).
209
+ */
210
+ `@supports (not (view-transition-name: none)) or (-moz-orient: inline) { &:where(.${component.className}${variant === '@prop-not' ? ':not' : ':is'}([data-gds-prop-polyfill-${cssPropKebabName}=${cssesc(rawValue, { isIdentifier: true })}]) *) }`,
211
+ ];
212
+ }
213
+ catch {
214
+ /**
215
+ * If the value is invalid JSON (e.g. `@prop-[some-arbitrary-string]`), consider the
216
+ * variant invalid.
217
+ */
218
+ return [];
219
+ }
220
+ }, {
221
+ values: Object.fromEntries([...componentsByCSSProp.entries()].flatMap(([cssPropKebabName, components]) => {
222
+ const cssPropValues = [...components.values()].flatMap((component) => component.findCSSPropByKebabName(cssPropKebabName)?.values ?? []);
223
+ return cssPropValues.map((value) => [
224
+ `${cssPropKebabName}-${value}`,
225
+ JSON.stringify({ cssPropKebabName, value }),
226
+ ]);
227
+ })),
228
+ });
229
+ }
230
+ }
231
+ //# sourceMappingURL=registerCSSProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerCSSProps.js","sourceRoot":"","sources":["../../src/css-props/registerCSSProps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { GDSColor } from '../design-tokens.generated.ts';
2
+ type CSSUnit = 'px' | 'em' | 'rem' | 'lh' | 'rlh' | '%' | 'vw' | 'vh' | 'vmin' | 'vmax';
3
+ type CSSLength = number | `${number}${CSSUnit}`;
4
+ export type CSSPropValue = string | number | boolean;
5
+ export type CSSPropString = string;
6
+ export type CSSPropNumber = number;
7
+ export type CSSPropLength = CSSLength;
8
+ export type CSSPropColor = GDSColor | `${GDSColor}/${number}`;
9
+ type Type = 'values' | 'string' | 'number' | 'length' | 'color';
10
+ type TypeToValue<T extends Type, V extends CSSPropValue = CSSPropValue> = T extends 'values' ? V : T extends 'string' ? CSSPropString : T extends 'number' ? CSSPropNumber : T extends 'length' ? CSSPropLength : CSSPropColor;
11
+ export type CSSPropDefinition<T extends Type = Type, V extends CSSPropValue[] = CSSPropValue[], D extends TypeToValue<T, V[number]> = TypeToValue<T, V[number]>> = T extends 'values' ? {
12
+ type: T;
13
+ values: V;
14
+ suggestedValues?: never;
15
+ defaultValue?: D & TypeToValue<T, V[number]>;
16
+ } : T extends 'number' ? {
17
+ type: T;
18
+ values?: never;
19
+ suggestedValues?: number[];
20
+ defaultValue?: D & TypeToValue<T>;
21
+ } : {
22
+ type: T;
23
+ values?: never;
24
+ suggestedValues?: never;
25
+ defaultValue?: D & TypeToValue<T>;
26
+ };
27
+ export type CSSPropType<P extends CSSPropDefinition> = P['values'] extends CSSPropValue[] ? TypeToValue<P['type'], P['values'][number]> : TypeToValue<P['type']>;
28
+ export {};
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/css-props/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AAE7D,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;AACvF,KAAK,SAAS,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,OAAO,EAAE,CAAA;AAE/C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AACpD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAClC,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAClC,MAAM,MAAM,aAAa,GAAG,SAAS,CAAA;AACrC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAA;AAE7D,KAAK,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;AAC/D,KAAK,WAAW,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,CAAC,SAAS,QAAQ,GACxF,CAAC,GACD,CAAC,SAAS,QAAQ,GAChB,aAAa,GACb,CAAC,SAAS,QAAQ,GAChB,aAAa,GACb,CAAC,SAAS,QAAQ,GAChB,aAAa,GACb,YAAY,CAAA;AAEtB,MAAM,MAAM,iBAAiB,CAC3B,CAAC,SAAS,IAAI,GAAG,IAAI,EACrB,CAAC,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,EACzC,CAAC,SAAS,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAC7D,CAAC,SAAS,QAAQ,GAClB;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC;IAAC,eAAe,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,GAC7F,CAAC,SAAS,QAAQ,GAChB;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;CAAE,GAC1F;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAAC,eAAe,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;CAAE,CAAA;AAE7F,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,iBAAiB,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,YAAY,EAAE,GACrF,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAC3C,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/css-props/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { cssStates, cssStateVariables, type CSSState, type CSSStateValue } from './states.ts';
2
+ export { registerCSSStates } from './registerCSSStates.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/css-states/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { cssStates, cssStateVariables } from "./states.js";
2
+ export { registerCSSStates } from "./registerCSSStates.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/css-states/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAqC,MAAM,aAAa,CAAA;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,23 @@
1
+ import type { PluginAPI } from '../types.ts';
2
+ /**
3
+ * Registers CSS States functionality in the Tailwind plugin.
4
+ *
5
+ * This system abstracts away CSS's native states in order to:
6
+ *
7
+ * - Allow overriding the state of components (e.g. `<Button className="state-active" />`).
8
+ * - Allow reading the state of components from their root element even when the native state is
9
+ * actually on a nested element (e.g. `group-has-checkbox-checked`), thanks to
10
+ * `variants/plugin.ts` overriding some of Tailwind's built-in variants.
11
+ * - Allow setting and reading custom states for DRY purposes (e.g. `active:state-[highlighted]` and
12
+ * `data-[highlighted]:state-[highlighted]` on a parent element and
13
+ * `@state-[highlighted]:bg-strong` on a child; also supports key-values like `state-[foo=bar]
14
+ * lg:state-[foo=baz]`).
15
+ *
16
+ * While this system is separate from the CSS Props one, it also leverages style queries and relies
17
+ * on the fact that component classes (e.g. `gds-button`) establish a container that can be queried.
18
+ * Furthermore, it uses some of the same techniques in the fallback implementation (querying by data
19
+ * attribute, `view-transition-name` to target browsers that don't support style queries, etc.),
20
+ * though the CSS props polyfill is not used. See `useCSSState` for more details.
21
+ */
22
+ export declare function registerCSSStates(api: PluginAPI): void;
23
+ //# sourceMappingURL=registerCSSStates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerCSSStates.d.ts","sourceRoot":"","sources":["../../src/css-states/registerCSSStates.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAG5C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,QA6G/C"}
@@ -0,0 +1,119 @@
1
+ import cssesc from 'cssesc';
2
+ import { objectFromEntries } from 'ts-extras';
3
+ import { cssStates, cssStateVariables, getCSSStateVariable } from "./states.js";
4
+ /**
5
+ * Registers CSS States functionality in the Tailwind plugin.
6
+ *
7
+ * This system abstracts away CSS's native states in order to:
8
+ *
9
+ * - Allow overriding the state of components (e.g. `<Button className="state-active" />`).
10
+ * - Allow reading the state of components from their root element even when the native state is
11
+ * actually on a nested element (e.g. `group-has-checkbox-checked`), thanks to
12
+ * `variants/plugin.ts` overriding some of Tailwind's built-in variants.
13
+ * - Allow setting and reading custom states for DRY purposes (e.g. `active:state-[highlighted]` and
14
+ * `data-[highlighted]:state-[highlighted]` on a parent element and
15
+ * `@state-[highlighted]:bg-strong` on a child; also supports key-values like `state-[foo=bar]
16
+ * lg:state-[foo=baz]`).
17
+ *
18
+ * While this system is separate from the CSS Props one, it also leverages style queries and relies
19
+ * on the fact that component classes (e.g. `gds-button`) establish a container that can be queried.
20
+ * Furthermore, it uses some of the same techniques in the fallback implementation (querying by data
21
+ * attribute, `view-transition-name` to target browsers that don't support style queries, etc.),
22
+ * though the CSS props polyfill is not used. See `useCSSState` for more details.
23
+ */
24
+ export function registerCSSStates(api) {
25
+ /**
26
+ * Register a couple custom properties for each state variable.
27
+ *
28
+ * - All of them are non-inherited to prevent leaking.
29
+ * - Normally, we would only need `--gds-exposed-*` and `--gds-state-*` (with no `initial-value` on
30
+ * `--gds-exposed-*`), but due to a limitation in the `style-observer` library
31
+ * (https://github.com/LeaVerou/style-observer/issues/133), we need to set an `initial-value` on
32
+ * any custom property we want to observe in JS. But we also need `--gds-state-*` to NOT have an
33
+ * initial value so that we can define a fallback when a state is not set at all (see
34
+ * `--gds-clickable-*`). So we register an additional `--gds-observed-*` property that is
35
+ * guaranteed to have a valid value and can be observed.
36
+ */
37
+ for (const [variableName, { values, defaultValue }] of Object.entries(cssStateVariables)) {
38
+ api.addBase({
39
+ [`@property --gds-exposed-${variableName}`]: {
40
+ syntax: "'*'",
41
+ inherits: 'false',
42
+ 'initial-value': '',
43
+ },
44
+ [`@property --gds-state-${variableName}`]: {
45
+ syntax: "'*'",
46
+ inherits: 'false',
47
+ },
48
+ [`@property --gds-observed-${variableName}`]: {
49
+ syntax: `'${[...new Set([...Object.values(values), defaultValue])].map((value) => String(value)).join(' | ')}'`,
50
+ inherits: 'false',
51
+ 'initial-value': String(defaultValue),
52
+ },
53
+ });
54
+ }
55
+ /**
56
+ * Register `expose-{state}` utilities for components to use internally to expose their current
57
+ * state if the root element doesn't already do so (e.g. by being a button with the expected
58
+ * attributes on it), as well as `state-{state}` utilities for consumers to trigger the
59
+ * hover/focus/etc. state of components that support it.
60
+ */
61
+ api.matchUtilities({
62
+ expose: (state) => {
63
+ const stateVariable = getCSSStateVariable(state);
64
+ return {
65
+ [`--gds-exposed-${stateVariable.name}`]: stateVariable.value,
66
+ [`--gds-state-${stateVariable.name}`]: stateVariable.value,
67
+ [`--gds-observed-${stateVariable.name}`]: stateVariable.value,
68
+ };
69
+ },
70
+ state: (state) => {
71
+ const stateVariable = getCSSStateVariable(state);
72
+ return {
73
+ [`--gds-state-${stateVariable.name}`]: stateVariable.value,
74
+ [`--gds-observed-${stateVariable.name}`]: stateVariable.value,
75
+ };
76
+ },
77
+ }, { values: Object.fromEntries(cssStates.map((state) => [state, state])) });
78
+ /** Register `@state-*` and `@state-not-*` variants for components to use internally. */
79
+ for (const variant of ['@state-not', '@state']) {
80
+ api.matchVariant(variant, (state, { modifier }) => {
81
+ const containerName = modifier !== null ? `gds-${modifier}` : '';
82
+ const stateVariables = [getCSSStateVariable(state)];
83
+ // Make sure that `@state-hover` utilities are also applied on the active state
84
+ if (state === 'hover') {
85
+ stateVariables.push(getCSSStateVariable('active'));
86
+ }
87
+ const selectors = [
88
+ `@container ${containerName} ${variant === '@state-not' ? 'not' : ''} (${stateVariables
89
+ .flatMap((stateVariable) => {
90
+ const conditions = [
91
+ `style(--gds-state-${stateVariable.name}${stateVariable.value ? `: ${stateVariable.value}` : ''})`,
92
+ ];
93
+ if (stateVariable.isDefault) {
94
+ conditions.push(`(not style(--gds-state-${stateVariable.name}))`);
95
+ }
96
+ return conditions;
97
+ })
98
+ .join(' or ')})`,
99
+ ];
100
+ if (containerName) {
101
+ // Fallback selector for browsers without style query support; see `css-props/registerCSSProps.ts` for more details
102
+ selectors.push(`@supports (not (view-transition-name: none)) or (-moz-orient: inline) { &:where(.${containerName}${variant === '@state-not' ? ':not' : ':is'}(${stateVariables
103
+ .map((stateVariable) => `[data-gds-state-polyfill-${stateVariable.name}${stateVariable.value ? `=${cssesc(stateVariable.value, { isIdentifier: true })}` : ''}]`)
104
+ .join(', ')}) *) }`);
105
+ }
106
+ return selectors;
107
+ }, {
108
+ values: objectFromEntries(cssStates
109
+ .filter((state) => {
110
+ // Prevent creating `@state-not-not-*` variants
111
+ if (variant === '@state-not' && state.startsWith('not-'))
112
+ return false;
113
+ return true;
114
+ })
115
+ .map((state) => [state, state])),
116
+ });
117
+ }
118
+ }
119
+ //# sourceMappingURL=registerCSSStates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerCSSStates.js","sourceRoot":"","sources":["../../src/css-states/registerCSSStates.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7C,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAE/E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAc;IAC9C;;;;;;;;;;;OAWG;IACH,KAAK,MAAM,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,OAAO,CAAC;YACV,CAAC,2BAA2B,YAAY,EAAE,CAAC,EAAE;gBAC3C,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,OAAO;gBACjB,eAAe,EAAE,EAAE;aACpB;YACD,CAAC,yBAAyB,YAAY,EAAE,CAAC,EAAE;gBACzC,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,OAAO;aAClB;YACD,CAAC,4BAA4B,YAAY,EAAE,CAAC,EAAE;gBAC5C,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAsB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;gBACpI,QAAQ,EAAE,OAAO;gBACjB,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC;aACtC;SACF,CAAC,CAAA;IACJ,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,cAAc,CAChB;QACE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChB,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;YAChD,OAAO;gBACL,CAAC,iBAAiB,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK;gBAC5D,CAAC,eAAe,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK;gBAC1D,CAAC,kBAAkB,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK;aAC9D,CAAA;QACH,CAAC;QACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACf,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;YAChD,OAAO;gBACL,CAAC,eAAe,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK;gBAC1D,CAAC,kBAAkB,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK;aAC9D,CAAA;QACH,CAAC;KACF,EACD,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CACzE,CAAA;IAED,wFAAwF;IACxF,KAAK,MAAM,OAAO,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAU,EAAE,CAAC;QACxD,GAAG,CAAC,YAAY,CACd,OAAO,EACP,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACtB,MAAM,aAAa,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YAChE,MAAM,cAAc,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAA;YACnD,+EAA+E;YAC/E,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAA;YACpD,CAAC;YACD,MAAM,SAAS,GAAG;gBAChB,cAAc,aAAa,IAAI,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc;qBACpF,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;oBACzB,MAAM,UAAU,GAAG;wBACjB,qBAAqB,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;qBACnG,CAAA;oBACD,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;wBAC5B,UAAU,CAAC,IAAI,CAAC,0BAA0B,aAAa,CAAC,IAAI,IAAI,CAAC,CAAA;oBACnE,CAAC;oBACD,OAAO,UAAU,CAAA;gBACnB,CAAC,CAAC;qBACD,IAAI,CAAC,MAAM,CAAC,GAAG;aACnB,CAAA;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,mHAAmH;gBACnH,SAAS,CAAC,IAAI,CACZ,oFAAoF,aAAa,GAAG,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,cAAc;qBAC5J,GAAG,CACF,CAAC,aAAa,EAAE,EAAE,CAChB,4BAA4B,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAC3I;qBACA,IAAI,CAAC,IAAI,CAAC,QAAQ,CACtB,CAAA;YACH,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC,EACD;YACE,MAAM,EAAE,iBAAiB,CACvB,SAAS;iBACN,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChB,+CAA+C;gBAC/C,IAAI,OAAO,KAAK,YAAY,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACtE,OAAO,IAAI,CAAA;YACb,CAAC,CAAC;iBACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAClC;SACF,CACF,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,71 @@
1
+ export declare const cssStates: readonly ["open", "not-open", "current", "not-current", "checked", "indeterminate", "unchecked", "read-only", "blank", "not-blank", "idle", "hover", "focus", "not-focus", "active", "enabled", "disabled"];
2
+ export type CSSState = (typeof cssStates)[number];
3
+ export type CSSStateValue = string | boolean;
4
+ export declare const cssStateVariables: {
5
+ pointer: {
6
+ values: {
7
+ idle: "idle";
8
+ hover: "hover";
9
+ active: "active";
10
+ } & Record<"idle" | "hover" | "active", "idle" | "hover" | "active">;
11
+ defaultValue: "idle" | "hover" | "active";
12
+ };
13
+ focus: {
14
+ values: {
15
+ focus: true;
16
+ 'not-focus': false;
17
+ } & Record<"focus" | "not-focus", boolean>;
18
+ defaultValue: boolean;
19
+ };
20
+ checked: {
21
+ values: {
22
+ checked: true;
23
+ indeterminate: "indeterminate";
24
+ unchecked: false;
25
+ } & Record<"checked" | "indeterminate" | "unchecked", boolean | "indeterminate">;
26
+ defaultValue: boolean | "indeterminate";
27
+ };
28
+ disabled: {
29
+ values: {
30
+ enabled: false;
31
+ disabled: true;
32
+ 'read-only': "read-only";
33
+ } & Record<"read-only" | "enabled" | "disabled", boolean | "read-only">;
34
+ defaultValue: boolean | "read-only";
35
+ };
36
+ open: {
37
+ values: {
38
+ open: true;
39
+ 'not-open': false;
40
+ } & Record<"open" | "not-open", boolean>;
41
+ defaultValue: boolean;
42
+ };
43
+ current: {
44
+ values: {
45
+ current: true;
46
+ 'not-current': false;
47
+ } & Record<"current" | "not-current", boolean>;
48
+ defaultValue: boolean;
49
+ };
50
+ blank: {
51
+ values: {
52
+ blank: true;
53
+ 'not-blank': false;
54
+ } & Record<"blank" | "not-blank", boolean>;
55
+ defaultValue: boolean;
56
+ };
57
+ };
58
+ export declare function getCSSStateVariable(state: string): {
59
+ name: string;
60
+ value: string;
61
+ isDefault: boolean;
62
+ };
63
+ export declare function getPointerStateSelector(state: 'idle' | 'hover' | 'active'): string;
64
+ export declare function getFocusStateSelector(visible: boolean, within: boolean): string;
65
+ export declare function getCheckedStateSelector(checked: boolean | 'indeterminate'): string;
66
+ export declare function getDisabledStateSelector(disabled: boolean | 'read-only'): string;
67
+ export declare function getOpenStateSelector(open: boolean): string;
68
+ export declare function getCurrentStateSelector(current: boolean): string;
69
+ export declare function getBlankStateSelector(blank: boolean): string;
70
+ export declare const cssStateSelectors: Record<CSSState, string>;
71
+ //# sourceMappingURL=states.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../src/css-states/states.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,6MAkBZ,CAAA;AAEV,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AACjD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAA;AAU5C,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqD7B,CAAA;AAQD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM;;;;EAgBhD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,UAEzE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,UAEtE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,UAEzE;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,WAAW,UAEvE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,UAEjD;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,UAEvD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,UAGnD;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAkBtD,CAAA"}