@charcoal-ui/tailwind-config 5.11.0-beta.1 → 5.11.0-beta.3

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.
package/README.md CHANGED
@@ -176,3 +176,5 @@ https://tailwindcss.com/
176
176
  `@charcoal-ui/tailwind-config` が独自に定義しているクラスについては Storybook を見てください。
177
177
 
178
178
  https://pixiv.github.io/charcoal/?path=/docs/tailwind-config-colors-doc--docs
179
+
180
+ たとえば、標準 plugin には `.ch-focus-ring` も含まれており、フォーカス可能な要素に付けると React 版と同等の focus ring を適用できます。
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/tokenV2.ts","../src/index.ts"],"mappings":";;;;KAGY,eAAA;AAAA,UAEK,QAAA;EACf,OAAA,EAAS,aAAA;EAAA,oCAC2B,aAAA;EAAA,oBAChB,aAAA;AAAA;;;iBCAN,oCAAA,CAAA,GAAwC,IAAA,CACtD,MAAA;;;UCkBQ,OAAA;EACR,OAAA,GAAU,eAAA;EACV,KAAA,GAAQ,QAAA;EACR,cAAA;EACA,eAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,iBAGc,oBAAA,CAAA;EACd,KAAA;EACA,OAAA;EACA,cAAA;EACA,eAAA;EACA,OAAA;EACA;AAAA,GACC,OAAA,GAAU,IAAA,CAAK,MAAA;AAAA,cAqIL,MAAA,EAAQ,IAAA,CAAK,MAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/tokenV2.ts","../src/index.ts"],"mappings":";;;;KAGY,eAAA;AAAA,UAEK,QAAA;EACf,OAAA,EAAS,aAAA;EAAA,oCAC2B,aAAA;EAAA,oBAChB,aAAA;AAAA;;;iBCAN,oCAAA,CAAA,GAAwC,IAAA,CACtD,MAAA;;;UCmBQ,OAAA;EACR,OAAA,GAAU,eAAA;EACV,KAAA,GAAQ,QAAA;EACR,cAAA;EACA,eAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,iBAGc,oBAAA,CAAA;EACd,KAAA;EACA,OAAA;EACA,cAAA;EACA,eAAA;EACA,OAAA;EACA;AAAA,GACC,OAAA,GAAU,IAAA,CAAK,MAAA;AAAA,cAsIL,MAAA,EAAQ,IAAA,CAAK,MAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/tokenV2.ts","../src/index.ts"],"mappings":";;;;KAGY,eAAA;AAAA,UAEK,QAAA;EACf,OAAA,EAAS,aAAA;EAAA,oCAC2B,aAAA;EAAA,oBAChB,aAAA;AAAA;;;iBCAN,oCAAA,CAAA,GAAwC,IAAA,CACtD,MAAA;;;UCkBQ,OAAA;EACR,OAAA,GAAU,eAAA;EACV,KAAA,GAAQ,QAAA;EACR,cAAA;EACA,eAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,iBAGc,oBAAA,CAAA;EACd,KAAA;EACA,OAAA;EACA,cAAA;EACA,eAAA;EACA,OAAA;EACA;AAAA,GACC,OAAA,GAAU,IAAA,CAAK,MAAA;AAAA,cAqIL,MAAA,EAAQ,IAAA,CAAK,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/tokenV2.ts","../src/index.ts"],"mappings":";;;;KAGY,eAAA;AAAA,UAEK,QAAA;EACf,OAAA,EAAS,aAAA;EAAA,oCAC2B,aAAA;EAAA,oBAChB,aAAA;AAAA;;;iBCAN,oCAAA,CAAA,GAAwC,IAAA,CACtD,MAAA;;;UCmBQ,OAAA;EACR,OAAA,GAAU,eAAA;EACV,KAAA,GAAQ,QAAA;EACR,cAAA;EACA,eAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,iBAGc,oBAAA,CAAA;EACd,KAAA;EACA,OAAA;EACA,cAAA;EACA,eAAA;EACA,OAAA;EACA;AAAA,GACC,OAAA,GAAU,IAAA,CAAK,MAAA;AAAA,cAsIL,MAAA,EAAQ,IAAA,CAAK,MAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,7 @@
1
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
2
5
  //#region \0rolldown/runtime.js
3
6
  var __create = Object.create;
4
7
  var __defProp = Object.defineProperty;
@@ -7,16 +10,12 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
7
10
  var __getProtoOf = Object.getPrototypeOf;
8
11
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
12
  var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
12
- key = keys[i];
13
- if (!__hasOwnProp.call(to, key) && key !== except) {
14
- __defProp(to, key, {
15
- get: ((k) => from[k]).bind(null, key),
16
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
- });
18
- }
19
- }
13
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
14
+ key = keys[i];
15
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: ((k) => from[k]).bind(null, key),
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
20
19
  }
21
20
  return to;
22
21
  };
@@ -24,7 +23,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
23
  value: mod,
25
24
  enumerable: true
26
25
  }) : target, mod));
27
-
28
26
  //#endregion
29
27
  let _charcoal_ui_foundation = require("@charcoal-ui/foundation");
30
28
  let _charcoal_ui_theme = require("@charcoal-ui/theme");
@@ -37,9 +35,7 @@ let _charcoal_ui_icon_files_v2_datauri = require("@charcoal-ui/icon-files/v2/dat
37
35
  _charcoal_ui_icon_files_v2_datauri = __toESM(_charcoal_ui_icon_files_v2_datauri);
38
36
  let _charcoal_ui_icon_files_v1_datauri = require("@charcoal-ui/icon-files/v1/datauri");
39
37
  _charcoal_ui_icon_files_v1_datauri = __toESM(_charcoal_ui_icon_files_v1_datauri);
40
-
41
38
  //#region src/foundation.ts
42
- const GRID_COUNT = 12;
43
39
  function mergeEffect({ elementEffect, effect }) {
44
40
  return {
45
41
  ...elementEffect,
@@ -50,7 +46,6 @@ function mergeEffect({ elementEffect, effect }) {
50
46
  }
51
47
  };
52
48
  }
53
-
54
49
  //#endregion
55
50
  //#region src/util.ts
56
51
  /**
@@ -124,14 +119,12 @@ const flattenKeyWithoutDefault = (o, join) => {
124
119
  });
125
120
  }));
126
121
  };
127
-
128
122
  //#endregion
129
123
  //#region src/colors/utils.ts
130
124
  const COLOR_PREFIX = "--tailwind-color-";
131
125
  function isSingleColor(color) {
132
126
  return typeof color === "string";
133
127
  }
134
-
135
128
  //#endregion
136
129
  //#region src/colors/toTailwindConfig.ts
137
130
  function colorsToTailwindConfig(version, colors, effects) {
@@ -158,7 +151,6 @@ function colorsToTailwindConfig(version, colors, effects) {
158
151
  }
159
152
  return (0, _charcoal_ui_utils.mapObject)(targetColors, (name, color) => [name, colorsForAllEffects(name, color)]);
160
153
  }
161
-
162
154
  //#endregion
163
155
  //#region src/colors/pluginTokenV1.ts
164
156
  function defineCssVariablesV1(themeMap) {
@@ -208,7 +200,6 @@ function defineThemeVariables(colorParams, effectParams) {
208
200
  function withPrefixes(...parts) {
209
201
  return parts.join("-");
210
202
  }
211
-
212
203
  //#endregion
213
204
  //#region src/colors/plugin.ts
214
205
  /**
@@ -238,7 +229,16 @@ function toCssVariables(theme) {
238
229
  return [[varName, color], ...effects.map(([type, effect]) => [`${varName}--${type}`, (0, _charcoal_ui_utils.applyEffect)(color, effect)])];
239
230
  });
240
231
  }
241
-
232
+ //#endregion
233
+ //#region src/focusring/index.ts
234
+ const createFocusRingUtilities = () => ({ ".ch-focus-ring": { "&:not(:disabled):not([aria-disabled]):focus-visible, &[aria-disabled='false']:focus-visible": {
235
+ outline: "none",
236
+ boxShadow: "0 0 0 4px var(--charcoal-color-border-focus-legacy, rgba(0, 150, 250, 0.32))",
237
+ transition: "0.2s box-shadow"
238
+ } } });
239
+ const charcoalFocusRing = (0, tailwindcss_plugin_js.default)(({ addUtilities }) => {
240
+ addUtilities(createFocusRingUtilities());
241
+ });
242
242
  //#endregion
243
243
  //#region src/gradient/plugin.ts
244
244
  const VAR_PREFIX = "--tailwind-gradient-";
@@ -277,7 +277,6 @@ function createUtilityName(gradientName, direction, suffix = "") {
277
277
  suffix
278
278
  ].filter(Boolean).join("-");
279
279
  }
280
-
281
280
  //#endregion
282
281
  //#region src/typography/plugin.ts
283
282
  const leadingCancel = {
@@ -291,6 +290,11 @@ const typographyStyle = (style) => {
291
290
  return {
292
291
  "font-size": (0, _charcoal_ui_utils.px)(style.fontSize),
293
292
  "line-height": (0, _charcoal_ui_utils.px)(style.lineHeight),
293
+ /**
294
+ * cancel leading
295
+ *
296
+ * @see https://yuyakinoshita.com/blog/2020/01/20/line-height-crop/
297
+ */
294
298
  "&::before": {
295
299
  ...leadingCancel,
296
300
  marginTop: (0, _charcoal_ui_utils.px)(margin)
@@ -310,7 +314,6 @@ const typographyPlugin = (0, tailwindcss_plugin_js.default)(({ addUtilities }) =
310
314
  }
311
315
  }, { variants: ["responsive"] });
312
316
  });
313
-
314
317
  //#endregion
315
318
  //#region src/tokenV2.ts
316
319
  function unstable_createTailwindConfigTokenV2() {
@@ -337,7 +340,6 @@ function unstable_createTailwindConfigTokenV2() {
337
340
  }
338
341
  };
339
342
  }
340
-
341
343
  //#endregion
342
344
  //#region src/icons.ts
343
345
  const transformClassNameV2 = (fileName) => {
@@ -380,7 +382,6 @@ const charcoalIconsV2 = (0, tailwindcss_plugin_js.default)(({ addUtilities }) =>
380
382
  const charcoalIconsV1 = (0, tailwindcss_plugin_js.default)(({ addUtilities }) => {
381
383
  addUtilities(createIconUtilities({ v2: false }));
382
384
  });
383
-
384
385
  //#endregion
385
386
  //#region src/index.ts
386
387
  function createTailwindConfig({ theme = { ":root": _charcoal_ui_theme.light }, version = "v3", cssVariablesV1 = true, unstableTokenV2 = false, iconsV2 = false, iconsV1 = false }) {
@@ -419,13 +420,19 @@ function createTailwindConfig({ theme = { ":root": _charcoal_ui_theme.light }, v
419
420
  screen: "100vw",
420
421
  auto: "auto",
421
422
  fit: "fit-content",
422
- ...Array.from({ length: GRID_COUNT }, (_, i) => i + 1).reduce((styles, i) => ({
423
+ /**
424
+ * generates classes like "w-col-span-1"
425
+ */
426
+ ...Array.from({ length: 12 }, (_, i) => i + 1).reduce((styles, i) => ({
423
427
  ...styles,
424
428
  [`col-span-${i}`]: (0, _charcoal_ui_utils.px)(_charcoal_ui_foundation.COLUMN_UNIT * i + _charcoal_ui_foundation.GUTTER_UNIT * (i - 1))
425
429
  }), {}),
426
- ...Array.from({ length: GRID_COUNT - 1 }, (_, i) => i + 1).reduce((styles, i) => ({
430
+ /**
431
+ * generates classes like "w-1/12" (except for 12/12, which just equals to w-full)
432
+ */
433
+ ...Array.from({ length: 11 }, (_, i) => i + 1).reduce((styles, i) => ({
427
434
  ...styles,
428
- [`${i}/${GRID_COUNT}`]: `${i / GRID_COUNT * 100}%`
435
+ [`${i}/12`]: `${i / 12 * 100}%`
429
436
  }), {}),
430
437
  ...widthV2
431
438
  },
@@ -448,6 +455,7 @@ function createTailwindConfig({ theme = { ":root": _charcoal_ui_theme.light }, v
448
455
  corePlugins: { lineHeight: false },
449
456
  plugins: [
450
457
  typographyPlugin,
458
+ charcoalFocusRing,
451
459
  cssVariableColorPlugin$1(theme, Boolean(cssVariablesV1)),
452
460
  ...Object.entries(theme).map(([selectorOrMediaQuery, theme]) => cssVariableColorPlugin(theme.gradientColor, mergeEffect(theme), selectorOrMediaQuery)),
453
461
  ...iconsV2 ? [charcoalIconsV2] : [],
@@ -456,10 +464,10 @@ function createTailwindConfig({ theme = { ":root": _charcoal_ui_theme.light }, v
456
464
  };
457
465
  }
458
466
  const config = createTailwindConfig({});
459
-
460
467
  //#endregion
461
468
  exports.config = config;
462
469
  exports.default = config;
463
470
  exports.createTailwindConfig = createTailwindConfig;
464
471
  exports.unstable_createTailwindConfigTokenV2 = unstable_createTailwindConfigTokenV2;
472
+
465
473
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["cssVariableColorPlugin","TYPOGRAPHY_SIZE","light","flattenKeys","mapDefaultKeys","iconsV2","iconsV1","light","SPACING","COLUMN_UNIT","GUTTER_UNIT","BORDER_RADIUS","cssVariableColorPlugin","cssVariableGradientPlugin"],"sources":["../src/foundation.ts","../src/util.ts","../src/colors/utils.ts","../src/colors/toTailwindConfig.ts","../src/colors/pluginTokenV1.ts","../src/colors/plugin.ts","../src/gradient/plugin.ts","../src/typography/plugin.ts","../src/tokenV2.ts","../src/icons.ts","../src/index.ts"],"sourcesContent":["import { Effect } from '@charcoal-ui/foundation'\nimport { CharcoalTheme as Theme } from '@charcoal-ui/theme'\n\nexport const GRID_COUNT = 12\n\nexport function mergeEffect({\n elementEffect,\n effect,\n}: Pick<Theme, 'elementEffect' | 'effect'>): MergedEffect {\n return {\n ...elementEffect,\n ...effect,\n outline: {\n type: 'opacity',\n opacity: 0.32,\n } as Effect,\n }\n}\n\nexport type MergedEffect = Record<string, Effect>\n","import type { Config } from 'tailwindcss'\nimport { TailwindVersion, ThemeMap } from './types'\n\n/**\n * the key \"default\" or \"DEFAULT\" has special meaning and dropped from class name\n *\n * @see https://tailwindcss.com/docs/upgrading-to-v2#update-default-theme-keys-to-default\n */\nexport function getDefaultKeyName(version: TailwindVersion) {\n switch (version) {\n case 'v3':\n case 'v2': {\n return 'DEFAULT'\n }\n\n case 'v1': {\n return 'default'\n }\n }\n}\n\nexport function getVariantOption(version: TailwindVersion): Partial<Config> {\n switch (version) {\n case 'v3': {\n // v3 以上では variants は variantOrders に改名された\n // そしてこれは上書きをしたいモチベがない\n // https://v2.tailwindcss.com/docs/configuration#variant-order\n return {}\n }\n\n case 'v2':\n case 'v1': {\n return { variants: {} }\n }\n }\n}\n\nfunction setEquals<T>(a: Set<T>, b: Set<T>) {\n return a.size === b.size && Array.from(a).every((value) => b.has(value))\n}\n\nexport function assertAllThemeHaveSameKeys(themeMap: ThemeMap): void {\n const defaultTheme = themeMap[':root']\n const expectedColorKeys = new Set(Object.keys(defaultTheme.color))\n const expectedEffectKeys = new Set(Object.keys(defaultTheme.effect))\n\n for (const [name, theme] of Object.entries(themeMap)) {\n const colorKeys = new Set(Object.keys(theme.color))\n const effectKeys = new Set(Object.keys(theme.effect))\n\n if (!setEquals(colorKeys, expectedColorKeys)) {\n throw new Error(`:root and ${name} does not have same colors.\n\nExpected( :root ): ${JSON.stringify(Array.from(expectedColorKeys))}\nGot: ${JSON.stringify(Array.from(colorKeys))}`)\n }\n\n if (!setEquals(effectKeys, expectedEffectKeys)) {\n throw new Error(`:root and ${name} does not have same effects.\n\nExpected( :root ): ${JSON.stringify(Array.from(expectedEffectKeys))}\nGot: ${JSON.stringify(Array.from(effectKeys))}`)\n }\n }\n}\n\nexport function camelToKebab(value: string) {\n return value\n .replace(/(?<small>[\\da-z]|(?=[A-Z]))(?<capital>[A-Z])/gu, '$1-$2')\n .toLowerCase()\n}\n\nexport const mapDefaultKey = <O extends object>(o: O) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(o), function reviver(k: string, v: string) {\n if (k === 'default') {\n const DefaultKey = getDefaultKeyName('v3')\n this[DefaultKey] = v\n return undefined\n }\n return v\n })\n}\n\nexport const flattenKey = <O extends object>(\n o: O,\n join?: (key: string) => boolean,\n): Record<string, unknown> => {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n Object.entries(o).flatMap(([key, v]) => {\n if (typeof v === 'string') return [[key, v]]\n return Object.entries(v as object).map(([kk, vv]) => {\n return [(join?.(key) ?? true) ? [key, kk].join('-') : kk, vv]\n })\n }),\n )\n}\n\n/**\n * `DEFAULT` はkey名に結合しない\n */\nexport const flattenKeyWithoutDefault = <O extends object>(\n o: O,\n join?: (key: string) => boolean,\n): Record<string, unknown> => {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n Object.entries(o).flatMap(([key, v]) => {\n if (typeof v === 'string') return [[key, v]]\n return Object.entries(v as object).map(([kk, vv]) => {\n const isDefaultKey = kk === 'DEFAULT' || kk === 'default'\n const outputKey = isDefaultKey\n ? key\n : (join?.(key) ?? true)\n ? [key, kk].join('-')\n : kk\n return [outputKey, vv]\n })\n }),\n )\n}\n","import { GradientMaterial, Material } from '@charcoal-ui/foundation'\n\nexport const COLOR_PREFIX = '--tailwind-color-'\n\nexport function isSingleColor(color: AnyColor): color is Material {\n return typeof color === 'string'\n}\n\ntype AnyColor = Material | GradientMaterial\n\nexport type AnyColorTheme = Record<string, AnyColor>\n","import { Material } from '@charcoal-ui/foundation'\nimport { applyEffect, filterObject, mapObject } from '@charcoal-ui/utils'\nimport type { Config } from 'tailwindcss'\nimport { MergedEffect } from '../foundation'\n\nimport { TailwindVersion } from '../types'\nimport { getDefaultKeyName } from '../util'\n\nimport { AnyColorTheme, COLOR_PREFIX, isSingleColor } from './utils'\n\nexport function colorsToTailwindConfig(\n version: TailwindVersion,\n colors: AnyColorTheme,\n effects: MergedEffect,\n): NonNullable<Config['theme']>['colors'] {\n const targetColors = filterObject(colors, isSingleColor)\n const DEFAULT = getDefaultKeyName(version)\n\n /**\n * こういう感じのを吐き出す\n *\n * ```js\n * {\n * DEFAULT: 'var(--tailwind-color-hoge1, #fff)',\n * hover: 'var(--tailwind-color-hoge1--hover, #eee)',\n * press: 'var(--tailwind-color-hoge1--press, #ddd)',\n * disabled: 'var(--tailwind-color-hoge1--disabled, #eee)',\n * }\n * ```\n */\n function colorsForAllEffects(name: string, color: Material) {\n const varName = `${COLOR_PREFIX}${name}`\n\n return {\n [DEFAULT]: `var(${varName}, ${color})`,\n\n ...mapObject(effects, (effectName, effect) => [\n effectName,\n `var(${varName}--${effectName}, ${applyEffect(color, effect)})`,\n ]),\n }\n }\n\n return mapObject(targetColors, (name, color) => [\n name,\n colorsForAllEffects(name, color),\n ])\n}\n","import {\n applyEffect,\n customPropertyToken,\n filterObject,\n flatMapObject,\n mapObject,\n} from '@charcoal-ui/utils'\nimport { ThemeMap } from '../types'\nimport {\n CharcoalAbstractTheme,\n EffectType,\n Key,\n CharcoalTheme as Theme,\n} from '@charcoal-ui/theme'\n\nexport function defineCssVariablesV1(themeMap: ThemeMap) {\n // @ts-expect-error FIXME\n return mapObject(themeMap, (key, theme) => {\n if (key.startsWith('@media')) {\n return [\n key,\n {\n ':root': defineColorVariableCSS(theme),\n },\n ]\n } else {\n return [key, defineColorVariableCSS(theme)]\n }\n })\n}\n\nexport const defineColorVariableCSS = (theme: Theme) => {\n const borders = mapObject(theme.border, (name, { color }) => [\n // REVIEW: もしtheme.colorにたまたまborder-〇〇で始まる色名がいたら被りうる\n withPrefixes('border', name),\n color,\n ])\n\n const colors = defineThemeVariables({ ...theme.color, ...borders })({ theme })\n return colors\n}\n\n/**\n * Check whether a value is non-null and non-undefined\n *\n * @param value nullable\n */\nexport const isPresent = <T>(value: T): value is NonNullable<T> => value != null\n\n/**\n * 子孫要素で使われるカラーテーマの CSS Variables を上書きする\n *\n * @params colorParams - 上書きしたい色の定義( `theme.color` の一部だけ書けば良い )\n * @params effectParams - effect の定義を上書きしたい場合は渡す(必須ではない)\n *\n * @example\n * ```tsx\n * const LocalTheme = styled.div`\n * ${defineThemeVariables({ text1: '#ff0000' })}\n * // `text1` is now defined as red\n * ${theme((o) => [o.font.text1])}\n * `\n * ```\n */\nexport function defineThemeVariables(\n colorParams: Partial<CharcoalAbstractTheme['color']>,\n effectParams?: Partial<CharcoalAbstractTheme['effect']>,\n) {\n return function toCssObject(props: {\n theme: Pick<CharcoalAbstractTheme, 'effect'>\n }) {\n const colors = filterObject(colorParams, isPresent)\n\n // flatMapObject の中で毎回 Object.entries を呼ぶのは無駄なので外で呼ぶ\n const effects = Object.entries({\n ...props.theme.effect,\n ...effectParams,\n })\n\n return flatMapObject(colors, (colorKey, color) => [\n [customPropertyToken(colorKey), color],\n\n ...effects.map<[string, string]>(([effectKey, effect]) => [\n customPropertyToken(colorKey, [effectKey]),\n applyEffect(color, [effect]),\n ]),\n ])\n }\n}\n\nexport function isSupportedEffect(effect: Key): effect is EffectType {\n return ['hover', 'press', 'disabled'].includes(effect as string)\n}\n\nexport const variable = (value: string) => `var(${value})`\n\nexport function withPrefixes(...parts: string[]) {\n return parts.join('-')\n}\n","import { Material } from '@charcoal-ui/foundation'\nimport { CharcoalTheme as Theme } from '@charcoal-ui/theme'\nimport {\n applyEffect,\n filterObject,\n flatMapObject,\n mapObject,\n} from '@charcoal-ui/utils'\nimport plugin from 'tailwindcss/plugin.js'\nimport { mergeEffect } from '../foundation'\nimport { CSSVariableName, CSSVariables, Definition, ThemeMap } from '../types'\nimport { COLOR_PREFIX, isSingleColor } from './utils'\nimport { defineCssVariablesV1 } from './pluginTokenV1'\n\n/**\n * --tailwind-* また --charcoal-* を生成する\n * TODO: --tailwindをやめる\n */\nexport default function cssVariableColorPlugin(\n themeMap: ThemeMap,\n cssVariablesV1: boolean,\n): ReturnType<typeof plugin> {\n // `:root` 以外のケースで各 CSS Variable がどういう値を取るかを定義する\n const { ':root': _defaultTheme, ...otherThemes } = themeMap\n const definitions = defineCssVariables(otherThemes)\n\n return plugin(({ addBase }) => {\n addBase(definitions)\n\n // styledのTokenInjector移植(background処理除く)\n if (cssVariablesV1) {\n const cssVariablesV1 = defineCssVariablesV1(themeMap)\n // @ts-expect-error FIXME\n addBase(cssVariablesV1)\n }\n })\n}\n\nexport function defineCssVariables(themes: Omit<ThemeMap, ':root'>) {\n return mapObject(themes, (selectorOrMediaQuery, theme) => {\n const css = toCssVariables(theme)\n\n if (selectorOrMediaQuery.startsWith('@media')) {\n return [\n selectorOrMediaQuery,\n {\n ':root': css,\n },\n ]\n } else {\n return [selectorOrMediaQuery, css]\n }\n }) as Definition\n}\n\nfunction toCssVariables(theme: Theme): CSSVariables {\n const colors = filterObject(theme.color, isSingleColor)\n const effects = Object.entries(mergeEffect(theme))\n\n return flatMapObject(colors, (name, color) => {\n const varName: keyof CSSVariables = `${COLOR_PREFIX}${name}`\n\n return [\n [varName, color],\n\n ...effects.map<[CSSVariableName, Material]>(([type, effect]) => [\n `${varName}--${type}`,\n applyEffect(color, effect),\n ]),\n ]\n })\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport { camelToKebab } from '../util'\nimport { GradientMaterial } from '@charcoal-ui/foundation'\nimport { ThemeColorGradient } from '@charcoal-ui/theme'\nimport {\n applyEffectToGradient,\n flatMapObject,\n gradient,\n GradientDirection,\n mapKeys,\n mapObject,\n} from '@charcoal-ui/utils'\nimport { Values } from '../types'\nimport { MergedEffect } from '../foundation'\n\nconst VAR_PREFIX = '--tailwind-gradient-'\n\nexport default function cssVariableColorPlugin(\n gradients: ThemeColorGradient,\n effects: MergedEffect,\n selectorOrMediaQuery: string,\n) {\n const utilities = getUtilities(gradients, effects)\n\n const classRules = mapObject(utilities, (name) => [\n `.bg-${name}`,\n { backgroundImage: `var(${VAR_PREFIX}${name})` },\n ])\n\n return plugin(({ addBase, addUtilities }) => {\n const css = mapKeys(utilities, (name) => `${VAR_PREFIX}${name}`)\n if (selectorOrMediaQuery.startsWith('@media')) {\n addBase({\n [selectorOrMediaQuery]: {\n ':root': css,\n },\n })\n } else {\n addBase({\n [selectorOrMediaQuery]: css,\n })\n }\n\n addUtilities(classRules, {\n // @ts-expect-error FIXME\n variants: ['responsive'],\n })\n })\n}\n\nconst DIRECTIONS = {\n 'to top': 'top',\n 'to bottom': 'bottom',\n 'to left': 'left',\n 'to right': 'right',\n} as const\n\n/**\n * こういう感じのやつ。この時点では `--tailwind-gradient-` のような CSS 変数名になってない\n *\n * ```js\n * {\n * 'hoge1': 'linear-gradient(to top, ...)',\n * ...\n * }\n * ```\n */\ntype Utilities = Record<string, LinearGradient>\n\ntype LinearGradient = `linear-gradient(${string})`\n\nexport function getUtilities(\n gradients: Record<string, GradientMaterial>,\n effect: MergedEffect,\n): Utilities {\n const effects = Object.entries(effect)\n const directions = Object.entries(DIRECTIONS) as [\n GradientDirection,\n Values<typeof DIRECTIONS>,\n ][]\n\n return flatMapObject(gradients, (name, colors) =>\n directions.flatMap(([direction, className]) => {\n const toLinearGradient = (colors: GradientMaterial) => {\n const style = gradient(direction)(colors)\n\n if (!('backgroundImage' in style)) {\n throw new Error(\n `Could not generate linear-gradient() from ${name} ${direction} ${className}`,\n )\n }\n\n // 本当は backgroundColor も同時に生成されるんだけど、使うにはそれ用の CSS 変数も一緒に作らないといけない\n // とりあえず background-image だけで動くのでこっちだけを利用する\n return style.backgroundImage as LinearGradient\n }\n\n return [\n // こういう感じのやつ\n // { 'hoge1': 'linear-gradient(to top, ...)' }\n [createUtilityName(name, className), toLinearGradient(colors)],\n\n // こういう感じのやつ\n // { 'hoge1--hover': 'linear-gradient(to top, ...)' }\n ...effects.map<[string, LinearGradient]>(([effectName, effect]) => [\n createUtilityName(name, className, effectName),\n toLinearGradient(applyEffectToGradient(effect)(colors)),\n ]),\n ]\n }),\n )\n}\n\nfunction createUtilityName(\n gradientName: string,\n direction: Values<typeof DIRECTIONS>,\n suffix = '',\n) {\n return [camelToKebab(gradientName), direction, suffix]\n .filter(Boolean)\n .join('-')\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport { TypographyDescriptor, TYPOGRAPHY_SIZE } from '@charcoal-ui/foundation'\nimport { halfLeading, mapObject, px } from '@charcoal-ui/utils'\n\nconst leadingCancel = {\n display: 'block',\n width: 0,\n height: 0,\n content: '\"\"',\n}\n\nconst typographyStyle = (style: TypographyDescriptor) => {\n const margin = -halfLeading(style)\n\n return {\n 'font-size': px(style.fontSize),\n 'line-height': px(style.lineHeight),\n\n /**\n * cancel leading\n *\n * @see https://yuyakinoshita.com/blog/2020/01/20/line-height-crop/\n */\n '&::before': {\n ...leadingCancel,\n marginTop: px(margin),\n },\n '&::after': {\n ...leadingCancel,\n marginBottom: px(margin),\n },\n }\n}\n\nconst typographyPlugin = plugin(({ addUtilities }) => {\n const typographyClasses = mapObject(TYPOGRAPHY_SIZE, (fontSize, style) => [\n `.typography-${fontSize}`,\n typographyStyle(style),\n ])\n\n addUtilities(\n {\n ...typographyClasses,\n '.preserve-half-leading': {\n '&::before': {\n content: 'none',\n },\n '&::after': {\n content: 'none',\n },\n },\n },\n {\n // @ts-expect-error FIXME\n variants: ['responsive'],\n },\n )\n})\n\nexport default typographyPlugin\n","import light from '@charcoal-ui/theme/unstable-tokens/css-variables.json' with { type: 'json' }\nimport type { Config } from 'tailwindcss'\nimport {\n flattenKey as flattenKeys,\n flattenKeyWithoutDefault,\n mapDefaultKey as mapDefaultKeys,\n} from './util'\n\nexport function unstable_createTailwindConfigTokenV2(): Omit<\n Config,\n 'content'\n> {\n const fontSize = Object.fromEntries(\n Object.entries(light.text['font-size']).flatMap(([k, v]) => {\n // text.fontSize.paragraph + text.lineHeight.paragraph -> text-paragraph\n if (typeof v === 'string') {\n return [\n [\n k,\n [\n v,\n // @ts-expect-error k is keyof line-height\n { lineHeight: light.text['line-height'][k] },\n ],\n ],\n ]\n }\n\n // text.fontSize.heading.s + text.lineHeight.heading.s -> text-heading-s\n return Object.entries(v as Record<string, string>).map(([kk, vv]) => {\n return [\n [k, kk].join('-'),\n [\n vv,\n // @ts-expect-error k is keyof line-height\n { lineHeight: light.text['line-height'][k][kk] },\n ],\n ]\n })\n }),\n ) as NonNullable<Config['theme']>['fontSize']\n\n // space.target.s -> p-target-s\n // space.gap.gapButtons -> p-gap-buttons\n const spacing = flattenKeys(light.space, (key) => !/(gap|padding)/.test(key))\n // color.container.default -> bg-container\n // color.container.hover -> bg-container-hover\n const colors = mapDefaultKeys(light.color)\n\n const config: Omit<Config, 'content'> = {\n darkMode: 'media',\n theme: {\n // borderWidth.m -> border-m\n // borderWidth.focus.1 -> border-focus-1\n borderWidth: flattenKeyWithoutDefault({\n 'width-ch': flattenKeys(light['border-width']), // unstable border width token\n }),\n borderRadius: light.radius,\n borderColor: flattenKeyWithoutDefault({ ch: flattenKeys(colors.border) }),\n\n colors,\n\n fontSize,\n fontWeight: flattenKeys({ ch: light.text['font-weight'] }),\n\n spacing,\n gap: spacing,\n width: light['paragraph-width'],\n },\n }\n\n return config\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport iconsV2 from '@charcoal-ui/icon-files/v2/datauri'\nimport iconsV1 from '@charcoal-ui/icon-files/v1/datauri'\nimport { CSSRuleObject } from 'tailwindcss/types/config'\n\nconst transformClassNameV2 = (fileName: string) => {\n const [size, variant, name] = fileName.split('/')\n return [\n '.icon-v2',\n name.replaceAll('.', '-'),\n ...(variant === 'regular' ? [] : [variant]),\n ...(size === '24' ? [] : [size]),\n ]\n .join('-')\n .toLowerCase()\n}\n\nconst transformClassNameV1 = (fileName: string) => {\n const [size, name] = fileName.split('/')\n return [\n '.icon-v1',\n name.replaceAll('.', '-'),\n ...(size === '24' ? [] : [size]),\n ]\n .join('-')\n .toLowerCase()\n}\n\nexport const createIconUtilities = ({\n v2 = false,\n}: {\n v2?: boolean\n}): {\n [key: string]: CSSRuleObject\n} => {\n const newUtilities: { [key: string]: CSSRuleObject } = {}\n const icons = v2 ? iconsV2 : iconsV1\n for (const [fileName, { uri, isSetCurrentcolor }] of Object.entries(icons)) {\n const className = v2\n ? transformClassNameV2(fileName)\n : transformClassNameV1(fileName)\n\n newUtilities[className] = {\n display: 'inline-block',\n width: '1em',\n height: '1em',\n maskImage: `url(${uri})`,\n maskSize: '100% 100%',\n background: isSetCurrentcolor ? 'currentColor' : null,\n aspectRatio: '1/1',\n }\n }\n return newUtilities\n}\n\nexport const charcoalIconsV2: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createIconUtilities({ v2: true }))\n },\n)\n\nexport const charcoalIconsV1: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createIconUtilities({ v2: false }))\n },\n)\n","import { GRID_COUNT, mergeEffect } from './foundation'\n\nimport type { Config } from 'tailwindcss'\nimport { TailwindVersion, ThemeMap } from './types'\n\nimport {\n assertAllThemeHaveSameKeys,\n getDefaultKeyName,\n getVariantOption,\n} from './util'\nimport {\n COLUMN_UNIT,\n GUTTER_UNIT,\n SPACING,\n BORDER_RADIUS,\n} from '@charcoal-ui/foundation'\nimport { light } from '@charcoal-ui/theme'\nimport { mapObject, px } from '@charcoal-ui/utils'\nimport { colorsToTailwindConfig } from './colors/toTailwindConfig'\n\nimport cssVariableColorPlugin from './colors/plugin'\nimport cssVariableGradientPlugin from './gradient/plugin'\nimport typographyPlugin from './typography/plugin'\nimport { unstable_createTailwindConfigTokenV2 } from './tokenV2'\nimport { charcoalIconsV1, charcoalIconsV2 } from './icons'\nexport { unstable_createTailwindConfigTokenV2 }\n\ninterface Options {\n version?: TailwindVersion\n theme?: ThemeMap\n cssVariablesV1?: boolean\n unstableTokenV2?: boolean\n iconsV2?: boolean\n iconsV1?: boolean\n}\n\nexport function createTailwindConfig({\n theme = { ':root': light },\n version = 'v3',\n cssVariablesV1 = true,\n unstableTokenV2 = false,\n iconsV2 = false,\n iconsV1 = false,\n}: Options): Omit<Config, 'content'> {\n assertAllThemeHaveSameKeys(theme)\n\n const defaultTheme = theme[':root']\n const effects = mergeEffect(defaultTheme)\n const DEFAULT = getDefaultKeyName(version)\n\n const {\n borderWidth: borderWidthV2,\n borderRadius: borderRadiusV2,\n borderColor: borderColorV2,\n colors: colorsV2,\n fontSize: fontSizeV2,\n fontWeight: fontWeightV2,\n spacing: spacingV2,\n gap: gapV2,\n width: widthV2,\n }: Partial<NonNullable<Config['theme']>> = unstableTokenV2\n ? unstable_createTailwindConfigTokenV2().theme\n : {}\n\n return {\n theme: {\n screens: {\n screen1: px(0),\n screen2: px(defaultTheme.breakpoint.screen1),\n screen3: px(defaultTheme.breakpoint.screen2),\n screen4: px(defaultTheme.breakpoint.screen3),\n screen5: px(defaultTheme.breakpoint.screen4),\n },\n colors: {\n // @deprecated\n black: '#000',\n\n // @deprecated\n white: '#fff',\n\n transparent: 'transparent',\n current: 'currentColor',\n ...colorsToTailwindConfig(version, defaultTheme.color, effects),\n ...colorsV2,\n },\n borderColor: {\n ...colorsToTailwindConfig(\n version,\n mapObject(defaultTheme.border, (k, v) => [k, v.color]),\n effects,\n ),\n ...borderColorV2,\n },\n spacing: {\n ...mapObject(\n SPACING,\n (name, pixel) => [name, px(pixel)] as [string, string],\n ),\n ...spacingV2,\n },\n width: {\n full: '100%',\n screen: '100vw',\n auto: 'auto',\n fit: 'fit-content',\n\n /**\n * generates classes like \"w-col-span-1\"\n */\n ...Array.from({ length: GRID_COUNT }, (_, i) => i + 1).reduce(\n (styles, i) => ({\n ...styles,\n [`col-span-${i}`]: px(COLUMN_UNIT * i + GUTTER_UNIT * (i - 1)),\n }),\n {},\n ),\n\n /**\n * generates classes like \"w-1/12\" (except for 12/12, which just equals to w-full)\n */\n ...Array.from({ length: GRID_COUNT - 1 }, (_, i) => i + 1).reduce(\n (styles, i) => ({\n ...styles,\n [`${i}/${GRID_COUNT}`]: `${(i / GRID_COUNT) * 100}%`,\n }),\n {},\n ),\n ...widthV2,\n },\n gap: {\n fixed: px(GUTTER_UNIT),\n ...gapV2,\n },\n borderRadius: {\n ...mapObject(\n BORDER_RADIUS,\n (name, value) => [name, px(value)] as [string, string],\n ),\n ...borderRadiusV2,\n },\n transitionDuration: {\n [DEFAULT]: '0.2s',\n },\n ...(unstableTokenV2\n ? {\n extend: {\n borderWidth: borderWidthV2,\n fontWeight: fontWeightV2,\n fontSize: fontSizeV2,\n },\n }\n : {}),\n },\n\n ...getVariantOption(version),\n\n corePlugins: {\n lineHeight: false,\n },\n plugins: [\n typographyPlugin,\n cssVariableColorPlugin(theme, Boolean(cssVariablesV1)),\n\n ...Object.entries(theme).map(([selectorOrMediaQuery, theme]) =>\n cssVariableGradientPlugin(\n theme.gradientColor,\n mergeEffect(theme),\n selectorOrMediaQuery,\n ),\n ),\n ...(iconsV2 ? [charcoalIconsV2] : []),\n ...(iconsV1 ? [charcoalIconsV1] : []),\n ],\n }\n}\n\nexport const config: Omit<Config, 'content'> = createTailwindConfig({})\n\nexport default config\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["cssVariableColorPlugin","TYPOGRAPHY_SIZE","light","flattenKeys","mapDefaultKeys","iconsV2","iconsV1","light","SPACING","COLUMN_UNIT","GUTTER_UNIT","BORDER_RADIUS","cssVariableColorPlugin","cssVariableGradientPlugin"],"sources":["../src/foundation.ts","../src/util.ts","../src/colors/utils.ts","../src/colors/toTailwindConfig.ts","../src/colors/pluginTokenV1.ts","../src/colors/plugin.ts","../src/focusring/index.ts","../src/gradient/plugin.ts","../src/typography/plugin.ts","../src/tokenV2.ts","../src/icons.ts","../src/index.ts"],"sourcesContent":["import { Effect } from '@charcoal-ui/foundation'\nimport { CharcoalTheme as Theme } from '@charcoal-ui/theme'\n\nexport const GRID_COUNT = 12\n\nexport function mergeEffect({\n elementEffect,\n effect,\n}: Pick<Theme, 'elementEffect' | 'effect'>): MergedEffect {\n return {\n ...elementEffect,\n ...effect,\n outline: {\n type: 'opacity',\n opacity: 0.32,\n } as Effect,\n }\n}\n\nexport type MergedEffect = Record<string, Effect>\n","import type { Config } from 'tailwindcss'\nimport { TailwindVersion, ThemeMap } from './types'\n\n/**\n * the key \"default\" or \"DEFAULT\" has special meaning and dropped from class name\n *\n * @see https://tailwindcss.com/docs/upgrading-to-v2#update-default-theme-keys-to-default\n */\nexport function getDefaultKeyName(version: TailwindVersion) {\n switch (version) {\n case 'v3':\n case 'v2': {\n return 'DEFAULT'\n }\n\n case 'v1': {\n return 'default'\n }\n }\n}\n\nexport function getVariantOption(version: TailwindVersion): Partial<Config> {\n switch (version) {\n case 'v3': {\n // v3 以上では variants は variantOrders に改名された\n // そしてこれは上書きをしたいモチベがない\n // https://v2.tailwindcss.com/docs/configuration#variant-order\n return {}\n }\n\n case 'v2':\n case 'v1': {\n return { variants: {} }\n }\n }\n}\n\nfunction setEquals<T>(a: Set<T>, b: Set<T>) {\n return a.size === b.size && Array.from(a).every((value) => b.has(value))\n}\n\nexport function assertAllThemeHaveSameKeys(themeMap: ThemeMap): void {\n const defaultTheme = themeMap[':root']\n const expectedColorKeys = new Set(Object.keys(defaultTheme.color))\n const expectedEffectKeys = new Set(Object.keys(defaultTheme.effect))\n\n for (const [name, theme] of Object.entries(themeMap)) {\n const colorKeys = new Set(Object.keys(theme.color))\n const effectKeys = new Set(Object.keys(theme.effect))\n\n if (!setEquals(colorKeys, expectedColorKeys)) {\n throw new Error(`:root and ${name} does not have same colors.\n\nExpected( :root ): ${JSON.stringify(Array.from(expectedColorKeys))}\nGot: ${JSON.stringify(Array.from(colorKeys))}`)\n }\n\n if (!setEquals(effectKeys, expectedEffectKeys)) {\n throw new Error(`:root and ${name} does not have same effects.\n\nExpected( :root ): ${JSON.stringify(Array.from(expectedEffectKeys))}\nGot: ${JSON.stringify(Array.from(effectKeys))}`)\n }\n }\n}\n\nexport function camelToKebab(value: string) {\n return value\n .replace(/(?<small>[\\da-z]|(?=[A-Z]))(?<capital>[A-Z])/gu, '$1-$2')\n .toLowerCase()\n}\n\nexport const mapDefaultKey = <O extends object>(o: O) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(o), function reviver(k: string, v: string) {\n if (k === 'default') {\n const DefaultKey = getDefaultKeyName('v3')\n this[DefaultKey] = v\n return undefined\n }\n return v\n })\n}\n\nexport const flattenKey = <O extends object>(\n o: O,\n join?: (key: string) => boolean,\n): Record<string, unknown> => {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n Object.entries(o).flatMap(([key, v]) => {\n if (typeof v === 'string') return [[key, v]]\n return Object.entries(v as object).map(([kk, vv]) => {\n return [(join?.(key) ?? true) ? [key, kk].join('-') : kk, vv]\n })\n }),\n )\n}\n\n/**\n * `DEFAULT` はkey名に結合しない\n */\nexport const flattenKeyWithoutDefault = <O extends object>(\n o: O,\n join?: (key: string) => boolean,\n): Record<string, unknown> => {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n Object.entries(o).flatMap(([key, v]) => {\n if (typeof v === 'string') return [[key, v]]\n return Object.entries(v as object).map(([kk, vv]) => {\n const isDefaultKey = kk === 'DEFAULT' || kk === 'default'\n const outputKey = isDefaultKey\n ? key\n : (join?.(key) ?? true)\n ? [key, kk].join('-')\n : kk\n return [outputKey, vv]\n })\n }),\n )\n}\n","import { GradientMaterial, Material } from '@charcoal-ui/foundation'\n\nexport const COLOR_PREFIX = '--tailwind-color-'\n\nexport function isSingleColor(color: AnyColor): color is Material {\n return typeof color === 'string'\n}\n\ntype AnyColor = Material | GradientMaterial\n\nexport type AnyColorTheme = Record<string, AnyColor>\n","import { Material } from '@charcoal-ui/foundation'\nimport { applyEffect, filterObject, mapObject } from '@charcoal-ui/utils'\nimport type { Config } from 'tailwindcss'\nimport { MergedEffect } from '../foundation'\n\nimport { TailwindVersion } from '../types'\nimport { getDefaultKeyName } from '../util'\n\nimport { AnyColorTheme, COLOR_PREFIX, isSingleColor } from './utils'\n\nexport function colorsToTailwindConfig(\n version: TailwindVersion,\n colors: AnyColorTheme,\n effects: MergedEffect,\n): NonNullable<Config['theme']>['colors'] {\n const targetColors = filterObject(colors, isSingleColor)\n const DEFAULT = getDefaultKeyName(version)\n\n /**\n * こういう感じのを吐き出す\n *\n * ```js\n * {\n * DEFAULT: 'var(--tailwind-color-hoge1, #fff)',\n * hover: 'var(--tailwind-color-hoge1--hover, #eee)',\n * press: 'var(--tailwind-color-hoge1--press, #ddd)',\n * disabled: 'var(--tailwind-color-hoge1--disabled, #eee)',\n * }\n * ```\n */\n function colorsForAllEffects(name: string, color: Material) {\n const varName = `${COLOR_PREFIX}${name}`\n\n return {\n [DEFAULT]: `var(${varName}, ${color})`,\n\n ...mapObject(effects, (effectName, effect) => [\n effectName,\n `var(${varName}--${effectName}, ${applyEffect(color, effect)})`,\n ]),\n }\n }\n\n return mapObject(targetColors, (name, color) => [\n name,\n colorsForAllEffects(name, color),\n ])\n}\n","import {\n applyEffect,\n customPropertyToken,\n filterObject,\n flatMapObject,\n mapObject,\n} from '@charcoal-ui/utils'\nimport { ThemeMap } from '../types'\nimport {\n CharcoalAbstractTheme,\n EffectType,\n Key,\n CharcoalTheme as Theme,\n} from '@charcoal-ui/theme'\n\nexport function defineCssVariablesV1(themeMap: ThemeMap) {\n // @ts-expect-error FIXME\n return mapObject(themeMap, (key, theme) => {\n if (key.startsWith('@media')) {\n return [\n key,\n {\n ':root': defineColorVariableCSS(theme),\n },\n ]\n } else {\n return [key, defineColorVariableCSS(theme)]\n }\n })\n}\n\nexport const defineColorVariableCSS = (theme: Theme) => {\n const borders = mapObject(theme.border, (name, { color }) => [\n // REVIEW: もしtheme.colorにたまたまborder-〇〇で始まる色名がいたら被りうる\n withPrefixes('border', name),\n color,\n ])\n\n const colors = defineThemeVariables({ ...theme.color, ...borders })({ theme })\n return colors\n}\n\n/**\n * Check whether a value is non-null and non-undefined\n *\n * @param value nullable\n */\nexport const isPresent = <T>(value: T): value is NonNullable<T> => value != null\n\n/**\n * 子孫要素で使われるカラーテーマの CSS Variables を上書きする\n *\n * @params colorParams - 上書きしたい色の定義( `theme.color` の一部だけ書けば良い )\n * @params effectParams - effect の定義を上書きしたい場合は渡す(必須ではない)\n *\n * @example\n * ```tsx\n * const LocalTheme = styled.div`\n * ${defineThemeVariables({ text1: '#ff0000' })}\n * // `text1` is now defined as red\n * ${theme((o) => [o.font.text1])}\n * `\n * ```\n */\nexport function defineThemeVariables(\n colorParams: Partial<CharcoalAbstractTheme['color']>,\n effectParams?: Partial<CharcoalAbstractTheme['effect']>,\n) {\n return function toCssObject(props: {\n theme: Pick<CharcoalAbstractTheme, 'effect'>\n }) {\n const colors = filterObject(colorParams, isPresent)\n\n // flatMapObject の中で毎回 Object.entries を呼ぶのは無駄なので外で呼ぶ\n const effects = Object.entries({\n ...props.theme.effect,\n ...effectParams,\n })\n\n return flatMapObject(colors, (colorKey, color) => [\n [customPropertyToken(colorKey), color],\n\n ...effects.map<[string, string]>(([effectKey, effect]) => [\n customPropertyToken(colorKey, [effectKey]),\n applyEffect(color, [effect]),\n ]),\n ])\n }\n}\n\nexport function isSupportedEffect(effect: Key): effect is EffectType {\n return ['hover', 'press', 'disabled'].includes(effect as string)\n}\n\nexport const variable = (value: string) => `var(${value})`\n\nexport function withPrefixes(...parts: string[]) {\n return parts.join('-')\n}\n","import { Material } from '@charcoal-ui/foundation'\nimport { CharcoalTheme as Theme } from '@charcoal-ui/theme'\nimport {\n applyEffect,\n filterObject,\n flatMapObject,\n mapObject,\n} from '@charcoal-ui/utils'\nimport plugin from 'tailwindcss/plugin.js'\nimport { mergeEffect } from '../foundation'\nimport { CSSVariableName, CSSVariables, Definition, ThemeMap } from '../types'\nimport { COLOR_PREFIX, isSingleColor } from './utils'\nimport { defineCssVariablesV1 } from './pluginTokenV1'\n\n/**\n * --tailwind-* また --charcoal-* を生成する\n * TODO: --tailwindをやめる\n */\nexport default function cssVariableColorPlugin(\n themeMap: ThemeMap,\n cssVariablesV1: boolean,\n): ReturnType<typeof plugin> {\n // `:root` 以外のケースで各 CSS Variable がどういう値を取るかを定義する\n const { ':root': _defaultTheme, ...otherThemes } = themeMap\n const definitions = defineCssVariables(otherThemes)\n\n return plugin(({ addBase }) => {\n addBase(definitions)\n\n // styledのTokenInjector移植(background処理除く)\n if (cssVariablesV1) {\n const cssVariablesV1 = defineCssVariablesV1(themeMap)\n // @ts-expect-error FIXME\n addBase(cssVariablesV1)\n }\n })\n}\n\nexport function defineCssVariables(themes: Omit<ThemeMap, ':root'>) {\n return mapObject(themes, (selectorOrMediaQuery, theme) => {\n const css = toCssVariables(theme)\n\n if (selectorOrMediaQuery.startsWith('@media')) {\n return [\n selectorOrMediaQuery,\n {\n ':root': css,\n },\n ]\n } else {\n return [selectorOrMediaQuery, css]\n }\n }) as Definition\n}\n\nfunction toCssVariables(theme: Theme): CSSVariables {\n const colors = filterObject(theme.color, isSingleColor)\n const effects = Object.entries(mergeEffect(theme))\n\n return flatMapObject(colors, (name, color) => {\n const varName: keyof CSSVariables = `${COLOR_PREFIX}${name}`\n\n return [\n [varName, color],\n\n ...effects.map<[CSSVariableName, Material]>(([type, effect]) => [\n `${varName}--${type}`,\n applyEffect(color, effect),\n ]),\n ]\n })\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport { CSSRuleObject } from 'tailwindcss/types/config'\n\nexport const createFocusRingUtilities = (): {\n [key: string]: CSSRuleObject\n} => ({\n '.ch-focus-ring': {\n \"&:not(:disabled):not([aria-disabled]):focus-visible, &[aria-disabled='false']:focus-visible\":\n {\n outline: 'none',\n boxShadow:\n '0 0 0 4px var(--charcoal-color-border-focus-legacy, rgba(0, 150, 250, 0.32))',\n transition: '0.2s box-shadow',\n },\n },\n})\n\nexport const charcoalFocusRing: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createFocusRingUtilities())\n },\n)\n","import plugin from 'tailwindcss/plugin.js'\nimport { camelToKebab } from '../util'\nimport { GradientMaterial } from '@charcoal-ui/foundation'\nimport { ThemeColorGradient } from '@charcoal-ui/theme'\nimport {\n applyEffectToGradient,\n flatMapObject,\n gradient,\n GradientDirection,\n mapKeys,\n mapObject,\n} from '@charcoal-ui/utils'\nimport { Values } from '../types'\nimport { MergedEffect } from '../foundation'\n\nconst VAR_PREFIX = '--tailwind-gradient-'\n\nexport default function cssVariableColorPlugin(\n gradients: ThemeColorGradient,\n effects: MergedEffect,\n selectorOrMediaQuery: string,\n) {\n const utilities = getUtilities(gradients, effects)\n\n const classRules = mapObject(utilities, (name) => [\n `.bg-${name}`,\n { backgroundImage: `var(${VAR_PREFIX}${name})` },\n ])\n\n return plugin(({ addBase, addUtilities }) => {\n const css = mapKeys(utilities, (name) => `${VAR_PREFIX}${name}`)\n if (selectorOrMediaQuery.startsWith('@media')) {\n addBase({\n [selectorOrMediaQuery]: {\n ':root': css,\n },\n })\n } else {\n addBase({\n [selectorOrMediaQuery]: css,\n })\n }\n\n addUtilities(classRules, {\n // @ts-expect-error FIXME\n variants: ['responsive'],\n })\n })\n}\n\nconst DIRECTIONS = {\n 'to top': 'top',\n 'to bottom': 'bottom',\n 'to left': 'left',\n 'to right': 'right',\n} as const\n\n/**\n * こういう感じのやつ。この時点では `--tailwind-gradient-` のような CSS 変数名になってない\n *\n * ```js\n * {\n * 'hoge1': 'linear-gradient(to top, ...)',\n * ...\n * }\n * ```\n */\ntype Utilities = Record<string, LinearGradient>\n\ntype LinearGradient = `linear-gradient(${string})`\n\nexport function getUtilities(\n gradients: Record<string, GradientMaterial>,\n effect: MergedEffect,\n): Utilities {\n const effects = Object.entries(effect)\n const directions = Object.entries(DIRECTIONS) as [\n GradientDirection,\n Values<typeof DIRECTIONS>,\n ][]\n\n return flatMapObject(gradients, (name, colors) =>\n directions.flatMap(([direction, className]) => {\n const toLinearGradient = (colors: GradientMaterial) => {\n const style = gradient(direction)(colors)\n\n if (!('backgroundImage' in style)) {\n throw new Error(\n `Could not generate linear-gradient() from ${name} ${direction} ${className}`,\n )\n }\n\n // 本当は backgroundColor も同時に生成されるんだけど、使うにはそれ用の CSS 変数も一緒に作らないといけない\n // とりあえず background-image だけで動くのでこっちだけを利用する\n return style.backgroundImage as LinearGradient\n }\n\n return [\n // こういう感じのやつ\n // { 'hoge1': 'linear-gradient(to top, ...)' }\n [createUtilityName(name, className), toLinearGradient(colors)],\n\n // こういう感じのやつ\n // { 'hoge1--hover': 'linear-gradient(to top, ...)' }\n ...effects.map<[string, LinearGradient]>(([effectName, effect]) => [\n createUtilityName(name, className, effectName),\n toLinearGradient(applyEffectToGradient(effect)(colors)),\n ]),\n ]\n }),\n )\n}\n\nfunction createUtilityName(\n gradientName: string,\n direction: Values<typeof DIRECTIONS>,\n suffix = '',\n) {\n return [camelToKebab(gradientName), direction, suffix]\n .filter(Boolean)\n .join('-')\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport { TypographyDescriptor, TYPOGRAPHY_SIZE } from '@charcoal-ui/foundation'\nimport { halfLeading, mapObject, px } from '@charcoal-ui/utils'\n\nconst leadingCancel = {\n display: 'block',\n width: 0,\n height: 0,\n content: '\"\"',\n}\n\nconst typographyStyle = (style: TypographyDescriptor) => {\n const margin = -halfLeading(style)\n\n return {\n 'font-size': px(style.fontSize),\n 'line-height': px(style.lineHeight),\n\n /**\n * cancel leading\n *\n * @see https://yuyakinoshita.com/blog/2020/01/20/line-height-crop/\n */\n '&::before': {\n ...leadingCancel,\n marginTop: px(margin),\n },\n '&::after': {\n ...leadingCancel,\n marginBottom: px(margin),\n },\n }\n}\n\nconst typographyPlugin = plugin(({ addUtilities }) => {\n const typographyClasses = mapObject(TYPOGRAPHY_SIZE, (fontSize, style) => [\n `.typography-${fontSize}`,\n typographyStyle(style),\n ])\n\n addUtilities(\n {\n ...typographyClasses,\n '.preserve-half-leading': {\n '&::before': {\n content: 'none',\n },\n '&::after': {\n content: 'none',\n },\n },\n },\n {\n // @ts-expect-error FIXME\n variants: ['responsive'],\n },\n )\n})\n\nexport default typographyPlugin\n","import light from '@charcoal-ui/theme/unstable-tokens/css-variables.json' with { type: 'json' }\nimport type { Config } from 'tailwindcss'\nimport {\n flattenKey as flattenKeys,\n flattenKeyWithoutDefault,\n mapDefaultKey as mapDefaultKeys,\n} from './util'\n\nexport function unstable_createTailwindConfigTokenV2(): Omit<\n Config,\n 'content'\n> {\n const fontSize = Object.fromEntries(\n Object.entries(light.text['font-size']).flatMap(([k, v]) => {\n // text.fontSize.paragraph + text.lineHeight.paragraph -> text-paragraph\n if (typeof v === 'string') {\n return [\n [\n k,\n [\n v,\n // @ts-expect-error k is keyof line-height\n { lineHeight: light.text['line-height'][k] },\n ],\n ],\n ]\n }\n\n // text.fontSize.heading.s + text.lineHeight.heading.s -> text-heading-s\n return Object.entries(v as Record<string, string>).map(([kk, vv]) => {\n return [\n [k, kk].join('-'),\n [\n vv,\n // @ts-expect-error k is keyof line-height\n { lineHeight: light.text['line-height'][k][kk] },\n ],\n ]\n })\n }),\n ) as NonNullable<Config['theme']>['fontSize']\n\n // space.target.s -> p-target-s\n // space.gap.gapButtons -> p-gap-buttons\n const spacing = flattenKeys(light.space, (key) => !/(gap|padding)/.test(key))\n // color.container.default -> bg-container\n // color.container.hover -> bg-container-hover\n const colors = mapDefaultKeys(light.color)\n\n const config: Omit<Config, 'content'> = {\n darkMode: 'media',\n theme: {\n // borderWidth.m -> border-m\n // borderWidth.focus.1 -> border-focus-1\n borderWidth: flattenKeyWithoutDefault({\n 'width-ch': flattenKeys(light['border-width']), // unstable border width token\n }),\n borderRadius: light.radius,\n borderColor: flattenKeyWithoutDefault({ ch: flattenKeys(colors.border) }),\n\n colors,\n\n fontSize,\n fontWeight: flattenKeys({ ch: light.text['font-weight'] }),\n\n spacing,\n gap: spacing,\n width: light['paragraph-width'],\n },\n }\n\n return config\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport iconsV2 from '@charcoal-ui/icon-files/v2/datauri'\nimport iconsV1 from '@charcoal-ui/icon-files/v1/datauri'\nimport { CSSRuleObject } from 'tailwindcss/types/config'\n\nconst transformClassNameV2 = (fileName: string) => {\n const [size, variant, name] = fileName.split('/')\n return [\n '.icon-v2',\n name.replaceAll('.', '-'),\n ...(variant === 'regular' ? [] : [variant]),\n ...(size === '24' ? [] : [size]),\n ]\n .join('-')\n .toLowerCase()\n}\n\nconst transformClassNameV1 = (fileName: string) => {\n const [size, name] = fileName.split('/')\n return [\n '.icon-v1',\n name.replaceAll('.', '-'),\n ...(size === '24' ? [] : [size]),\n ]\n .join('-')\n .toLowerCase()\n}\n\nexport const createIconUtilities = ({\n v2 = false,\n}: {\n v2?: boolean\n}): {\n [key: string]: CSSRuleObject\n} => {\n const newUtilities: { [key: string]: CSSRuleObject } = {}\n const icons = v2 ? iconsV2 : iconsV1\n for (const [fileName, { uri, isSetCurrentcolor }] of Object.entries(icons)) {\n const className = v2\n ? transformClassNameV2(fileName)\n : transformClassNameV1(fileName)\n\n newUtilities[className] = {\n display: 'inline-block',\n width: '1em',\n height: '1em',\n maskImage: `url(${uri})`,\n maskSize: '100% 100%',\n background: isSetCurrentcolor ? 'currentColor' : null,\n aspectRatio: '1/1',\n }\n }\n return newUtilities\n}\n\nexport const charcoalIconsV2: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createIconUtilities({ v2: true }))\n },\n)\n\nexport const charcoalIconsV1: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createIconUtilities({ v2: false }))\n },\n)\n","import { GRID_COUNT, mergeEffect } from './foundation'\n\nimport type { Config } from 'tailwindcss'\nimport { TailwindVersion, ThemeMap } from './types'\n\nimport {\n assertAllThemeHaveSameKeys,\n getDefaultKeyName,\n getVariantOption,\n} from './util'\nimport {\n COLUMN_UNIT,\n GUTTER_UNIT,\n SPACING,\n BORDER_RADIUS,\n} from '@charcoal-ui/foundation'\nimport { light } from '@charcoal-ui/theme'\nimport { mapObject, px } from '@charcoal-ui/utils'\nimport { colorsToTailwindConfig } from './colors/toTailwindConfig'\n\nimport cssVariableColorPlugin from './colors/plugin'\nimport { charcoalFocusRing } from './focusring'\nimport cssVariableGradientPlugin from './gradient/plugin'\nimport typographyPlugin from './typography/plugin'\nimport { unstable_createTailwindConfigTokenV2 } from './tokenV2'\nimport { charcoalIconsV1, charcoalIconsV2 } from './icons'\nexport { unstable_createTailwindConfigTokenV2 }\n\ninterface Options {\n version?: TailwindVersion\n theme?: ThemeMap\n cssVariablesV1?: boolean\n unstableTokenV2?: boolean\n iconsV2?: boolean\n iconsV1?: boolean\n}\n\nexport function createTailwindConfig({\n theme = { ':root': light },\n version = 'v3',\n cssVariablesV1 = true,\n unstableTokenV2 = false,\n iconsV2 = false,\n iconsV1 = false,\n}: Options): Omit<Config, 'content'> {\n assertAllThemeHaveSameKeys(theme)\n\n const defaultTheme = theme[':root']\n const effects = mergeEffect(defaultTheme)\n const DEFAULT = getDefaultKeyName(version)\n\n const {\n borderWidth: borderWidthV2,\n borderRadius: borderRadiusV2,\n borderColor: borderColorV2,\n colors: colorsV2,\n fontSize: fontSizeV2,\n fontWeight: fontWeightV2,\n spacing: spacingV2,\n gap: gapV2,\n width: widthV2,\n }: Partial<NonNullable<Config['theme']>> = unstableTokenV2\n ? unstable_createTailwindConfigTokenV2().theme\n : {}\n\n return {\n theme: {\n screens: {\n screen1: px(0),\n screen2: px(defaultTheme.breakpoint.screen1),\n screen3: px(defaultTheme.breakpoint.screen2),\n screen4: px(defaultTheme.breakpoint.screen3),\n screen5: px(defaultTheme.breakpoint.screen4),\n },\n colors: {\n // @deprecated\n black: '#000',\n\n // @deprecated\n white: '#fff',\n\n transparent: 'transparent',\n current: 'currentColor',\n ...colorsToTailwindConfig(version, defaultTheme.color, effects),\n ...colorsV2,\n },\n borderColor: {\n ...colorsToTailwindConfig(\n version,\n mapObject(defaultTheme.border, (k, v) => [k, v.color]),\n effects,\n ),\n ...borderColorV2,\n },\n spacing: {\n ...mapObject(\n SPACING,\n (name, pixel) => [name, px(pixel)] as [string, string],\n ),\n ...spacingV2,\n },\n width: {\n full: '100%',\n screen: '100vw',\n auto: 'auto',\n fit: 'fit-content',\n\n /**\n * generates classes like \"w-col-span-1\"\n */\n ...Array.from({ length: GRID_COUNT }, (_, i) => i + 1).reduce(\n (styles, i) => ({\n ...styles,\n [`col-span-${i}`]: px(COLUMN_UNIT * i + GUTTER_UNIT * (i - 1)),\n }),\n {},\n ),\n\n /**\n * generates classes like \"w-1/12\" (except for 12/12, which just equals to w-full)\n */\n ...Array.from({ length: GRID_COUNT - 1 }, (_, i) => i + 1).reduce(\n (styles, i) => ({\n ...styles,\n [`${i}/${GRID_COUNT}`]: `${(i / GRID_COUNT) * 100}%`,\n }),\n {},\n ),\n ...widthV2,\n },\n gap: {\n fixed: px(GUTTER_UNIT),\n ...gapV2,\n },\n borderRadius: {\n ...mapObject(\n BORDER_RADIUS,\n (name, value) => [name, px(value)] as [string, string],\n ),\n ...borderRadiusV2,\n },\n transitionDuration: {\n [DEFAULT]: '0.2s',\n },\n ...(unstableTokenV2\n ? {\n extend: {\n borderWidth: borderWidthV2,\n fontWeight: fontWeightV2,\n fontSize: fontSizeV2,\n },\n }\n : {}),\n },\n\n ...getVariantOption(version),\n\n corePlugins: {\n lineHeight: false,\n },\n plugins: [\n typographyPlugin,\n charcoalFocusRing,\n cssVariableColorPlugin(theme, Boolean(cssVariablesV1)),\n\n ...Object.entries(theme).map(([selectorOrMediaQuery, theme]) =>\n cssVariableGradientPlugin(\n theme.gradientColor,\n mergeEffect(theme),\n selectorOrMediaQuery,\n ),\n ),\n ...(iconsV2 ? [charcoalIconsV2] : []),\n ...(iconsV1 ? [charcoalIconsV1] : []),\n ],\n }\n}\n\nexport const config: Omit<Config, 'content'> = createTailwindConfig({})\n\nexport default config\n"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -5,9 +5,7 @@ import plugin from "tailwindcss/plugin.js";
5
5
  import light$1 from "@charcoal-ui/theme/unstable-tokens/css-variables.json" with { type: "json" };
6
6
  import iconsV2 from "@charcoal-ui/icon-files/v2/datauri";
7
7
  import iconsV1 from "@charcoal-ui/icon-files/v1/datauri";
8
-
9
8
  //#region src/foundation.ts
10
- const GRID_COUNT = 12;
11
9
  function mergeEffect({ elementEffect, effect }) {
12
10
  return {
13
11
  ...elementEffect,
@@ -18,7 +16,6 @@ function mergeEffect({ elementEffect, effect }) {
18
16
  }
19
17
  };
20
18
  }
21
-
22
19
  //#endregion
23
20
  //#region src/util.ts
24
21
  /**
@@ -92,14 +89,12 @@ const flattenKeyWithoutDefault = (o, join) => {
92
89
  });
93
90
  }));
94
91
  };
95
-
96
92
  //#endregion
97
93
  //#region src/colors/utils.ts
98
94
  const COLOR_PREFIX = "--tailwind-color-";
99
95
  function isSingleColor(color) {
100
96
  return typeof color === "string";
101
97
  }
102
-
103
98
  //#endregion
104
99
  //#region src/colors/toTailwindConfig.ts
105
100
  function colorsToTailwindConfig(version, colors, effects) {
@@ -126,7 +121,6 @@ function colorsToTailwindConfig(version, colors, effects) {
126
121
  }
127
122
  return mapObject(targetColors, (name, color) => [name, colorsForAllEffects(name, color)]);
128
123
  }
129
-
130
124
  //#endregion
131
125
  //#region src/colors/pluginTokenV1.ts
132
126
  function defineCssVariablesV1(themeMap) {
@@ -176,7 +170,6 @@ function defineThemeVariables(colorParams, effectParams) {
176
170
  function withPrefixes(...parts) {
177
171
  return parts.join("-");
178
172
  }
179
-
180
173
  //#endregion
181
174
  //#region src/colors/plugin.ts
182
175
  /**
@@ -206,7 +199,16 @@ function toCssVariables(theme) {
206
199
  return [[varName, color], ...effects.map(([type, effect]) => [`${varName}--${type}`, applyEffect(color, effect)])];
207
200
  });
208
201
  }
209
-
202
+ //#endregion
203
+ //#region src/focusring/index.ts
204
+ const createFocusRingUtilities = () => ({ ".ch-focus-ring": { "&:not(:disabled):not([aria-disabled]):focus-visible, &[aria-disabled='false']:focus-visible": {
205
+ outline: "none",
206
+ boxShadow: "0 0 0 4px var(--charcoal-color-border-focus-legacy, rgba(0, 150, 250, 0.32))",
207
+ transition: "0.2s box-shadow"
208
+ } } });
209
+ const charcoalFocusRing = plugin(({ addUtilities }) => {
210
+ addUtilities(createFocusRingUtilities());
211
+ });
210
212
  //#endregion
211
213
  //#region src/gradient/plugin.ts
212
214
  const VAR_PREFIX = "--tailwind-gradient-";
@@ -245,7 +247,6 @@ function createUtilityName(gradientName, direction, suffix = "") {
245
247
  suffix
246
248
  ].filter(Boolean).join("-");
247
249
  }
248
-
249
250
  //#endregion
250
251
  //#region src/typography/plugin.ts
251
252
  const leadingCancel = {
@@ -259,6 +260,11 @@ const typographyStyle = (style) => {
259
260
  return {
260
261
  "font-size": px(style.fontSize),
261
262
  "line-height": px(style.lineHeight),
263
+ /**
264
+ * cancel leading
265
+ *
266
+ * @see https://yuyakinoshita.com/blog/2020/01/20/line-height-crop/
267
+ */
262
268
  "&::before": {
263
269
  ...leadingCancel,
264
270
  marginTop: px(margin)
@@ -278,7 +284,6 @@ const typographyPlugin = plugin(({ addUtilities }) => {
278
284
  }
279
285
  }, { variants: ["responsive"] });
280
286
  });
281
-
282
287
  //#endregion
283
288
  //#region src/tokenV2.ts
284
289
  function unstable_createTailwindConfigTokenV2() {
@@ -305,7 +310,6 @@ function unstable_createTailwindConfigTokenV2() {
305
310
  }
306
311
  };
307
312
  }
308
-
309
313
  //#endregion
310
314
  //#region src/icons.ts
311
315
  const transformClassNameV2 = (fileName) => {
@@ -348,7 +352,6 @@ const charcoalIconsV2 = plugin(({ addUtilities }) => {
348
352
  const charcoalIconsV1 = plugin(({ addUtilities }) => {
349
353
  addUtilities(createIconUtilities({ v2: false }));
350
354
  });
351
-
352
355
  //#endregion
353
356
  //#region src/index.ts
354
357
  function createTailwindConfig({ theme = { ":root": light }, version = "v3", cssVariablesV1 = true, unstableTokenV2 = false, iconsV2 = false, iconsV1 = false }) {
@@ -387,13 +390,19 @@ function createTailwindConfig({ theme = { ":root": light }, version = "v3", cssV
387
390
  screen: "100vw",
388
391
  auto: "auto",
389
392
  fit: "fit-content",
390
- ...Array.from({ length: GRID_COUNT }, (_, i) => i + 1).reduce((styles, i) => ({
393
+ /**
394
+ * generates classes like "w-col-span-1"
395
+ */
396
+ ...Array.from({ length: 12 }, (_, i) => i + 1).reduce((styles, i) => ({
391
397
  ...styles,
392
398
  [`col-span-${i}`]: px(COLUMN_UNIT * i + GUTTER_UNIT * (i - 1))
393
399
  }), {}),
394
- ...Array.from({ length: GRID_COUNT - 1 }, (_, i) => i + 1).reduce((styles, i) => ({
400
+ /**
401
+ * generates classes like "w-1/12" (except for 12/12, which just equals to w-full)
402
+ */
403
+ ...Array.from({ length: 11 }, (_, i) => i + 1).reduce((styles, i) => ({
395
404
  ...styles,
396
- [`${i}/${GRID_COUNT}`]: `${i / GRID_COUNT * 100}%`
405
+ [`${i}/12`]: `${i / 12 * 100}%`
397
406
  }), {}),
398
407
  ...widthV2
399
408
  },
@@ -416,6 +425,7 @@ function createTailwindConfig({ theme = { ":root": light }, version = "v3", cssV
416
425
  corePlugins: { lineHeight: false },
417
426
  plugins: [
418
427
  typographyPlugin,
428
+ charcoalFocusRing,
419
429
  cssVariableColorPlugin$1(theme, Boolean(cssVariablesV1)),
420
430
  ...Object.entries(theme).map(([selectorOrMediaQuery, theme]) => cssVariableColorPlugin(theme.gradientColor, mergeEffect(theme), selectorOrMediaQuery)),
421
431
  ...iconsV2 ? [charcoalIconsV2] : [],
@@ -424,7 +434,7 @@ function createTailwindConfig({ theme = { ":root": light }, version = "v3", cssV
424
434
  };
425
435
  }
426
436
  const config = createTailwindConfig({});
427
-
428
437
  //#endregion
429
438
  export { config, config as default, createTailwindConfig, unstable_createTailwindConfigTokenV2 };
439
+
430
440
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["cssVariableColorPlugin","light","flattenKeys","mapDefaultKeys","cssVariableColorPlugin","cssVariableGradientPlugin"],"sources":["../src/foundation.ts","../src/util.ts","../src/colors/utils.ts","../src/colors/toTailwindConfig.ts","../src/colors/pluginTokenV1.ts","../src/colors/plugin.ts","../src/gradient/plugin.ts","../src/typography/plugin.ts","../src/tokenV2.ts","../src/icons.ts","../src/index.ts"],"sourcesContent":["import { Effect } from '@charcoal-ui/foundation'\nimport { CharcoalTheme as Theme } from '@charcoal-ui/theme'\n\nexport const GRID_COUNT = 12\n\nexport function mergeEffect({\n elementEffect,\n effect,\n}: Pick<Theme, 'elementEffect' | 'effect'>): MergedEffect {\n return {\n ...elementEffect,\n ...effect,\n outline: {\n type: 'opacity',\n opacity: 0.32,\n } as Effect,\n }\n}\n\nexport type MergedEffect = Record<string, Effect>\n","import type { Config } from 'tailwindcss'\nimport { TailwindVersion, ThemeMap } from './types'\n\n/**\n * the key \"default\" or \"DEFAULT\" has special meaning and dropped from class name\n *\n * @see https://tailwindcss.com/docs/upgrading-to-v2#update-default-theme-keys-to-default\n */\nexport function getDefaultKeyName(version: TailwindVersion) {\n switch (version) {\n case 'v3':\n case 'v2': {\n return 'DEFAULT'\n }\n\n case 'v1': {\n return 'default'\n }\n }\n}\n\nexport function getVariantOption(version: TailwindVersion): Partial<Config> {\n switch (version) {\n case 'v3': {\n // v3 以上では variants は variantOrders に改名された\n // そしてこれは上書きをしたいモチベがない\n // https://v2.tailwindcss.com/docs/configuration#variant-order\n return {}\n }\n\n case 'v2':\n case 'v1': {\n return { variants: {} }\n }\n }\n}\n\nfunction setEquals<T>(a: Set<T>, b: Set<T>) {\n return a.size === b.size && Array.from(a).every((value) => b.has(value))\n}\n\nexport function assertAllThemeHaveSameKeys(themeMap: ThemeMap): void {\n const defaultTheme = themeMap[':root']\n const expectedColorKeys = new Set(Object.keys(defaultTheme.color))\n const expectedEffectKeys = new Set(Object.keys(defaultTheme.effect))\n\n for (const [name, theme] of Object.entries(themeMap)) {\n const colorKeys = new Set(Object.keys(theme.color))\n const effectKeys = new Set(Object.keys(theme.effect))\n\n if (!setEquals(colorKeys, expectedColorKeys)) {\n throw new Error(`:root and ${name} does not have same colors.\n\nExpected( :root ): ${JSON.stringify(Array.from(expectedColorKeys))}\nGot: ${JSON.stringify(Array.from(colorKeys))}`)\n }\n\n if (!setEquals(effectKeys, expectedEffectKeys)) {\n throw new Error(`:root and ${name} does not have same effects.\n\nExpected( :root ): ${JSON.stringify(Array.from(expectedEffectKeys))}\nGot: ${JSON.stringify(Array.from(effectKeys))}`)\n }\n }\n}\n\nexport function camelToKebab(value: string) {\n return value\n .replace(/(?<small>[\\da-z]|(?=[A-Z]))(?<capital>[A-Z])/gu, '$1-$2')\n .toLowerCase()\n}\n\nexport const mapDefaultKey = <O extends object>(o: O) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(o), function reviver(k: string, v: string) {\n if (k === 'default') {\n const DefaultKey = getDefaultKeyName('v3')\n this[DefaultKey] = v\n return undefined\n }\n return v\n })\n}\n\nexport const flattenKey = <O extends object>(\n o: O,\n join?: (key: string) => boolean,\n): Record<string, unknown> => {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n Object.entries(o).flatMap(([key, v]) => {\n if (typeof v === 'string') return [[key, v]]\n return Object.entries(v as object).map(([kk, vv]) => {\n return [(join?.(key) ?? true) ? [key, kk].join('-') : kk, vv]\n })\n }),\n )\n}\n\n/**\n * `DEFAULT` はkey名に結合しない\n */\nexport const flattenKeyWithoutDefault = <O extends object>(\n o: O,\n join?: (key: string) => boolean,\n): Record<string, unknown> => {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n Object.entries(o).flatMap(([key, v]) => {\n if (typeof v === 'string') return [[key, v]]\n return Object.entries(v as object).map(([kk, vv]) => {\n const isDefaultKey = kk === 'DEFAULT' || kk === 'default'\n const outputKey = isDefaultKey\n ? key\n : (join?.(key) ?? true)\n ? [key, kk].join('-')\n : kk\n return [outputKey, vv]\n })\n }),\n )\n}\n","import { GradientMaterial, Material } from '@charcoal-ui/foundation'\n\nexport const COLOR_PREFIX = '--tailwind-color-'\n\nexport function isSingleColor(color: AnyColor): color is Material {\n return typeof color === 'string'\n}\n\ntype AnyColor = Material | GradientMaterial\n\nexport type AnyColorTheme = Record<string, AnyColor>\n","import { Material } from '@charcoal-ui/foundation'\nimport { applyEffect, filterObject, mapObject } from '@charcoal-ui/utils'\nimport type { Config } from 'tailwindcss'\nimport { MergedEffect } from '../foundation'\n\nimport { TailwindVersion } from '../types'\nimport { getDefaultKeyName } from '../util'\n\nimport { AnyColorTheme, COLOR_PREFIX, isSingleColor } from './utils'\n\nexport function colorsToTailwindConfig(\n version: TailwindVersion,\n colors: AnyColorTheme,\n effects: MergedEffect,\n): NonNullable<Config['theme']>['colors'] {\n const targetColors = filterObject(colors, isSingleColor)\n const DEFAULT = getDefaultKeyName(version)\n\n /**\n * こういう感じのを吐き出す\n *\n * ```js\n * {\n * DEFAULT: 'var(--tailwind-color-hoge1, #fff)',\n * hover: 'var(--tailwind-color-hoge1--hover, #eee)',\n * press: 'var(--tailwind-color-hoge1--press, #ddd)',\n * disabled: 'var(--tailwind-color-hoge1--disabled, #eee)',\n * }\n * ```\n */\n function colorsForAllEffects(name: string, color: Material) {\n const varName = `${COLOR_PREFIX}${name}`\n\n return {\n [DEFAULT]: `var(${varName}, ${color})`,\n\n ...mapObject(effects, (effectName, effect) => [\n effectName,\n `var(${varName}--${effectName}, ${applyEffect(color, effect)})`,\n ]),\n }\n }\n\n return mapObject(targetColors, (name, color) => [\n name,\n colorsForAllEffects(name, color),\n ])\n}\n","import {\n applyEffect,\n customPropertyToken,\n filterObject,\n flatMapObject,\n mapObject,\n} from '@charcoal-ui/utils'\nimport { ThemeMap } from '../types'\nimport {\n CharcoalAbstractTheme,\n EffectType,\n Key,\n CharcoalTheme as Theme,\n} from '@charcoal-ui/theme'\n\nexport function defineCssVariablesV1(themeMap: ThemeMap) {\n // @ts-expect-error FIXME\n return mapObject(themeMap, (key, theme) => {\n if (key.startsWith('@media')) {\n return [\n key,\n {\n ':root': defineColorVariableCSS(theme),\n },\n ]\n } else {\n return [key, defineColorVariableCSS(theme)]\n }\n })\n}\n\nexport const defineColorVariableCSS = (theme: Theme) => {\n const borders = mapObject(theme.border, (name, { color }) => [\n // REVIEW: もしtheme.colorにたまたまborder-〇〇で始まる色名がいたら被りうる\n withPrefixes('border', name),\n color,\n ])\n\n const colors = defineThemeVariables({ ...theme.color, ...borders })({ theme })\n return colors\n}\n\n/**\n * Check whether a value is non-null and non-undefined\n *\n * @param value nullable\n */\nexport const isPresent = <T>(value: T): value is NonNullable<T> => value != null\n\n/**\n * 子孫要素で使われるカラーテーマの CSS Variables を上書きする\n *\n * @params colorParams - 上書きしたい色の定義( `theme.color` の一部だけ書けば良い )\n * @params effectParams - effect の定義を上書きしたい場合は渡す(必須ではない)\n *\n * @example\n * ```tsx\n * const LocalTheme = styled.div`\n * ${defineThemeVariables({ text1: '#ff0000' })}\n * // `text1` is now defined as red\n * ${theme((o) => [o.font.text1])}\n * `\n * ```\n */\nexport function defineThemeVariables(\n colorParams: Partial<CharcoalAbstractTheme['color']>,\n effectParams?: Partial<CharcoalAbstractTheme['effect']>,\n) {\n return function toCssObject(props: {\n theme: Pick<CharcoalAbstractTheme, 'effect'>\n }) {\n const colors = filterObject(colorParams, isPresent)\n\n // flatMapObject の中で毎回 Object.entries を呼ぶのは無駄なので外で呼ぶ\n const effects = Object.entries({\n ...props.theme.effect,\n ...effectParams,\n })\n\n return flatMapObject(colors, (colorKey, color) => [\n [customPropertyToken(colorKey), color],\n\n ...effects.map<[string, string]>(([effectKey, effect]) => [\n customPropertyToken(colorKey, [effectKey]),\n applyEffect(color, [effect]),\n ]),\n ])\n }\n}\n\nexport function isSupportedEffect(effect: Key): effect is EffectType {\n return ['hover', 'press', 'disabled'].includes(effect as string)\n}\n\nexport const variable = (value: string) => `var(${value})`\n\nexport function withPrefixes(...parts: string[]) {\n return parts.join('-')\n}\n","import { Material } from '@charcoal-ui/foundation'\nimport { CharcoalTheme as Theme } from '@charcoal-ui/theme'\nimport {\n applyEffect,\n filterObject,\n flatMapObject,\n mapObject,\n} from '@charcoal-ui/utils'\nimport plugin from 'tailwindcss/plugin.js'\nimport { mergeEffect } from '../foundation'\nimport { CSSVariableName, CSSVariables, Definition, ThemeMap } from '../types'\nimport { COLOR_PREFIX, isSingleColor } from './utils'\nimport { defineCssVariablesV1 } from './pluginTokenV1'\n\n/**\n * --tailwind-* また --charcoal-* を生成する\n * TODO: --tailwindをやめる\n */\nexport default function cssVariableColorPlugin(\n themeMap: ThemeMap,\n cssVariablesV1: boolean,\n): ReturnType<typeof plugin> {\n // `:root` 以外のケースで各 CSS Variable がどういう値を取るかを定義する\n const { ':root': _defaultTheme, ...otherThemes } = themeMap\n const definitions = defineCssVariables(otherThemes)\n\n return plugin(({ addBase }) => {\n addBase(definitions)\n\n // styledのTokenInjector移植(background処理除く)\n if (cssVariablesV1) {\n const cssVariablesV1 = defineCssVariablesV1(themeMap)\n // @ts-expect-error FIXME\n addBase(cssVariablesV1)\n }\n })\n}\n\nexport function defineCssVariables(themes: Omit<ThemeMap, ':root'>) {\n return mapObject(themes, (selectorOrMediaQuery, theme) => {\n const css = toCssVariables(theme)\n\n if (selectorOrMediaQuery.startsWith('@media')) {\n return [\n selectorOrMediaQuery,\n {\n ':root': css,\n },\n ]\n } else {\n return [selectorOrMediaQuery, css]\n }\n }) as Definition\n}\n\nfunction toCssVariables(theme: Theme): CSSVariables {\n const colors = filterObject(theme.color, isSingleColor)\n const effects = Object.entries(mergeEffect(theme))\n\n return flatMapObject(colors, (name, color) => {\n const varName: keyof CSSVariables = `${COLOR_PREFIX}${name}`\n\n return [\n [varName, color],\n\n ...effects.map<[CSSVariableName, Material]>(([type, effect]) => [\n `${varName}--${type}`,\n applyEffect(color, effect),\n ]),\n ]\n })\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport { camelToKebab } from '../util'\nimport { GradientMaterial } from '@charcoal-ui/foundation'\nimport { ThemeColorGradient } from '@charcoal-ui/theme'\nimport {\n applyEffectToGradient,\n flatMapObject,\n gradient,\n GradientDirection,\n mapKeys,\n mapObject,\n} from '@charcoal-ui/utils'\nimport { Values } from '../types'\nimport { MergedEffect } from '../foundation'\n\nconst VAR_PREFIX = '--tailwind-gradient-'\n\nexport default function cssVariableColorPlugin(\n gradients: ThemeColorGradient,\n effects: MergedEffect,\n selectorOrMediaQuery: string,\n) {\n const utilities = getUtilities(gradients, effects)\n\n const classRules = mapObject(utilities, (name) => [\n `.bg-${name}`,\n { backgroundImage: `var(${VAR_PREFIX}${name})` },\n ])\n\n return plugin(({ addBase, addUtilities }) => {\n const css = mapKeys(utilities, (name) => `${VAR_PREFIX}${name}`)\n if (selectorOrMediaQuery.startsWith('@media')) {\n addBase({\n [selectorOrMediaQuery]: {\n ':root': css,\n },\n })\n } else {\n addBase({\n [selectorOrMediaQuery]: css,\n })\n }\n\n addUtilities(classRules, {\n // @ts-expect-error FIXME\n variants: ['responsive'],\n })\n })\n}\n\nconst DIRECTIONS = {\n 'to top': 'top',\n 'to bottom': 'bottom',\n 'to left': 'left',\n 'to right': 'right',\n} as const\n\n/**\n * こういう感じのやつ。この時点では `--tailwind-gradient-` のような CSS 変数名になってない\n *\n * ```js\n * {\n * 'hoge1': 'linear-gradient(to top, ...)',\n * ...\n * }\n * ```\n */\ntype Utilities = Record<string, LinearGradient>\n\ntype LinearGradient = `linear-gradient(${string})`\n\nexport function getUtilities(\n gradients: Record<string, GradientMaterial>,\n effect: MergedEffect,\n): Utilities {\n const effects = Object.entries(effect)\n const directions = Object.entries(DIRECTIONS) as [\n GradientDirection,\n Values<typeof DIRECTIONS>,\n ][]\n\n return flatMapObject(gradients, (name, colors) =>\n directions.flatMap(([direction, className]) => {\n const toLinearGradient = (colors: GradientMaterial) => {\n const style = gradient(direction)(colors)\n\n if (!('backgroundImage' in style)) {\n throw new Error(\n `Could not generate linear-gradient() from ${name} ${direction} ${className}`,\n )\n }\n\n // 本当は backgroundColor も同時に生成されるんだけど、使うにはそれ用の CSS 変数も一緒に作らないといけない\n // とりあえず background-image だけで動くのでこっちだけを利用する\n return style.backgroundImage as LinearGradient\n }\n\n return [\n // こういう感じのやつ\n // { 'hoge1': 'linear-gradient(to top, ...)' }\n [createUtilityName(name, className), toLinearGradient(colors)],\n\n // こういう感じのやつ\n // { 'hoge1--hover': 'linear-gradient(to top, ...)' }\n ...effects.map<[string, LinearGradient]>(([effectName, effect]) => [\n createUtilityName(name, className, effectName),\n toLinearGradient(applyEffectToGradient(effect)(colors)),\n ]),\n ]\n }),\n )\n}\n\nfunction createUtilityName(\n gradientName: string,\n direction: Values<typeof DIRECTIONS>,\n suffix = '',\n) {\n return [camelToKebab(gradientName), direction, suffix]\n .filter(Boolean)\n .join('-')\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport { TypographyDescriptor, TYPOGRAPHY_SIZE } from '@charcoal-ui/foundation'\nimport { halfLeading, mapObject, px } from '@charcoal-ui/utils'\n\nconst leadingCancel = {\n display: 'block',\n width: 0,\n height: 0,\n content: '\"\"',\n}\n\nconst typographyStyle = (style: TypographyDescriptor) => {\n const margin = -halfLeading(style)\n\n return {\n 'font-size': px(style.fontSize),\n 'line-height': px(style.lineHeight),\n\n /**\n * cancel leading\n *\n * @see https://yuyakinoshita.com/blog/2020/01/20/line-height-crop/\n */\n '&::before': {\n ...leadingCancel,\n marginTop: px(margin),\n },\n '&::after': {\n ...leadingCancel,\n marginBottom: px(margin),\n },\n }\n}\n\nconst typographyPlugin = plugin(({ addUtilities }) => {\n const typographyClasses = mapObject(TYPOGRAPHY_SIZE, (fontSize, style) => [\n `.typography-${fontSize}`,\n typographyStyle(style),\n ])\n\n addUtilities(\n {\n ...typographyClasses,\n '.preserve-half-leading': {\n '&::before': {\n content: 'none',\n },\n '&::after': {\n content: 'none',\n },\n },\n },\n {\n // @ts-expect-error FIXME\n variants: ['responsive'],\n },\n )\n})\n\nexport default typographyPlugin\n","import light from '@charcoal-ui/theme/unstable-tokens/css-variables.json' with { type: 'json' }\nimport type { Config } from 'tailwindcss'\nimport {\n flattenKey as flattenKeys,\n flattenKeyWithoutDefault,\n mapDefaultKey as mapDefaultKeys,\n} from './util'\n\nexport function unstable_createTailwindConfigTokenV2(): Omit<\n Config,\n 'content'\n> {\n const fontSize = Object.fromEntries(\n Object.entries(light.text['font-size']).flatMap(([k, v]) => {\n // text.fontSize.paragraph + text.lineHeight.paragraph -> text-paragraph\n if (typeof v === 'string') {\n return [\n [\n k,\n [\n v,\n // @ts-expect-error k is keyof line-height\n { lineHeight: light.text['line-height'][k] },\n ],\n ],\n ]\n }\n\n // text.fontSize.heading.s + text.lineHeight.heading.s -> text-heading-s\n return Object.entries(v as Record<string, string>).map(([kk, vv]) => {\n return [\n [k, kk].join('-'),\n [\n vv,\n // @ts-expect-error k is keyof line-height\n { lineHeight: light.text['line-height'][k][kk] },\n ],\n ]\n })\n }),\n ) as NonNullable<Config['theme']>['fontSize']\n\n // space.target.s -> p-target-s\n // space.gap.gapButtons -> p-gap-buttons\n const spacing = flattenKeys(light.space, (key) => !/(gap|padding)/.test(key))\n // color.container.default -> bg-container\n // color.container.hover -> bg-container-hover\n const colors = mapDefaultKeys(light.color)\n\n const config: Omit<Config, 'content'> = {\n darkMode: 'media',\n theme: {\n // borderWidth.m -> border-m\n // borderWidth.focus.1 -> border-focus-1\n borderWidth: flattenKeyWithoutDefault({\n 'width-ch': flattenKeys(light['border-width']), // unstable border width token\n }),\n borderRadius: light.radius,\n borderColor: flattenKeyWithoutDefault({ ch: flattenKeys(colors.border) }),\n\n colors,\n\n fontSize,\n fontWeight: flattenKeys({ ch: light.text['font-weight'] }),\n\n spacing,\n gap: spacing,\n width: light['paragraph-width'],\n },\n }\n\n return config\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport iconsV2 from '@charcoal-ui/icon-files/v2/datauri'\nimport iconsV1 from '@charcoal-ui/icon-files/v1/datauri'\nimport { CSSRuleObject } from 'tailwindcss/types/config'\n\nconst transformClassNameV2 = (fileName: string) => {\n const [size, variant, name] = fileName.split('/')\n return [\n '.icon-v2',\n name.replaceAll('.', '-'),\n ...(variant === 'regular' ? [] : [variant]),\n ...(size === '24' ? [] : [size]),\n ]\n .join('-')\n .toLowerCase()\n}\n\nconst transformClassNameV1 = (fileName: string) => {\n const [size, name] = fileName.split('/')\n return [\n '.icon-v1',\n name.replaceAll('.', '-'),\n ...(size === '24' ? [] : [size]),\n ]\n .join('-')\n .toLowerCase()\n}\n\nexport const createIconUtilities = ({\n v2 = false,\n}: {\n v2?: boolean\n}): {\n [key: string]: CSSRuleObject\n} => {\n const newUtilities: { [key: string]: CSSRuleObject } = {}\n const icons = v2 ? iconsV2 : iconsV1\n for (const [fileName, { uri, isSetCurrentcolor }] of Object.entries(icons)) {\n const className = v2\n ? transformClassNameV2(fileName)\n : transformClassNameV1(fileName)\n\n newUtilities[className] = {\n display: 'inline-block',\n width: '1em',\n height: '1em',\n maskImage: `url(${uri})`,\n maskSize: '100% 100%',\n background: isSetCurrentcolor ? 'currentColor' : null,\n aspectRatio: '1/1',\n }\n }\n return newUtilities\n}\n\nexport const charcoalIconsV2: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createIconUtilities({ v2: true }))\n },\n)\n\nexport const charcoalIconsV1: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createIconUtilities({ v2: false }))\n },\n)\n","import { GRID_COUNT, mergeEffect } from './foundation'\n\nimport type { Config } from 'tailwindcss'\nimport { TailwindVersion, ThemeMap } from './types'\n\nimport {\n assertAllThemeHaveSameKeys,\n getDefaultKeyName,\n getVariantOption,\n} from './util'\nimport {\n COLUMN_UNIT,\n GUTTER_UNIT,\n SPACING,\n BORDER_RADIUS,\n} from '@charcoal-ui/foundation'\nimport { light } from '@charcoal-ui/theme'\nimport { mapObject, px } from '@charcoal-ui/utils'\nimport { colorsToTailwindConfig } from './colors/toTailwindConfig'\n\nimport cssVariableColorPlugin from './colors/plugin'\nimport cssVariableGradientPlugin from './gradient/plugin'\nimport typographyPlugin from './typography/plugin'\nimport { unstable_createTailwindConfigTokenV2 } from './tokenV2'\nimport { charcoalIconsV1, charcoalIconsV2 } from './icons'\nexport { unstable_createTailwindConfigTokenV2 }\n\ninterface Options {\n version?: TailwindVersion\n theme?: ThemeMap\n cssVariablesV1?: boolean\n unstableTokenV2?: boolean\n iconsV2?: boolean\n iconsV1?: boolean\n}\n\nexport function createTailwindConfig({\n theme = { ':root': light },\n version = 'v3',\n cssVariablesV1 = true,\n unstableTokenV2 = false,\n iconsV2 = false,\n iconsV1 = false,\n}: Options): Omit<Config, 'content'> {\n assertAllThemeHaveSameKeys(theme)\n\n const defaultTheme = theme[':root']\n const effects = mergeEffect(defaultTheme)\n const DEFAULT = getDefaultKeyName(version)\n\n const {\n borderWidth: borderWidthV2,\n borderRadius: borderRadiusV2,\n borderColor: borderColorV2,\n colors: colorsV2,\n fontSize: fontSizeV2,\n fontWeight: fontWeightV2,\n spacing: spacingV2,\n gap: gapV2,\n width: widthV2,\n }: Partial<NonNullable<Config['theme']>> = unstableTokenV2\n ? unstable_createTailwindConfigTokenV2().theme\n : {}\n\n return {\n theme: {\n screens: {\n screen1: px(0),\n screen2: px(defaultTheme.breakpoint.screen1),\n screen3: px(defaultTheme.breakpoint.screen2),\n screen4: px(defaultTheme.breakpoint.screen3),\n screen5: px(defaultTheme.breakpoint.screen4),\n },\n colors: {\n // @deprecated\n black: '#000',\n\n // @deprecated\n white: '#fff',\n\n transparent: 'transparent',\n current: 'currentColor',\n ...colorsToTailwindConfig(version, defaultTheme.color, effects),\n ...colorsV2,\n },\n borderColor: {\n ...colorsToTailwindConfig(\n version,\n mapObject(defaultTheme.border, (k, v) => [k, v.color]),\n effects,\n ),\n ...borderColorV2,\n },\n spacing: {\n ...mapObject(\n SPACING,\n (name, pixel) => [name, px(pixel)] as [string, string],\n ),\n ...spacingV2,\n },\n width: {\n full: '100%',\n screen: '100vw',\n auto: 'auto',\n fit: 'fit-content',\n\n /**\n * generates classes like \"w-col-span-1\"\n */\n ...Array.from({ length: GRID_COUNT }, (_, i) => i + 1).reduce(\n (styles, i) => ({\n ...styles,\n [`col-span-${i}`]: px(COLUMN_UNIT * i + GUTTER_UNIT * (i - 1)),\n }),\n {},\n ),\n\n /**\n * generates classes like \"w-1/12\" (except for 12/12, which just equals to w-full)\n */\n ...Array.from({ length: GRID_COUNT - 1 }, (_, i) => i + 1).reduce(\n (styles, i) => ({\n ...styles,\n [`${i}/${GRID_COUNT}`]: `${(i / GRID_COUNT) * 100}%`,\n }),\n {},\n ),\n ...widthV2,\n },\n gap: {\n fixed: px(GUTTER_UNIT),\n ...gapV2,\n },\n borderRadius: {\n ...mapObject(\n BORDER_RADIUS,\n (name, value) => [name, px(value)] as [string, string],\n ),\n ...borderRadiusV2,\n },\n transitionDuration: {\n [DEFAULT]: '0.2s',\n },\n ...(unstableTokenV2\n ? {\n extend: {\n borderWidth: borderWidthV2,\n fontWeight: fontWeightV2,\n fontSize: fontSizeV2,\n },\n }\n : {}),\n },\n\n ...getVariantOption(version),\n\n corePlugins: {\n lineHeight: false,\n },\n plugins: [\n typographyPlugin,\n cssVariableColorPlugin(theme, Boolean(cssVariablesV1)),\n\n ...Object.entries(theme).map(([selectorOrMediaQuery, theme]) =>\n cssVariableGradientPlugin(\n theme.gradientColor,\n mergeEffect(theme),\n selectorOrMediaQuery,\n ),\n ),\n ...(iconsV2 ? [charcoalIconsV2] : []),\n ...(iconsV1 ? [charcoalIconsV1] : []),\n ],\n }\n}\n\nexport const config: Omit<Config, 'content'> = createTailwindConfig({})\n\nexport default config\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["cssVariableColorPlugin","light","flattenKeys","mapDefaultKeys","cssVariableColorPlugin","cssVariableGradientPlugin"],"sources":["../src/foundation.ts","../src/util.ts","../src/colors/utils.ts","../src/colors/toTailwindConfig.ts","../src/colors/pluginTokenV1.ts","../src/colors/plugin.ts","../src/focusring/index.ts","../src/gradient/plugin.ts","../src/typography/plugin.ts","../src/tokenV2.ts","../src/icons.ts","../src/index.ts"],"sourcesContent":["import { Effect } from '@charcoal-ui/foundation'\nimport { CharcoalTheme as Theme } from '@charcoal-ui/theme'\n\nexport const GRID_COUNT = 12\n\nexport function mergeEffect({\n elementEffect,\n effect,\n}: Pick<Theme, 'elementEffect' | 'effect'>): MergedEffect {\n return {\n ...elementEffect,\n ...effect,\n outline: {\n type: 'opacity',\n opacity: 0.32,\n } as Effect,\n }\n}\n\nexport type MergedEffect = Record<string, Effect>\n","import type { Config } from 'tailwindcss'\nimport { TailwindVersion, ThemeMap } from './types'\n\n/**\n * the key \"default\" or \"DEFAULT\" has special meaning and dropped from class name\n *\n * @see https://tailwindcss.com/docs/upgrading-to-v2#update-default-theme-keys-to-default\n */\nexport function getDefaultKeyName(version: TailwindVersion) {\n switch (version) {\n case 'v3':\n case 'v2': {\n return 'DEFAULT'\n }\n\n case 'v1': {\n return 'default'\n }\n }\n}\n\nexport function getVariantOption(version: TailwindVersion): Partial<Config> {\n switch (version) {\n case 'v3': {\n // v3 以上では variants は variantOrders に改名された\n // そしてこれは上書きをしたいモチベがない\n // https://v2.tailwindcss.com/docs/configuration#variant-order\n return {}\n }\n\n case 'v2':\n case 'v1': {\n return { variants: {} }\n }\n }\n}\n\nfunction setEquals<T>(a: Set<T>, b: Set<T>) {\n return a.size === b.size && Array.from(a).every((value) => b.has(value))\n}\n\nexport function assertAllThemeHaveSameKeys(themeMap: ThemeMap): void {\n const defaultTheme = themeMap[':root']\n const expectedColorKeys = new Set(Object.keys(defaultTheme.color))\n const expectedEffectKeys = new Set(Object.keys(defaultTheme.effect))\n\n for (const [name, theme] of Object.entries(themeMap)) {\n const colorKeys = new Set(Object.keys(theme.color))\n const effectKeys = new Set(Object.keys(theme.effect))\n\n if (!setEquals(colorKeys, expectedColorKeys)) {\n throw new Error(`:root and ${name} does not have same colors.\n\nExpected( :root ): ${JSON.stringify(Array.from(expectedColorKeys))}\nGot: ${JSON.stringify(Array.from(colorKeys))}`)\n }\n\n if (!setEquals(effectKeys, expectedEffectKeys)) {\n throw new Error(`:root and ${name} does not have same effects.\n\nExpected( :root ): ${JSON.stringify(Array.from(expectedEffectKeys))}\nGot: ${JSON.stringify(Array.from(effectKeys))}`)\n }\n }\n}\n\nexport function camelToKebab(value: string) {\n return value\n .replace(/(?<small>[\\da-z]|(?=[A-Z]))(?<capital>[A-Z])/gu, '$1-$2')\n .toLowerCase()\n}\n\nexport const mapDefaultKey = <O extends object>(o: O) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return JSON.parse(JSON.stringify(o), function reviver(k: string, v: string) {\n if (k === 'default') {\n const DefaultKey = getDefaultKeyName('v3')\n this[DefaultKey] = v\n return undefined\n }\n return v\n })\n}\n\nexport const flattenKey = <O extends object>(\n o: O,\n join?: (key: string) => boolean,\n): Record<string, unknown> => {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n Object.entries(o).flatMap(([key, v]) => {\n if (typeof v === 'string') return [[key, v]]\n return Object.entries(v as object).map(([kk, vv]) => {\n return [(join?.(key) ?? true) ? [key, kk].join('-') : kk, vv]\n })\n }),\n )\n}\n\n/**\n * `DEFAULT` はkey名に結合しない\n */\nexport const flattenKeyWithoutDefault = <O extends object>(\n o: O,\n join?: (key: string) => boolean,\n): Record<string, unknown> => {\n return Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n Object.entries(o).flatMap(([key, v]) => {\n if (typeof v === 'string') return [[key, v]]\n return Object.entries(v as object).map(([kk, vv]) => {\n const isDefaultKey = kk === 'DEFAULT' || kk === 'default'\n const outputKey = isDefaultKey\n ? key\n : (join?.(key) ?? true)\n ? [key, kk].join('-')\n : kk\n return [outputKey, vv]\n })\n }),\n )\n}\n","import { GradientMaterial, Material } from '@charcoal-ui/foundation'\n\nexport const COLOR_PREFIX = '--tailwind-color-'\n\nexport function isSingleColor(color: AnyColor): color is Material {\n return typeof color === 'string'\n}\n\ntype AnyColor = Material | GradientMaterial\n\nexport type AnyColorTheme = Record<string, AnyColor>\n","import { Material } from '@charcoal-ui/foundation'\nimport { applyEffect, filterObject, mapObject } from '@charcoal-ui/utils'\nimport type { Config } from 'tailwindcss'\nimport { MergedEffect } from '../foundation'\n\nimport { TailwindVersion } from '../types'\nimport { getDefaultKeyName } from '../util'\n\nimport { AnyColorTheme, COLOR_PREFIX, isSingleColor } from './utils'\n\nexport function colorsToTailwindConfig(\n version: TailwindVersion,\n colors: AnyColorTheme,\n effects: MergedEffect,\n): NonNullable<Config['theme']>['colors'] {\n const targetColors = filterObject(colors, isSingleColor)\n const DEFAULT = getDefaultKeyName(version)\n\n /**\n * こういう感じのを吐き出す\n *\n * ```js\n * {\n * DEFAULT: 'var(--tailwind-color-hoge1, #fff)',\n * hover: 'var(--tailwind-color-hoge1--hover, #eee)',\n * press: 'var(--tailwind-color-hoge1--press, #ddd)',\n * disabled: 'var(--tailwind-color-hoge1--disabled, #eee)',\n * }\n * ```\n */\n function colorsForAllEffects(name: string, color: Material) {\n const varName = `${COLOR_PREFIX}${name}`\n\n return {\n [DEFAULT]: `var(${varName}, ${color})`,\n\n ...mapObject(effects, (effectName, effect) => [\n effectName,\n `var(${varName}--${effectName}, ${applyEffect(color, effect)})`,\n ]),\n }\n }\n\n return mapObject(targetColors, (name, color) => [\n name,\n colorsForAllEffects(name, color),\n ])\n}\n","import {\n applyEffect,\n customPropertyToken,\n filterObject,\n flatMapObject,\n mapObject,\n} from '@charcoal-ui/utils'\nimport { ThemeMap } from '../types'\nimport {\n CharcoalAbstractTheme,\n EffectType,\n Key,\n CharcoalTheme as Theme,\n} from '@charcoal-ui/theme'\n\nexport function defineCssVariablesV1(themeMap: ThemeMap) {\n // @ts-expect-error FIXME\n return mapObject(themeMap, (key, theme) => {\n if (key.startsWith('@media')) {\n return [\n key,\n {\n ':root': defineColorVariableCSS(theme),\n },\n ]\n } else {\n return [key, defineColorVariableCSS(theme)]\n }\n })\n}\n\nexport const defineColorVariableCSS = (theme: Theme) => {\n const borders = mapObject(theme.border, (name, { color }) => [\n // REVIEW: もしtheme.colorにたまたまborder-〇〇で始まる色名がいたら被りうる\n withPrefixes('border', name),\n color,\n ])\n\n const colors = defineThemeVariables({ ...theme.color, ...borders })({ theme })\n return colors\n}\n\n/**\n * Check whether a value is non-null and non-undefined\n *\n * @param value nullable\n */\nexport const isPresent = <T>(value: T): value is NonNullable<T> => value != null\n\n/**\n * 子孫要素で使われるカラーテーマの CSS Variables を上書きする\n *\n * @params colorParams - 上書きしたい色の定義( `theme.color` の一部だけ書けば良い )\n * @params effectParams - effect の定義を上書きしたい場合は渡す(必須ではない)\n *\n * @example\n * ```tsx\n * const LocalTheme = styled.div`\n * ${defineThemeVariables({ text1: '#ff0000' })}\n * // `text1` is now defined as red\n * ${theme((o) => [o.font.text1])}\n * `\n * ```\n */\nexport function defineThemeVariables(\n colorParams: Partial<CharcoalAbstractTheme['color']>,\n effectParams?: Partial<CharcoalAbstractTheme['effect']>,\n) {\n return function toCssObject(props: {\n theme: Pick<CharcoalAbstractTheme, 'effect'>\n }) {\n const colors = filterObject(colorParams, isPresent)\n\n // flatMapObject の中で毎回 Object.entries を呼ぶのは無駄なので外で呼ぶ\n const effects = Object.entries({\n ...props.theme.effect,\n ...effectParams,\n })\n\n return flatMapObject(colors, (colorKey, color) => [\n [customPropertyToken(colorKey), color],\n\n ...effects.map<[string, string]>(([effectKey, effect]) => [\n customPropertyToken(colorKey, [effectKey]),\n applyEffect(color, [effect]),\n ]),\n ])\n }\n}\n\nexport function isSupportedEffect(effect: Key): effect is EffectType {\n return ['hover', 'press', 'disabled'].includes(effect as string)\n}\n\nexport const variable = (value: string) => `var(${value})`\n\nexport function withPrefixes(...parts: string[]) {\n return parts.join('-')\n}\n","import { Material } from '@charcoal-ui/foundation'\nimport { CharcoalTheme as Theme } from '@charcoal-ui/theme'\nimport {\n applyEffect,\n filterObject,\n flatMapObject,\n mapObject,\n} from '@charcoal-ui/utils'\nimport plugin from 'tailwindcss/plugin.js'\nimport { mergeEffect } from '../foundation'\nimport { CSSVariableName, CSSVariables, Definition, ThemeMap } from '../types'\nimport { COLOR_PREFIX, isSingleColor } from './utils'\nimport { defineCssVariablesV1 } from './pluginTokenV1'\n\n/**\n * --tailwind-* また --charcoal-* を生成する\n * TODO: --tailwindをやめる\n */\nexport default function cssVariableColorPlugin(\n themeMap: ThemeMap,\n cssVariablesV1: boolean,\n): ReturnType<typeof plugin> {\n // `:root` 以外のケースで各 CSS Variable がどういう値を取るかを定義する\n const { ':root': _defaultTheme, ...otherThemes } = themeMap\n const definitions = defineCssVariables(otherThemes)\n\n return plugin(({ addBase }) => {\n addBase(definitions)\n\n // styledのTokenInjector移植(background処理除く)\n if (cssVariablesV1) {\n const cssVariablesV1 = defineCssVariablesV1(themeMap)\n // @ts-expect-error FIXME\n addBase(cssVariablesV1)\n }\n })\n}\n\nexport function defineCssVariables(themes: Omit<ThemeMap, ':root'>) {\n return mapObject(themes, (selectorOrMediaQuery, theme) => {\n const css = toCssVariables(theme)\n\n if (selectorOrMediaQuery.startsWith('@media')) {\n return [\n selectorOrMediaQuery,\n {\n ':root': css,\n },\n ]\n } else {\n return [selectorOrMediaQuery, css]\n }\n }) as Definition\n}\n\nfunction toCssVariables(theme: Theme): CSSVariables {\n const colors = filterObject(theme.color, isSingleColor)\n const effects = Object.entries(mergeEffect(theme))\n\n return flatMapObject(colors, (name, color) => {\n const varName: keyof CSSVariables = `${COLOR_PREFIX}${name}`\n\n return [\n [varName, color],\n\n ...effects.map<[CSSVariableName, Material]>(([type, effect]) => [\n `${varName}--${type}`,\n applyEffect(color, effect),\n ]),\n ]\n })\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport { CSSRuleObject } from 'tailwindcss/types/config'\n\nexport const createFocusRingUtilities = (): {\n [key: string]: CSSRuleObject\n} => ({\n '.ch-focus-ring': {\n \"&:not(:disabled):not([aria-disabled]):focus-visible, &[aria-disabled='false']:focus-visible\":\n {\n outline: 'none',\n boxShadow:\n '0 0 0 4px var(--charcoal-color-border-focus-legacy, rgba(0, 150, 250, 0.32))',\n transition: '0.2s box-shadow',\n },\n },\n})\n\nexport const charcoalFocusRing: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createFocusRingUtilities())\n },\n)\n","import plugin from 'tailwindcss/plugin.js'\nimport { camelToKebab } from '../util'\nimport { GradientMaterial } from '@charcoal-ui/foundation'\nimport { ThemeColorGradient } from '@charcoal-ui/theme'\nimport {\n applyEffectToGradient,\n flatMapObject,\n gradient,\n GradientDirection,\n mapKeys,\n mapObject,\n} from '@charcoal-ui/utils'\nimport { Values } from '../types'\nimport { MergedEffect } from '../foundation'\n\nconst VAR_PREFIX = '--tailwind-gradient-'\n\nexport default function cssVariableColorPlugin(\n gradients: ThemeColorGradient,\n effects: MergedEffect,\n selectorOrMediaQuery: string,\n) {\n const utilities = getUtilities(gradients, effects)\n\n const classRules = mapObject(utilities, (name) => [\n `.bg-${name}`,\n { backgroundImage: `var(${VAR_PREFIX}${name})` },\n ])\n\n return plugin(({ addBase, addUtilities }) => {\n const css = mapKeys(utilities, (name) => `${VAR_PREFIX}${name}`)\n if (selectorOrMediaQuery.startsWith('@media')) {\n addBase({\n [selectorOrMediaQuery]: {\n ':root': css,\n },\n })\n } else {\n addBase({\n [selectorOrMediaQuery]: css,\n })\n }\n\n addUtilities(classRules, {\n // @ts-expect-error FIXME\n variants: ['responsive'],\n })\n })\n}\n\nconst DIRECTIONS = {\n 'to top': 'top',\n 'to bottom': 'bottom',\n 'to left': 'left',\n 'to right': 'right',\n} as const\n\n/**\n * こういう感じのやつ。この時点では `--tailwind-gradient-` のような CSS 変数名になってない\n *\n * ```js\n * {\n * 'hoge1': 'linear-gradient(to top, ...)',\n * ...\n * }\n * ```\n */\ntype Utilities = Record<string, LinearGradient>\n\ntype LinearGradient = `linear-gradient(${string})`\n\nexport function getUtilities(\n gradients: Record<string, GradientMaterial>,\n effect: MergedEffect,\n): Utilities {\n const effects = Object.entries(effect)\n const directions = Object.entries(DIRECTIONS) as [\n GradientDirection,\n Values<typeof DIRECTIONS>,\n ][]\n\n return flatMapObject(gradients, (name, colors) =>\n directions.flatMap(([direction, className]) => {\n const toLinearGradient = (colors: GradientMaterial) => {\n const style = gradient(direction)(colors)\n\n if (!('backgroundImage' in style)) {\n throw new Error(\n `Could not generate linear-gradient() from ${name} ${direction} ${className}`,\n )\n }\n\n // 本当は backgroundColor も同時に生成されるんだけど、使うにはそれ用の CSS 変数も一緒に作らないといけない\n // とりあえず background-image だけで動くのでこっちだけを利用する\n return style.backgroundImage as LinearGradient\n }\n\n return [\n // こういう感じのやつ\n // { 'hoge1': 'linear-gradient(to top, ...)' }\n [createUtilityName(name, className), toLinearGradient(colors)],\n\n // こういう感じのやつ\n // { 'hoge1--hover': 'linear-gradient(to top, ...)' }\n ...effects.map<[string, LinearGradient]>(([effectName, effect]) => [\n createUtilityName(name, className, effectName),\n toLinearGradient(applyEffectToGradient(effect)(colors)),\n ]),\n ]\n }),\n )\n}\n\nfunction createUtilityName(\n gradientName: string,\n direction: Values<typeof DIRECTIONS>,\n suffix = '',\n) {\n return [camelToKebab(gradientName), direction, suffix]\n .filter(Boolean)\n .join('-')\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport { TypographyDescriptor, TYPOGRAPHY_SIZE } from '@charcoal-ui/foundation'\nimport { halfLeading, mapObject, px } from '@charcoal-ui/utils'\n\nconst leadingCancel = {\n display: 'block',\n width: 0,\n height: 0,\n content: '\"\"',\n}\n\nconst typographyStyle = (style: TypographyDescriptor) => {\n const margin = -halfLeading(style)\n\n return {\n 'font-size': px(style.fontSize),\n 'line-height': px(style.lineHeight),\n\n /**\n * cancel leading\n *\n * @see https://yuyakinoshita.com/blog/2020/01/20/line-height-crop/\n */\n '&::before': {\n ...leadingCancel,\n marginTop: px(margin),\n },\n '&::after': {\n ...leadingCancel,\n marginBottom: px(margin),\n },\n }\n}\n\nconst typographyPlugin = plugin(({ addUtilities }) => {\n const typographyClasses = mapObject(TYPOGRAPHY_SIZE, (fontSize, style) => [\n `.typography-${fontSize}`,\n typographyStyle(style),\n ])\n\n addUtilities(\n {\n ...typographyClasses,\n '.preserve-half-leading': {\n '&::before': {\n content: 'none',\n },\n '&::after': {\n content: 'none',\n },\n },\n },\n {\n // @ts-expect-error FIXME\n variants: ['responsive'],\n },\n )\n})\n\nexport default typographyPlugin\n","import light from '@charcoal-ui/theme/unstable-tokens/css-variables.json' with { type: 'json' }\nimport type { Config } from 'tailwindcss'\nimport {\n flattenKey as flattenKeys,\n flattenKeyWithoutDefault,\n mapDefaultKey as mapDefaultKeys,\n} from './util'\n\nexport function unstable_createTailwindConfigTokenV2(): Omit<\n Config,\n 'content'\n> {\n const fontSize = Object.fromEntries(\n Object.entries(light.text['font-size']).flatMap(([k, v]) => {\n // text.fontSize.paragraph + text.lineHeight.paragraph -> text-paragraph\n if (typeof v === 'string') {\n return [\n [\n k,\n [\n v,\n // @ts-expect-error k is keyof line-height\n { lineHeight: light.text['line-height'][k] },\n ],\n ],\n ]\n }\n\n // text.fontSize.heading.s + text.lineHeight.heading.s -> text-heading-s\n return Object.entries(v as Record<string, string>).map(([kk, vv]) => {\n return [\n [k, kk].join('-'),\n [\n vv,\n // @ts-expect-error k is keyof line-height\n { lineHeight: light.text['line-height'][k][kk] },\n ],\n ]\n })\n }),\n ) as NonNullable<Config['theme']>['fontSize']\n\n // space.target.s -> p-target-s\n // space.gap.gapButtons -> p-gap-buttons\n const spacing = flattenKeys(light.space, (key) => !/(gap|padding)/.test(key))\n // color.container.default -> bg-container\n // color.container.hover -> bg-container-hover\n const colors = mapDefaultKeys(light.color)\n\n const config: Omit<Config, 'content'> = {\n darkMode: 'media',\n theme: {\n // borderWidth.m -> border-m\n // borderWidth.focus.1 -> border-focus-1\n borderWidth: flattenKeyWithoutDefault({\n 'width-ch': flattenKeys(light['border-width']), // unstable border width token\n }),\n borderRadius: light.radius,\n borderColor: flattenKeyWithoutDefault({ ch: flattenKeys(colors.border) }),\n\n colors,\n\n fontSize,\n fontWeight: flattenKeys({ ch: light.text['font-weight'] }),\n\n spacing,\n gap: spacing,\n width: light['paragraph-width'],\n },\n }\n\n return config\n}\n","import plugin from 'tailwindcss/plugin.js'\nimport iconsV2 from '@charcoal-ui/icon-files/v2/datauri'\nimport iconsV1 from '@charcoal-ui/icon-files/v1/datauri'\nimport { CSSRuleObject } from 'tailwindcss/types/config'\n\nconst transformClassNameV2 = (fileName: string) => {\n const [size, variant, name] = fileName.split('/')\n return [\n '.icon-v2',\n name.replaceAll('.', '-'),\n ...(variant === 'regular' ? [] : [variant]),\n ...(size === '24' ? [] : [size]),\n ]\n .join('-')\n .toLowerCase()\n}\n\nconst transformClassNameV1 = (fileName: string) => {\n const [size, name] = fileName.split('/')\n return [\n '.icon-v1',\n name.replaceAll('.', '-'),\n ...(size === '24' ? [] : [size]),\n ]\n .join('-')\n .toLowerCase()\n}\n\nexport const createIconUtilities = ({\n v2 = false,\n}: {\n v2?: boolean\n}): {\n [key: string]: CSSRuleObject\n} => {\n const newUtilities: { [key: string]: CSSRuleObject } = {}\n const icons = v2 ? iconsV2 : iconsV1\n for (const [fileName, { uri, isSetCurrentcolor }] of Object.entries(icons)) {\n const className = v2\n ? transformClassNameV2(fileName)\n : transformClassNameV1(fileName)\n\n newUtilities[className] = {\n display: 'inline-block',\n width: '1em',\n height: '1em',\n maskImage: `url(${uri})`,\n maskSize: '100% 100%',\n background: isSetCurrentcolor ? 'currentColor' : null,\n aspectRatio: '1/1',\n }\n }\n return newUtilities\n}\n\nexport const charcoalIconsV2: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createIconUtilities({ v2: true }))\n },\n)\n\nexport const charcoalIconsV1: ReturnType<typeof plugin> = plugin(\n ({ addUtilities }) => {\n addUtilities(createIconUtilities({ v2: false }))\n },\n)\n","import { GRID_COUNT, mergeEffect } from './foundation'\n\nimport type { Config } from 'tailwindcss'\nimport { TailwindVersion, ThemeMap } from './types'\n\nimport {\n assertAllThemeHaveSameKeys,\n getDefaultKeyName,\n getVariantOption,\n} from './util'\nimport {\n COLUMN_UNIT,\n GUTTER_UNIT,\n SPACING,\n BORDER_RADIUS,\n} from '@charcoal-ui/foundation'\nimport { light } from '@charcoal-ui/theme'\nimport { mapObject, px } from '@charcoal-ui/utils'\nimport { colorsToTailwindConfig } from './colors/toTailwindConfig'\n\nimport cssVariableColorPlugin from './colors/plugin'\nimport { charcoalFocusRing } from './focusring'\nimport cssVariableGradientPlugin from './gradient/plugin'\nimport typographyPlugin from './typography/plugin'\nimport { unstable_createTailwindConfigTokenV2 } from './tokenV2'\nimport { charcoalIconsV1, charcoalIconsV2 } from './icons'\nexport { unstable_createTailwindConfigTokenV2 }\n\ninterface Options {\n version?: TailwindVersion\n theme?: ThemeMap\n cssVariablesV1?: boolean\n unstableTokenV2?: boolean\n iconsV2?: boolean\n iconsV1?: boolean\n}\n\nexport function createTailwindConfig({\n theme = { ':root': light },\n version = 'v3',\n cssVariablesV1 = true,\n unstableTokenV2 = false,\n iconsV2 = false,\n iconsV1 = false,\n}: Options): Omit<Config, 'content'> {\n assertAllThemeHaveSameKeys(theme)\n\n const defaultTheme = theme[':root']\n const effects = mergeEffect(defaultTheme)\n const DEFAULT = getDefaultKeyName(version)\n\n const {\n borderWidth: borderWidthV2,\n borderRadius: borderRadiusV2,\n borderColor: borderColorV2,\n colors: colorsV2,\n fontSize: fontSizeV2,\n fontWeight: fontWeightV2,\n spacing: spacingV2,\n gap: gapV2,\n width: widthV2,\n }: Partial<NonNullable<Config['theme']>> = unstableTokenV2\n ? unstable_createTailwindConfigTokenV2().theme\n : {}\n\n return {\n theme: {\n screens: {\n screen1: px(0),\n screen2: px(defaultTheme.breakpoint.screen1),\n screen3: px(defaultTheme.breakpoint.screen2),\n screen4: px(defaultTheme.breakpoint.screen3),\n screen5: px(defaultTheme.breakpoint.screen4),\n },\n colors: {\n // @deprecated\n black: '#000',\n\n // @deprecated\n white: '#fff',\n\n transparent: 'transparent',\n current: 'currentColor',\n ...colorsToTailwindConfig(version, defaultTheme.color, effects),\n ...colorsV2,\n },\n borderColor: {\n ...colorsToTailwindConfig(\n version,\n mapObject(defaultTheme.border, (k, v) => [k, v.color]),\n effects,\n ),\n ...borderColorV2,\n },\n spacing: {\n ...mapObject(\n SPACING,\n (name, pixel) => [name, px(pixel)] as [string, string],\n ),\n ...spacingV2,\n },\n width: {\n full: '100%',\n screen: '100vw',\n auto: 'auto',\n fit: 'fit-content',\n\n /**\n * generates classes like \"w-col-span-1\"\n */\n ...Array.from({ length: GRID_COUNT }, (_, i) => i + 1).reduce(\n (styles, i) => ({\n ...styles,\n [`col-span-${i}`]: px(COLUMN_UNIT * i + GUTTER_UNIT * (i - 1)),\n }),\n {},\n ),\n\n /**\n * generates classes like \"w-1/12\" (except for 12/12, which just equals to w-full)\n */\n ...Array.from({ length: GRID_COUNT - 1 }, (_, i) => i + 1).reduce(\n (styles, i) => ({\n ...styles,\n [`${i}/${GRID_COUNT}`]: `${(i / GRID_COUNT) * 100}%`,\n }),\n {},\n ),\n ...widthV2,\n },\n gap: {\n fixed: px(GUTTER_UNIT),\n ...gapV2,\n },\n borderRadius: {\n ...mapObject(\n BORDER_RADIUS,\n (name, value) => [name, px(value)] as [string, string],\n ),\n ...borderRadiusV2,\n },\n transitionDuration: {\n [DEFAULT]: '0.2s',\n },\n ...(unstableTokenV2\n ? {\n extend: {\n borderWidth: borderWidthV2,\n fontWeight: fontWeightV2,\n fontSize: fontSizeV2,\n },\n }\n : {}),\n },\n\n ...getVariantOption(version),\n\n corePlugins: {\n lineHeight: false,\n },\n plugins: [\n typographyPlugin,\n charcoalFocusRing,\n cssVariableColorPlugin(theme, Boolean(cssVariablesV1)),\n\n ...Object.entries(theme).map(([selectorOrMediaQuery, theme]) =>\n cssVariableGradientPlugin(\n theme.gradientColor,\n mergeEffect(theme),\n selectorOrMediaQuery,\n ),\n ),\n ...(iconsV2 ? [charcoalIconsV2] : []),\n ...(iconsV1 ? [charcoalIconsV1] : []),\n ],\n }\n}\n\nexport const config: Omit<Config, 'content'> = createTailwindConfig({})\n\nexport default config\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@charcoal-ui/tailwind-config",
3
- "version": "5.11.0-beta.1",
3
+ "version": "5.11.0-beta.3",
4
4
  "license": "Apache-2.0",
5
5
  "type": "commonjs",
6
6
  "main": "./dist/index.js",
@@ -26,10 +26,10 @@
26
26
  "tailwindcss": "^3.4.17"
27
27
  },
28
28
  "dependencies": {
29
- "@charcoal-ui/foundation": "5.11.0-beta.1",
30
- "@charcoal-ui/icon-files": "5.11.0-beta.1",
31
- "@charcoal-ui/theme": "5.11.0-beta.1",
32
- "@charcoal-ui/utils": "5.11.0-beta.1"
29
+ "@charcoal-ui/foundation": "5.11.0-beta.3",
30
+ "@charcoal-ui/theme": "5.11.0-beta.3",
31
+ "@charcoal-ui/icon-files": "5.11.0-beta.3",
32
+ "@charcoal-ui/utils": "5.11.0-beta.3"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "csstype": ">=3.0.0",
package/src/README.mdx CHANGED
@@ -76,3 +76,5 @@ module.exports = {
76
76
  ```
77
77
 
78
78
  テーマの調整などが必要な場合は[カスタマイズする](/docs/tailwind-config-custom--docs)のページを見てください。
79
+
80
+ 標準 plugin には `.ch-focus-ring` も含まれているため、フォーカス可能な要素に付けると React 版と同等の focus ring を適用できます。
@@ -137,12 +137,30 @@ exports[`createIconUtilities for icons v1 > createIconUtilities for icons v1 1`]
137
137
  "maskSize": "100% 100%",
138
138
  "width": "1em",
139
139
  },
140
+ ".icon-v1-arrowleft": {
141
+ "aspectRatio": "1/1",
142
+ "background": "currentColor",
143
+ "display": "inline-block",
144
+ "height": "1em",
145
+ "maskImage": "url(data:image/svg+xml;utf8,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M4%2012l6.707-6.707a1%201%200%20111.414%201.414L7.828%2011H19a1%201%200%20110%202H7.828l4.293%204.293a1%201%200%2001-1.414%201.414L4%2012z%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E)",
146
+ "maskSize": "100% 100%",
147
+ "width": "1em",
148
+ },
149
+ ".icon-v1-arrowright": {
150
+ "aspectRatio": "1/1",
151
+ "background": "currentColor",
152
+ "display": "inline-block",
153
+ "height": "1em",
154
+ "maskImage": "url(data:image/svg+xml;utf8,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M20.004%2012l-6.707%206.707a1%201%200%2001-1.414-1.414L16.176%2013H5a1%201%200%20110-2h11.176l-4.293-4.293a1%201%200%20011.414-1.414L20.004%2012z%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E)",
155
+ "maskSize": "100% 100%",
156
+ "width": "1em",
157
+ },
140
158
  ".icon-v1-arrowup": {
141
159
  "aspectRatio": "1/1",
142
160
  "background": "currentColor",
143
161
  "display": "inline-block",
144
162
  "height": "1em",
145
- "maskImage": "url(data:image/svg+xml;utf8,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M12%204.586l6.707%206.707a1%201%200%2001-1.414%201.414L13%208.414V19a1%201%200%2011-2%200V8.414l-4.293%204.293a1%201%200%2011-1.414-1.414L12%204.586z%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E)",
163
+ "maskImage": "url(data:image/svg+xml;utf8,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M12%204.586l6.707%206.707a1%201%200%2001-1.414%201.414L13%208.414V19a1%201%200%2011-2%200V8.414l-4.293%204.293a1%201%200%2001-1.414-1.414L12%204.586z%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E)",
146
164
  "maskSize": "100% 100%",
147
165
  "width": "1em",
148
166
  },
@@ -947,6 +965,15 @@ exports[`createIconUtilities for icons v1 > createIconUtilities for icons v1 1`]
947
965
  "maskSize": "100% 100%",
948
966
  "width": "1em",
949
967
  },
968
+ ".icon-v1-formattext": {
969
+ "aspectRatio": "1/1",
970
+ "background": "currentColor",
971
+ "display": "inline-block",
972
+ "height": "1em",
973
+ "maskImage": "url(data:image/svg+xml;utf8,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M18%204a1%201%200%20110%202h-5v12.934c0%20.589-.448%201.066-1%201.066s-1-.477-1-1.066V6H6a1%201%200%20010-2h12z%22%20fill%3D%22currentColor%22%2F%3E%3C%2Fsvg%3E)",
974
+ "maskSize": "100% 100%",
975
+ "width": "1em",
976
+ },
950
977
  ".icon-v1-fov": {
951
978
  "aspectRatio": "1/1",
952
979
  "background": "currentColor",
@@ -147439,6 +147466,8 @@ exports[`createTailwindConfigIconsV1 > list of classes 1`] = `
147439
147466
  "icon-v1-ar",
147440
147467
  "icon-v1-archive",
147441
147468
  "icon-v1-arrowdown",
147469
+ "icon-v1-arrowleft",
147470
+ "icon-v1-arrowright",
147442
147471
  "icon-v1-arrowup",
147443
147472
  "icon-v1-binet",
147444
147473
  "icon-v1-body",
@@ -147497,6 +147526,7 @@ exports[`createTailwindConfigIconsV1 > list of classes 1`] = `
147497
147526
  "icon-v1-formatfontsize",
147498
147527
  "icon-v1-formatletterspacing",
147499
147528
  "icon-v1-formatlinespacing",
147529
+ "icon-v1-formattext",
147500
147530
  "icon-v1-fov",
147501
147531
  "icon-v1-frameeffect",
147502
147532
  "icon-v1-framesize",
@@ -22,6 +22,10 @@ exports[`tailwind.config.js > defaultConfig 1`] = `
22
22
  "config": undefined,
23
23
  "handler": [Function],
24
24
  },
25
+ {
26
+ "config": undefined,
27
+ "handler": [Function],
28
+ },
25
29
  ],
26
30
  "theme": {
27
31
  "borderColor": {
@@ -5717,6 +5721,7 @@ exports[`tailwind.config.js > list of classes 1`] = `
5717
5721
  "typography-20",
5718
5722
  "typography-32",
5719
5723
  "preserve-half-leading",
5724
+ "ch-focus-ring",
5720
5725
  "bg-call-to-action-top",
5721
5726
  "bg-call-to-action-top-disabled",
5722
5727
  "bg-call-to-action-top-hover",
@@ -0,0 +1,45 @@
1
+ import type { CSSProperties } from 'react'
2
+
3
+ const itemStyle = {
4
+ backgroundColor: 'var(--charcoal-color-background3, #f5f5f5)',
5
+ borderRadius: 8,
6
+ color: 'var(--charcoal-color-text2, #4f4f4f)',
7
+ padding: '16px 24px',
8
+ } satisfies CSSProperties
9
+
10
+ export const FocusRing: React.FC = () => {
11
+ return (
12
+ <div className="flex flex-col gap-24 p-24 bg-background1">
13
+ <div>
14
+ <p className="typography-14 text-text2 mb-8">通常のフォーカス要素</p>
15
+ <div className="ch-focus-ring" style={itemStyle} tabIndex={0}>
16
+ Focus me
17
+ </div>
18
+ </div>
19
+
20
+ <div>
21
+ <p className="typography-14 text-text2 mb-8">{`aria-disabled="false"`}</p>
22
+ <div
23
+ aria-disabled="false"
24
+ className="ch-focus-ring"
25
+ style={itemStyle}
26
+ tabIndex={0}
27
+ >
28
+ Focus me
29
+ </div>
30
+ </div>
31
+
32
+ <div>
33
+ <p className="typography-14 text-text2 mb-8">{`aria-disabled="true"`}</p>
34
+ <div
35
+ aria-disabled="true"
36
+ className="ch-focus-ring"
37
+ style={itemStyle}
38
+ tabIndex={0}
39
+ >
40
+ No ring
41
+ </div>
42
+ </div>
43
+ </div>
44
+ )
45
+ }
@@ -0,0 +1,13 @@
1
+ import { Meta, Story } from '@storybook/addon-docs/blocks'
2
+ import { Unstyled } from '@storybook/addon-docs/blocks'
3
+ import { FocusRing } from '.'
4
+
5
+ <Meta title="tailwind-config/FocusRing" component={[FocusRing]} />
6
+
7
+ # FocusRing
8
+
9
+ <br />
10
+
11
+ <Unstyled>
12
+ <FocusRing />
13
+ </Unstyled>
@@ -0,0 +1 @@
1
+ export { FocusRing } from './FocusRing'
@@ -0,0 +1,22 @@
1
+ import plugin from 'tailwindcss/plugin.js'
2
+ import { CSSRuleObject } from 'tailwindcss/types/config'
3
+
4
+ export const createFocusRingUtilities = (): {
5
+ [key: string]: CSSRuleObject
6
+ } => ({
7
+ '.ch-focus-ring': {
8
+ "&:not(:disabled):not([aria-disabled]):focus-visible, &[aria-disabled='false']:focus-visible":
9
+ {
10
+ outline: 'none',
11
+ boxShadow:
12
+ '0 0 0 4px var(--charcoal-color-border-focus-legacy, rgba(0, 150, 250, 0.32))',
13
+ transition: '0.2s box-shadow',
14
+ },
15
+ },
16
+ })
17
+
18
+ export const charcoalFocusRing: ReturnType<typeof plugin> = plugin(
19
+ ({ addUtilities }) => {
20
+ addUtilities(createFocusRingUtilities())
21
+ },
22
+ )
package/src/index.test.ts CHANGED
@@ -55,6 +55,19 @@ describe('tailwind.config.js', () => {
55
55
  expect(styles).toContainEqual(expect.stringContaining('::after'))
56
56
  })
57
57
 
58
+ test('focus ring plugin', () => {
59
+ const styles = result.getStylesByClassName('ch-focus-ring')
60
+ const css = styles?.join('\n') ?? ''
61
+
62
+ expect(styles).toBeDefined()
63
+ expect(css).toContain(':focus-visible')
64
+ expect(css).toContain('outline: none')
65
+ expect(css).toContain(
66
+ 'box-shadow: 0 0 0 4px var(--charcoal-color-border-focus-legacy, rgba(0, 150, 250, 0.32))',
67
+ )
68
+ expect(css).toContain('transition: 0.2s box-shadow')
69
+ })
70
+
58
71
  test('gradient plugin', () => {
59
72
  const varName = '--tailwind-gradient-surface5-left-hover'
60
73
 
package/src/index.ts CHANGED
@@ -19,6 +19,7 @@ import { mapObject, px } from '@charcoal-ui/utils'
19
19
  import { colorsToTailwindConfig } from './colors/toTailwindConfig'
20
20
 
21
21
  import cssVariableColorPlugin from './colors/plugin'
22
+ import { charcoalFocusRing } from './focusring'
22
23
  import cssVariableGradientPlugin from './gradient/plugin'
23
24
  import typographyPlugin from './typography/plugin'
24
25
  import { unstable_createTailwindConfigTokenV2 } from './tokenV2'
@@ -159,6 +160,7 @@ export function createTailwindConfig({
159
160
  },
160
161
  plugins: [
161
162
  typographyPlugin,
163
+ charcoalFocusRing,
162
164
  cssVariableColorPlugin(theme, Boolean(cssVariablesV1)),
163
165
 
164
166
  ...Object.entries(theme).map(([selectorOrMediaQuery, theme]) =>