@phcdevworks/spectre-ui 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/dist/components.css +165 -0
- package/dist/index.cjs +271 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -6
- package/dist/index.d.ts +31 -6
- package/dist/index.js +270 -34
- package/dist/index.js.map +1 -1
- package/dist/utilities.css +7 -8
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/css-constants.ts","../src/tailwind/theme.ts","../src/tailwind/preset.ts","../src/recipes/button.ts","../src/recipes/card.ts","../src/recipes/input.ts"],"names":["theme","spectreTokens"],"mappings":"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","file":"index.cjs","sourcesContent":["export const spectreBaseStylesPath = \"@phcdevworks/spectre-ui/base.css\";\nexport const spectreComponentsStylesPath = \"@phcdevworks/spectre-ui/components.css\";\nexport const spectreUtilitiesStylesPath = \"@phcdevworks/spectre-ui/utilities.css\";\nexport const spectreIndexStylesPath = \"@phcdevworks/spectre-ui/index.css\";\n\nexport const spectreStyles = {\n index: spectreIndexStylesPath,\n base: spectreBaseStylesPath,\n components: spectreComponentsStylesPath,\n utilities: spectreUtilitiesStylesPath,\n};\n","import type { Config as TailwindConfig } from \"tailwindcss\";\nimport type { SpectreTokens } from \"../tokens\";\n\ntype TailwindTheme = NonNullable<TailwindConfig[\"theme\"]>;\n\nexport interface SpectreTailwindTheme {\n theme: TailwindTheme;\n}\n\nexport interface CreateSpectreTailwindThemeOptions {\n tokens: SpectreTokens;\n overrides?: Partial<SpectreTokens>;\n}\n\n/**\n * Minimal, type-safe theme mapper.\n * Important: theme is NEVER undefined (fixes exactOptionalPropertyTypes + DTS).\n */\nexport function createSpectreTailwindTheme(\n options: CreateSpectreTailwindThemeOptions\n): SpectreTailwindTheme {\n const mergedTokens = {\n ...(options.tokens ?? ({} as SpectreTokens)),\n ...(options.overrides ?? {}),\n } as SpectreTokens;\n\n // We keep mapping shallow + permissive because token shapes will evolve.\n // Tailwind accepts nested objects of strings for colors.\n const t: any = mergedTokens;\n\n const colors = (t.colors ?? t.color ?? t.palette ?? {}) as Record<string, any>;\n const spacing = (t.spacing ?? t.space ?? {}) as Record<string, any>;\n const borderRadius = (t.radii ?? t.radius ?? {}) as Record<string, any>;\n const boxShadow = (t.shadows ?? t.shadow ?? {}) as Record<string, any>;\n const fontFamily = (t.typography?.families ?? t.fonts ?? {}) as Record<string, any>;\n const fontSize = (t.typography?.scale ?? t.fontSize ?? {}) as Record<string, any>;\n\n const theme: TailwindTheme = {\n colors: colors as any,\n spacing: spacing as any,\n borderRadius: borderRadius as any,\n boxShadow: boxShadow as any,\n fontFamily: fontFamily as any,\n fontSize: fontSize as any,\n };\n\n return { theme };\n}\n","import type { Config as TailwindConfig } from \"tailwindcss\";\nimport { spectreTokens } from \"../tokens\";\nimport { createSpectreTailwindTheme } from \"./theme\";\n\nconst { theme } = createSpectreTailwindTheme({ tokens: spectreTokens });\n\nexport const spectrePreset: TailwindConfig = {\n content: [],\n theme, // theme is guaranteed non-undefined now\n};\n\nexport const spectreTailwindPreset: TailwindConfig = spectrePreset;\n","export type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\" | \"success\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonRecipeOptions {\n variant?: ButtonVariant;\n size?: ButtonSize;\n fullWidth?: boolean;\n loading?: boolean;\n disabled?: boolean;\n iconOnly?: boolean;\n}\n\nexport function getButtonClasses(opts: ButtonRecipeOptions = {}): string {\n const {\n variant = \"primary\",\n size = \"md\",\n fullWidth = false,\n loading = false,\n disabled = false,\n iconOnly = false,\n } = opts;\n\n const classes: string[] = [\"sp-btn\"];\n\n const variantMap: Record<ButtonVariant, string> = {\n primary: \"sp-btn--primary\",\n secondary: \"sp-btn--secondary\",\n ghost: \"sp-btn--ghost\",\n danger: \"sp-btn--danger\",\n success: \"sp-btn--success\",\n };\n classes.push(variantMap[variant]);\n\n const sizeMap: Record<ButtonSize, string> = {\n sm: \"sp-btn--sm\",\n md: \"sp-btn--md\",\n lg: \"sp-btn--lg\",\n };\n classes.push(sizeMap[size]);\n\n if (fullWidth) classes.push(\"sp-btn--full\");\n if (loading) classes.push(\"sp-btn--loading\");\n if (disabled) classes.push(\"sp-btn--disabled\");\n if (iconOnly) classes.push(\"sp-btn--icon\");\n\n return classes.join(\" \").trim();\n}\n","export type CardVariant = \"elevated\" | \"flat\" | \"outline\" | \"ghost\";\n\nexport interface CardRecipeOptions {\n variant?: CardVariant;\n interactive?: boolean; // hover/focus styles\n padded?: boolean; // apply default padding\n fullHeight?: boolean;\n}\n\nexport function getCardClasses(opts: CardRecipeOptions = {}): string {\n const {\n variant = \"elevated\",\n interactive = false,\n padded = false,\n fullHeight = false,\n } = opts;\n\n const classes: string[] = [\"sp-card\"];\n\n const variantMap: Record<CardVariant, string> = {\n elevated: \"sp-card--elevated\",\n flat: \"sp-card--flat\",\n outline: \"sp-card--outline\",\n ghost: \"sp-card--ghost\",\n };\n classes.push(variantMap[variant]);\n\n if (interactive) classes.push(\"sp-card--interactive\");\n if (padded) classes.push(\"sp-card--padded\");\n if (fullHeight) classes.push(\"sp-card--full\");\n\n return classes.join(\" \").trim();\n}\n","export type InputState = \"default\" | \"error\" | \"success\" | \"disabled\";\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface InputRecipeOptions {\n state?: InputState;\n size?: InputSize;\n fullWidth?: boolean;\n}\n\nexport function getInputClasses(opts: InputRecipeOptions = {}): string {\n const { state = \"default\", size = \"md\", fullWidth = false } = opts;\n\n const classes: string[] = [\"sp-input\"];\n\n const sizeMap: Record<InputSize, string> = {\n sm: \"sp-input--sm\",\n md: \"sp-input--md\",\n lg: \"sp-input--lg\",\n };\n classes.push(sizeMap[size]);\n\n // State\n if (state === \"error\") classes.push(\"sp-input--error\");\n if (state === \"success\") classes.push(\"sp-input--success\");\n if (state === \"disabled\") classes.push(\"sp-input--disabled\");\n\n if (fullWidth) classes.push(\"sp-input--full\");\n\n return classes.join(\" \").trim();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/css-constants.ts","../src/tailwind/theme.ts","../src/tailwind/preset.ts","../src/internal/cx.ts","../src/internal/resolve-option.ts","../src/recipes/button.ts","../src/recipes/card.ts","../src/recipes/input.ts","../src/recipes/badge.ts","../src/recipes/iconbox.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export const spectreBaseStylesPath = \"@phcdevworks/spectre-ui/base.css\";\nexport const spectreComponentsStylesPath = \"@phcdevworks/spectre-ui/components.css\";\nexport const spectreUtilitiesStylesPath = \"@phcdevworks/spectre-ui/utilities.css\";\nexport const spectreIndexStylesPath = \"@phcdevworks/spectre-ui/index.css\";\n\nexport const spectreStyles = {\n index: spectreIndexStylesPath,\n base: spectreBaseStylesPath,\n components: spectreComponentsStylesPath,\n utilities: spectreUtilitiesStylesPath,\n};\n","import type { Config as TailwindConfig } from \"tailwindcss\";\nimport type { SpectreTokens } from \"../tokens\";\n\ntype TailwindTheme = NonNullable<TailwindConfig[\"theme\"]>;\n\nexport interface SpectreTailwindTheme {\n theme: TailwindTheme;\n}\n\nexport interface CreateSpectreTailwindThemeOptions {\n tokens: SpectreTokens;\n overrides?: Partial<SpectreTokens>;\n}\n\n/**\n * Minimal, type-safe theme mapper.\n * Important: theme is NEVER undefined (fixes exactOptionalPropertyTypes + DTS).\n */\nexport function createSpectreTailwindTheme(\n options: CreateSpectreTailwindThemeOptions\n): SpectreTailwindTheme {\n const mergedTokens = {\n ...(options.tokens ?? ({} as SpectreTokens)),\n ...(options.overrides ?? {}),\n } as SpectreTokens;\n\n // We keep mapping shallow + permissive because token shapes will evolve.\n // Tailwind accepts nested objects of strings for colors.\n const t: any = mergedTokens;\n\n const colors = (t.colors ?? t.color ?? t.palette ?? {}) as Record<string, any>;\n const spacing = (t.spacing ?? t.space ?? {}) as Record<string, any>;\n const borderRadius = (t.radii ?? t.radius ?? {}) as Record<string, any>;\n const boxShadow = (t.shadows ?? t.shadow ?? {}) as Record<string, any>;\n const fontFamily = (t.typography?.families ?? t.fonts ?? {}) as Record<string, any>;\n const fontSize = (t.typography?.scale ?? t.fontSize ?? {}) as Record<string, any>;\n\n const theme: TailwindTheme = {\n colors: colors as any,\n spacing: spacing as any,\n borderRadius: borderRadius as any,\n boxShadow: boxShadow as any,\n fontFamily: fontFamily as any,\n fontSize: fontSize as any,\n };\n\n return { theme };\n}\n","import type { Config as TailwindConfig } from \"tailwindcss\";\nimport type { SpectreTokens } from \"../tokens\";\nimport { createSpectreTailwindTheme } from \"./theme\";\n\ntype TailwindTheme = NonNullable<TailwindConfig[\"theme\"]>;\n\nexport interface CreateSpectreTailwindPresetOptions {\n tokens?: SpectreTokens;\n themeOverrides?: TailwindTheme;\n presetOverrides?: TailwindConfig;\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n// Deep-merge plain objects only; arrays and primitives replace by override.\nconst deepMerge = <T extends Record<string, unknown>>(\n base: T,\n overrides?: Record<string, unknown>\n): T => {\n if (!overrides) return base;\n\n const result: Record<string, unknown> = { ...base };\n\n for (const [key, overrideValue] of Object.entries(overrides)) {\n const baseValue = result[key];\n if (isPlainObject(baseValue) && isPlainObject(overrideValue)) {\n result[key] = deepMerge(baseValue, overrideValue);\n } else {\n result[key] = overrideValue;\n }\n }\n\n return result as T;\n};\n\nlet cachedTokens: SpectreTokens | null = null;\n\nconst getRequire = (): ((id: string) => unknown) | null => {\n try {\n // eslint-disable-next-line no-new-func\n return Function(\"return typeof require !== 'undefined' ? require : null\")() as\n | ((id: string) => unknown)\n | null;\n } catch {\n return null;\n }\n};\n\nconst resolveTokens = (tokens?: SpectreTokens): SpectreTokens => {\n if (tokens) return tokens;\n if (cachedTokens) return cachedTokens;\n\n const req = getRequire();\n if (!req) {\n throw new Error(\n \"[spectre-ui] Unable to load spectre tokens; pass tokens to createSpectreTailwindPreset.\"\n );\n }\n\n const mod = req(\"../tokens\") as { spectreTokens: SpectreTokens };\n cachedTokens = mod.spectreTokens;\n return cachedTokens;\n};\n\nexport const createSpectreTailwindPreset = (\n options: CreateSpectreTailwindPresetOptions = {}\n): TailwindConfig => {\n const tokens = resolveTokens(options.tokens);\n const { theme } = createSpectreTailwindTheme({ tokens });\n const mergedTheme = deepMerge(\n theme as Record<string, unknown>,\n options.themeOverrides as Record<string, unknown> | undefined\n );\n\n const basePreset: TailwindConfig = {\n content: [],\n theme: mergedTheme, // theme is guaranteed non-undefined now\n };\n\n return deepMerge(\n basePreset as Record<string, unknown>,\n options.presetOverrides as Record<string, unknown> | undefined\n ) as TailwindConfig;\n};\n\nexport const spectrePreset: TailwindConfig = createSpectreTailwindPreset();\n\nexport const spectreTailwindPreset: TailwindConfig = spectrePreset;\n","export function cx(...parts: Array<string | false | null | undefined>): string {\n const seen = new Set<string>();\n const classes: string[] = [];\n\n for (const part of parts) {\n if (!part) continue;\n const trimmed = part.trim();\n if (!trimmed) continue;\n\n if (!/\\s/.test(trimmed)) {\n if (!seen.has(trimmed)) {\n seen.add(trimmed);\n classes.push(trimmed);\n }\n continue;\n }\n\n for (const token of trimmed.split(/\\s+/)) {\n if (!token || seen.has(token)) continue;\n seen.add(token);\n classes.push(token);\n }\n }\n\n return classes.join(\" \");\n}\n","type AllowedValues<T extends string> = readonly T[] | Record<T, unknown>;\n\nconst hasOwn = (value: object, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(value, key);\n\nconst isAllowedValue = <T extends string>(value: T, allowed: AllowedValues<T>): boolean =>\n Array.isArray(allowed) ? allowed.includes(value) : hasOwn(allowed, value);\n\nexport function resolveOption<T extends string>(config: {\n name: string;\n value: T | undefined;\n allowed: AllowedValues<T>;\n fallback: T;\n}): T {\n const { name, value, allowed, fallback } = config;\n\n if (value === undefined) return fallback;\n if (isAllowedValue(value, allowed)) return value;\n\n if (process.env.NODE_ENV !== \"production\") {\n throw new Error(`[spectre-ui] Unknown ${name}: ${value}`);\n }\n\n return fallback;\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst buttonVariants = [\"primary\", \"secondary\", \"ghost\", \"danger\", \"success\"] as const;\nconst buttonSizes = [\"sm\", \"md\", \"lg\"] as const;\n\nexport type ButtonVariant = (typeof buttonVariants)[number];\nexport type ButtonSize = (typeof buttonSizes)[number];\n\nconst BUTTON_VARIANTS = {\n primary: true,\n secondary: true,\n ghost: true,\n danger: true,\n success: true,\n} as const;\n\nconst BUTTON_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport interface ButtonRecipeOptions {\n variant?: ButtonVariant;\n size?: ButtonSize;\n fullWidth?: boolean;\n loading?: boolean;\n disabled?: boolean;\n iconOnly?: boolean;\n}\n\nexport function getButtonClasses(opts: ButtonRecipeOptions = {}): string {\n const {\n variant: variantInput,\n size: sizeInput,\n fullWidth = false,\n loading = false,\n disabled = false,\n iconOnly = false,\n } = opts;\n\n const variant = resolveOption({\n name: \"button variant\",\n value: variantInput,\n allowed: BUTTON_VARIANTS,\n fallback: \"primary\",\n });\n const size = resolveOption({\n name: \"button size\",\n value: sizeInput,\n allowed: BUTTON_SIZES,\n fallback: \"md\",\n });\n\n const variantMap: Record<ButtonVariant, string> = {\n primary: \"sp-btn--primary\",\n secondary: \"sp-btn--secondary\",\n ghost: \"sp-btn--ghost\",\n danger: \"sp-btn--danger\",\n success: \"sp-btn--success\",\n };\n const variantClass = variantMap[variant];\n\n const sizeMap: Record<ButtonSize, string> = {\n sm: \"sp-btn--sm\",\n md: \"sp-btn--md\",\n lg: \"sp-btn--lg\",\n };\n const sizeClass = sizeMap[size];\n\n return cx(\n \"sp-btn\",\n variantClass,\n sizeClass,\n fullWidth && \"sp-btn--full\",\n loading && \"sp-btn--loading\",\n disabled && \"sp-btn--disabled\",\n iconOnly && \"sp-btn--icon\",\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst cardVariants = [\"elevated\", \"flat\", \"outline\", \"ghost\"] as const;\n\nexport type CardVariant = (typeof cardVariants)[number];\n\nconst CARD_VARIANTS = {\n elevated: true,\n flat: true,\n outline: true,\n ghost: true,\n} as const;\n\nexport interface CardRecipeOptions {\n variant?: CardVariant;\n interactive?: boolean; // hover/focus styles\n padded?: boolean; // apply default padding\n fullHeight?: boolean;\n}\n\nexport function getCardClasses(opts: CardRecipeOptions = {}): string {\n const {\n variant: variantInput,\n interactive = false,\n padded = false,\n fullHeight = false,\n } = opts;\n\n const variant = resolveOption({\n name: \"card variant\",\n value: variantInput,\n allowed: CARD_VARIANTS,\n fallback: \"elevated\",\n });\n\n const variantMap: Record<CardVariant, string> = {\n elevated: \"sp-card--elevated\",\n flat: \"sp-card--flat\",\n outline: \"sp-card--outline\",\n ghost: \"sp-card--ghost\",\n };\n const variantClass = variantMap[variant];\n\n return cx(\n \"sp-card\",\n variantClass,\n interactive && \"sp-card--interactive\",\n padded && \"sp-card--padded\",\n fullHeight && \"sp-card--full\",\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst inputStates = [\"default\", \"error\", \"success\", \"disabled\"] as const;\nconst inputSizes = [\"sm\", \"md\", \"lg\"] as const;\n\nexport type InputState = (typeof inputStates)[number];\nexport type InputSize = (typeof inputSizes)[number];\n\nconst INPUT_STATES = {\n default: true,\n error: true,\n success: true,\n disabled: true,\n} as const;\n\nconst INPUT_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport interface InputRecipeOptions {\n state?: InputState;\n size?: InputSize;\n fullWidth?: boolean;\n}\n\nexport function getInputClasses(opts: InputRecipeOptions = {}): string {\n const { state: stateInput, size: sizeInput, fullWidth = false } = opts;\n\n const state = resolveOption({\n name: \"input state\",\n value: stateInput,\n allowed: INPUT_STATES,\n fallback: \"default\",\n });\n const size = resolveOption({\n name: \"input size\",\n value: sizeInput,\n allowed: INPUT_SIZES,\n fallback: \"md\",\n });\n\n const sizeMap: Record<InputSize, string> = {\n sm: \"sp-input--sm\",\n md: \"sp-input--md\",\n lg: \"sp-input--lg\",\n };\n const sizeClass = sizeMap[size];\n\n // State\n return cx(\n \"sp-input\",\n sizeClass,\n state === \"error\" && \"sp-input--error\",\n state === \"success\" && \"sp-input--success\",\n // Visual state only; actual disabled attribute is handled by adapters.\n state === \"disabled\" && \"sp-input--disabled\",\n fullWidth && \"sp-input--full\",\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst badgeVariants = [\"primary\", \"success\", \"warning\", \"danger\"] as const;\nconst badgeSizes = [\"sm\", \"md\", \"lg\"] as const;\n\nexport type BadgeVariant = (typeof badgeVariants)[number];\nexport type BadgeSize = (typeof badgeSizes)[number];\n\nconst BADGE_VARIANTS = {\n primary: true,\n success: true,\n warning: true,\n danger: true,\n} as const;\n\nconst BADGE_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport interface BadgeRecipeOptions {\n variant?: BadgeVariant;\n size?: BadgeSize;\n}\n\nexport function getBadgeClasses(opts: BadgeRecipeOptions = {}): string {\n const { variant: variantInput, size: sizeInput } = opts;\n\n const variant = resolveOption({\n name: \"badge variant\",\n value: variantInput,\n allowed: BADGE_VARIANTS,\n fallback: \"primary\",\n });\n const size = resolveOption({\n name: \"badge size\",\n value: sizeInput,\n allowed: BADGE_SIZES,\n fallback: \"md\",\n });\n\n const variantMap: Record<BadgeVariant, string> = {\n primary: \"sp-badge--primary\",\n success: \"sp-badge--success\",\n warning: \"sp-badge--warning\",\n danger: \"sp-badge--danger\",\n };\n const variantClass = variantMap[variant];\n\n const sizeMap: Record<BadgeSize, string> = {\n sm: \"sp-badge--sm\",\n md: \"sp-badge--md\",\n lg: \"sp-badge--lg\",\n };\n const sizeClass = sizeMap[size];\n\n return cx(\"sp-badge\", variantClass, sizeClass);\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst iconBoxVariants = [\"primary\", \"success\", \"warning\", \"danger\", \"info\"] as const;\nconst iconBoxSizes = [\"sm\", \"md\", \"lg\"] as const;\n\nexport type IconBoxVariant = (typeof iconBoxVariants)[number];\nexport type IconBoxSize = (typeof iconBoxSizes)[number];\n\nconst ICONBOX_VARIANTS = {\n primary: true,\n success: true,\n warning: true,\n danger: true,\n info: true,\n} as const;\n\nconst ICONBOX_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport interface IconBoxRecipeOptions {\n variant?: IconBoxVariant;\n size?: IconBoxSize;\n}\n\nexport function getIconBoxClasses(opts: IconBoxRecipeOptions = {}): string {\n const { variant: variantInput, size: sizeInput } = opts;\n\n const variant = resolveOption({\n name: \"icon box variant\",\n value: variantInput,\n allowed: ICONBOX_VARIANTS,\n fallback: \"primary\",\n });\n const size = resolveOption({\n name: \"icon box size\",\n value: sizeInput,\n allowed: ICONBOX_SIZES,\n fallback: \"md\",\n });\n\n const variantMap: Record<IconBoxVariant, string> = {\n primary: \"sp-iconbox--primary\",\n success: \"sp-iconbox--success\",\n warning: \"sp-iconbox--warning\",\n danger: \"sp-iconbox--danger\",\n info: \"sp-iconbox--info\",\n };\n const variantClass = variantMap[variant];\n\n const sizeMap: Record<IconBoxSize, string> = {\n sm: \"sp-iconbox--sm\",\n md: \"sp-iconbox--md\",\n lg: \"sp-iconbox--lg\",\n };\n const sizeClass = sizeMap[size];\n\n return cx(\"sp-iconbox\", variantClass, sizeClass);\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -28,8 +28,10 @@ declare function createSpectreTailwindTheme(options: CreateSpectreTailwindThemeO
|
|
|
28
28
|
|
|
29
29
|
declare const spectrePreset: Config;
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
declare const buttonVariants: readonly ["primary", "secondary", "ghost", "danger", "success"];
|
|
32
|
+
declare const buttonSizes: readonly ["sm", "md", "lg"];
|
|
33
|
+
type ButtonVariant = (typeof buttonVariants)[number];
|
|
34
|
+
type ButtonSize = (typeof buttonSizes)[number];
|
|
33
35
|
interface ButtonRecipeOptions {
|
|
34
36
|
variant?: ButtonVariant;
|
|
35
37
|
size?: ButtonSize;
|
|
@@ -40,7 +42,8 @@ interface ButtonRecipeOptions {
|
|
|
40
42
|
}
|
|
41
43
|
declare function getButtonClasses(opts?: ButtonRecipeOptions): string;
|
|
42
44
|
|
|
43
|
-
|
|
45
|
+
declare const cardVariants: readonly ["elevated", "flat", "outline", "ghost"];
|
|
46
|
+
type CardVariant = (typeof cardVariants)[number];
|
|
44
47
|
interface CardRecipeOptions {
|
|
45
48
|
variant?: CardVariant;
|
|
46
49
|
interactive?: boolean;
|
|
@@ -49,8 +52,10 @@ interface CardRecipeOptions {
|
|
|
49
52
|
}
|
|
50
53
|
declare function getCardClasses(opts?: CardRecipeOptions): string;
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
declare const inputStates: readonly ["default", "error", "success", "disabled"];
|
|
56
|
+
declare const inputSizes: readonly ["sm", "md", "lg"];
|
|
57
|
+
type InputState = (typeof inputStates)[number];
|
|
58
|
+
type InputSize = (typeof inputSizes)[number];
|
|
54
59
|
interface InputRecipeOptions {
|
|
55
60
|
state?: InputState;
|
|
56
61
|
size?: InputSize;
|
|
@@ -58,4 +63,24 @@ interface InputRecipeOptions {
|
|
|
58
63
|
}
|
|
59
64
|
declare function getInputClasses(opts?: InputRecipeOptions): string;
|
|
60
65
|
|
|
61
|
-
|
|
66
|
+
declare const badgeVariants: readonly ["primary", "success", "warning", "danger"];
|
|
67
|
+
declare const badgeSizes: readonly ["sm", "md", "lg"];
|
|
68
|
+
type BadgeVariant = (typeof badgeVariants)[number];
|
|
69
|
+
type BadgeSize = (typeof badgeSizes)[number];
|
|
70
|
+
interface BadgeRecipeOptions {
|
|
71
|
+
variant?: BadgeVariant;
|
|
72
|
+
size?: BadgeSize;
|
|
73
|
+
}
|
|
74
|
+
declare function getBadgeClasses(opts?: BadgeRecipeOptions): string;
|
|
75
|
+
|
|
76
|
+
declare const iconBoxVariants: readonly ["primary", "success", "warning", "danger", "info"];
|
|
77
|
+
declare const iconBoxSizes: readonly ["sm", "md", "lg"];
|
|
78
|
+
type IconBoxVariant = (typeof iconBoxVariants)[number];
|
|
79
|
+
type IconBoxSize = (typeof iconBoxSizes)[number];
|
|
80
|
+
interface IconBoxRecipeOptions {
|
|
81
|
+
variant?: IconBoxVariant;
|
|
82
|
+
size?: IconBoxSize;
|
|
83
|
+
}
|
|
84
|
+
declare function getIconBoxClasses(opts?: IconBoxRecipeOptions): string;
|
|
85
|
+
|
|
86
|
+
export { type BadgeRecipeOptions, type BadgeSize, type BadgeVariant, type ButtonRecipeOptions, type ButtonSize, type ButtonVariant, type CardRecipeOptions, type CardVariant, type CreateSpectreTailwindThemeOptions, type IconBoxRecipeOptions, type IconBoxSize, type IconBoxVariant, type InputRecipeOptions, type InputSize, type InputState, type SpectreTailwindTheme, createSpectreTailwindTheme, getBadgeClasses, getButtonClasses, getCardClasses, getIconBoxClasses, getInputClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectrePreset, spectreStyles, spectreUtilitiesStylesPath };
|
package/dist/index.d.ts
CHANGED
|
@@ -28,8 +28,10 @@ declare function createSpectreTailwindTheme(options: CreateSpectreTailwindThemeO
|
|
|
28
28
|
|
|
29
29
|
declare const spectrePreset: Config;
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
declare const buttonVariants: readonly ["primary", "secondary", "ghost", "danger", "success"];
|
|
32
|
+
declare const buttonSizes: readonly ["sm", "md", "lg"];
|
|
33
|
+
type ButtonVariant = (typeof buttonVariants)[number];
|
|
34
|
+
type ButtonSize = (typeof buttonSizes)[number];
|
|
33
35
|
interface ButtonRecipeOptions {
|
|
34
36
|
variant?: ButtonVariant;
|
|
35
37
|
size?: ButtonSize;
|
|
@@ -40,7 +42,8 @@ interface ButtonRecipeOptions {
|
|
|
40
42
|
}
|
|
41
43
|
declare function getButtonClasses(opts?: ButtonRecipeOptions): string;
|
|
42
44
|
|
|
43
|
-
|
|
45
|
+
declare const cardVariants: readonly ["elevated", "flat", "outline", "ghost"];
|
|
46
|
+
type CardVariant = (typeof cardVariants)[number];
|
|
44
47
|
interface CardRecipeOptions {
|
|
45
48
|
variant?: CardVariant;
|
|
46
49
|
interactive?: boolean;
|
|
@@ -49,8 +52,10 @@ interface CardRecipeOptions {
|
|
|
49
52
|
}
|
|
50
53
|
declare function getCardClasses(opts?: CardRecipeOptions): string;
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
declare const inputStates: readonly ["default", "error", "success", "disabled"];
|
|
56
|
+
declare const inputSizes: readonly ["sm", "md", "lg"];
|
|
57
|
+
type InputState = (typeof inputStates)[number];
|
|
58
|
+
type InputSize = (typeof inputSizes)[number];
|
|
54
59
|
interface InputRecipeOptions {
|
|
55
60
|
state?: InputState;
|
|
56
61
|
size?: InputSize;
|
|
@@ -58,4 +63,24 @@ interface InputRecipeOptions {
|
|
|
58
63
|
}
|
|
59
64
|
declare function getInputClasses(opts?: InputRecipeOptions): string;
|
|
60
65
|
|
|
61
|
-
|
|
66
|
+
declare const badgeVariants: readonly ["primary", "success", "warning", "danger"];
|
|
67
|
+
declare const badgeSizes: readonly ["sm", "md", "lg"];
|
|
68
|
+
type BadgeVariant = (typeof badgeVariants)[number];
|
|
69
|
+
type BadgeSize = (typeof badgeSizes)[number];
|
|
70
|
+
interface BadgeRecipeOptions {
|
|
71
|
+
variant?: BadgeVariant;
|
|
72
|
+
size?: BadgeSize;
|
|
73
|
+
}
|
|
74
|
+
declare function getBadgeClasses(opts?: BadgeRecipeOptions): string;
|
|
75
|
+
|
|
76
|
+
declare const iconBoxVariants: readonly ["primary", "success", "warning", "danger", "info"];
|
|
77
|
+
declare const iconBoxSizes: readonly ["sm", "md", "lg"];
|
|
78
|
+
type IconBoxVariant = (typeof iconBoxVariants)[number];
|
|
79
|
+
type IconBoxSize = (typeof iconBoxSizes)[number];
|
|
80
|
+
interface IconBoxRecipeOptions {
|
|
81
|
+
variant?: IconBoxVariant;
|
|
82
|
+
size?: IconBoxSize;
|
|
83
|
+
}
|
|
84
|
+
declare function getIconBoxClasses(opts?: IconBoxRecipeOptions): string;
|
|
85
|
+
|
|
86
|
+
export { type BadgeRecipeOptions, type BadgeSize, type BadgeVariant, type ButtonRecipeOptions, type ButtonSize, type ButtonVariant, type CardRecipeOptions, type CardVariant, type CreateSpectreTailwindThemeOptions, type IconBoxRecipeOptions, type IconBoxSize, type IconBoxVariant, type InputRecipeOptions, type InputSize, type InputState, type SpectreTailwindTheme, createSpectreTailwindTheme, getBadgeClasses, getButtonClasses, getCardClasses, getIconBoxClasses, getInputClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectrePreset, spectreStyles, spectreUtilitiesStylesPath };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import spectreTokens from '@phcdevworks/spectre-tokens';
|
|
2
1
|
export { default as spectreTokens } from '@phcdevworks/spectre-tokens';
|
|
3
2
|
|
|
4
3
|
// src/css-constants.ts
|
|
@@ -26,7 +25,7 @@ function createSpectreTailwindTheme(options) {
|
|
|
26
25
|
const boxShadow = t.shadows ?? t.shadow ?? {};
|
|
27
26
|
const fontFamily = t.typography?.families ?? t.fonts ?? {};
|
|
28
27
|
const fontSize = t.typography?.scale ?? t.fontSize ?? {};
|
|
29
|
-
const
|
|
28
|
+
const theme = {
|
|
30
29
|
colors,
|
|
31
30
|
spacing,
|
|
32
31
|
borderRadius,
|
|
@@ -34,28 +33,135 @@ function createSpectreTailwindTheme(options) {
|
|
|
34
33
|
fontFamily,
|
|
35
34
|
fontSize
|
|
36
35
|
};
|
|
37
|
-
return { theme
|
|
36
|
+
return { theme };
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
// src/tailwind/preset.ts
|
|
41
|
-
var
|
|
42
|
-
var
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
41
|
+
var deepMerge = (base, overrides) => {
|
|
42
|
+
if (!overrides) return base;
|
|
43
|
+
const result = { ...base };
|
|
44
|
+
for (const [key, overrideValue] of Object.entries(overrides)) {
|
|
45
|
+
const baseValue = result[key];
|
|
46
|
+
if (isPlainObject(baseValue) && isPlainObject(overrideValue)) {
|
|
47
|
+
result[key] = deepMerge(baseValue, overrideValue);
|
|
48
|
+
} else {
|
|
49
|
+
result[key] = overrideValue;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
46
53
|
};
|
|
54
|
+
var cachedTokens = null;
|
|
55
|
+
var getRequire = () => {
|
|
56
|
+
try {
|
|
57
|
+
return Function("return typeof require !== 'undefined' ? require : null")();
|
|
58
|
+
} catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var resolveTokens = (tokens) => {
|
|
63
|
+
if (tokens) return tokens;
|
|
64
|
+
if (cachedTokens) return cachedTokens;
|
|
65
|
+
const req = getRequire();
|
|
66
|
+
if (!req) {
|
|
67
|
+
throw new Error(
|
|
68
|
+
"[spectre-ui] Unable to load spectre tokens; pass tokens to createSpectreTailwindPreset."
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
const mod = req("../tokens");
|
|
72
|
+
cachedTokens = mod.spectreTokens;
|
|
73
|
+
return cachedTokens;
|
|
74
|
+
};
|
|
75
|
+
var createSpectreTailwindPreset = (options = {}) => {
|
|
76
|
+
const tokens = resolveTokens(options.tokens);
|
|
77
|
+
const { theme } = createSpectreTailwindTheme({ tokens });
|
|
78
|
+
const mergedTheme = deepMerge(
|
|
79
|
+
theme,
|
|
80
|
+
options.themeOverrides
|
|
81
|
+
);
|
|
82
|
+
const basePreset = {
|
|
83
|
+
content: [],
|
|
84
|
+
theme: mergedTheme
|
|
85
|
+
// theme is guaranteed non-undefined now
|
|
86
|
+
};
|
|
87
|
+
return deepMerge(
|
|
88
|
+
basePreset,
|
|
89
|
+
options.presetOverrides
|
|
90
|
+
);
|
|
91
|
+
};
|
|
92
|
+
var spectrePreset = createSpectreTailwindPreset();
|
|
93
|
+
|
|
94
|
+
// src/internal/cx.ts
|
|
95
|
+
function cx(...parts) {
|
|
96
|
+
const seen = /* @__PURE__ */ new Set();
|
|
97
|
+
const classes = [];
|
|
98
|
+
for (const part of parts) {
|
|
99
|
+
if (!part) continue;
|
|
100
|
+
const trimmed = part.trim();
|
|
101
|
+
if (!trimmed) continue;
|
|
102
|
+
if (!/\s/.test(trimmed)) {
|
|
103
|
+
if (!seen.has(trimmed)) {
|
|
104
|
+
seen.add(trimmed);
|
|
105
|
+
classes.push(trimmed);
|
|
106
|
+
}
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
for (const token of trimmed.split(/\s+/)) {
|
|
110
|
+
if (!token || seen.has(token)) continue;
|
|
111
|
+
seen.add(token);
|
|
112
|
+
classes.push(token);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return classes.join(" ");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// src/internal/resolve-option.ts
|
|
119
|
+
var hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
120
|
+
var isAllowedValue = (value, allowed) => Array.isArray(allowed) ? allowed.includes(value) : hasOwn(allowed, value);
|
|
121
|
+
function resolveOption(config) {
|
|
122
|
+
const { name, value, allowed, fallback } = config;
|
|
123
|
+
if (value === void 0) return fallback;
|
|
124
|
+
if (isAllowedValue(value, allowed)) return value;
|
|
125
|
+
if (process.env.NODE_ENV !== "production") {
|
|
126
|
+
throw new Error(`[spectre-ui] Unknown ${name}: ${value}`);
|
|
127
|
+
}
|
|
128
|
+
return fallback;
|
|
129
|
+
}
|
|
47
130
|
|
|
48
131
|
// src/recipes/button.ts
|
|
132
|
+
var BUTTON_VARIANTS = {
|
|
133
|
+
primary: true,
|
|
134
|
+
secondary: true,
|
|
135
|
+
ghost: true,
|
|
136
|
+
danger: true,
|
|
137
|
+
success: true
|
|
138
|
+
};
|
|
139
|
+
var BUTTON_SIZES = {
|
|
140
|
+
sm: true,
|
|
141
|
+
md: true,
|
|
142
|
+
lg: true
|
|
143
|
+
};
|
|
49
144
|
function getButtonClasses(opts = {}) {
|
|
50
145
|
const {
|
|
51
|
-
variant
|
|
52
|
-
size
|
|
146
|
+
variant: variantInput,
|
|
147
|
+
size: sizeInput,
|
|
53
148
|
fullWidth = false,
|
|
54
149
|
loading = false,
|
|
55
150
|
disabled = false,
|
|
56
151
|
iconOnly = false
|
|
57
152
|
} = opts;
|
|
58
|
-
const
|
|
153
|
+
const variant = resolveOption({
|
|
154
|
+
name: "button variant",
|
|
155
|
+
value: variantInput,
|
|
156
|
+
allowed: BUTTON_VARIANTS,
|
|
157
|
+
fallback: "primary"
|
|
158
|
+
});
|
|
159
|
+
const size = resolveOption({
|
|
160
|
+
name: "button size",
|
|
161
|
+
value: sizeInput,
|
|
162
|
+
allowed: BUTTON_SIZES,
|
|
163
|
+
fallback: "md"
|
|
164
|
+
});
|
|
59
165
|
const variantMap = {
|
|
60
166
|
primary: "sp-btn--primary",
|
|
61
167
|
secondary: "sp-btn--secondary",
|
|
@@ -63,59 +169,189 @@ function getButtonClasses(opts = {}) {
|
|
|
63
169
|
danger: "sp-btn--danger",
|
|
64
170
|
success: "sp-btn--success"
|
|
65
171
|
};
|
|
66
|
-
|
|
172
|
+
const variantClass = variantMap[variant];
|
|
67
173
|
const sizeMap = {
|
|
68
174
|
sm: "sp-btn--sm",
|
|
69
175
|
md: "sp-btn--md",
|
|
70
176
|
lg: "sp-btn--lg"
|
|
71
177
|
};
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
178
|
+
const sizeClass = sizeMap[size];
|
|
179
|
+
return cx(
|
|
180
|
+
"sp-btn",
|
|
181
|
+
variantClass,
|
|
182
|
+
sizeClass,
|
|
183
|
+
fullWidth && "sp-btn--full",
|
|
184
|
+
loading && "sp-btn--loading",
|
|
185
|
+
disabled && "sp-btn--disabled",
|
|
186
|
+
iconOnly && "sp-btn--icon"
|
|
187
|
+
);
|
|
78
188
|
}
|
|
79
189
|
|
|
80
190
|
// src/recipes/card.ts
|
|
191
|
+
var CARD_VARIANTS = {
|
|
192
|
+
elevated: true,
|
|
193
|
+
flat: true,
|
|
194
|
+
outline: true,
|
|
195
|
+
ghost: true
|
|
196
|
+
};
|
|
81
197
|
function getCardClasses(opts = {}) {
|
|
82
198
|
const {
|
|
83
|
-
variant
|
|
199
|
+
variant: variantInput,
|
|
84
200
|
interactive = false,
|
|
85
201
|
padded = false,
|
|
86
202
|
fullHeight = false
|
|
87
203
|
} = opts;
|
|
88
|
-
const
|
|
204
|
+
const variant = resolveOption({
|
|
205
|
+
name: "card variant",
|
|
206
|
+
value: variantInput,
|
|
207
|
+
allowed: CARD_VARIANTS,
|
|
208
|
+
fallback: "elevated"
|
|
209
|
+
});
|
|
89
210
|
const variantMap = {
|
|
90
211
|
elevated: "sp-card--elevated",
|
|
91
212
|
flat: "sp-card--flat",
|
|
92
213
|
outline: "sp-card--outline",
|
|
93
214
|
ghost: "sp-card--ghost"
|
|
94
215
|
};
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
216
|
+
const variantClass = variantMap[variant];
|
|
217
|
+
return cx(
|
|
218
|
+
"sp-card",
|
|
219
|
+
variantClass,
|
|
220
|
+
interactive && "sp-card--interactive",
|
|
221
|
+
padded && "sp-card--padded",
|
|
222
|
+
fullHeight && "sp-card--full"
|
|
223
|
+
);
|
|
100
224
|
}
|
|
101
225
|
|
|
102
226
|
// src/recipes/input.ts
|
|
227
|
+
var INPUT_STATES = {
|
|
228
|
+
default: true,
|
|
229
|
+
error: true,
|
|
230
|
+
success: true,
|
|
231
|
+
disabled: true
|
|
232
|
+
};
|
|
233
|
+
var INPUT_SIZES = {
|
|
234
|
+
sm: true,
|
|
235
|
+
md: true,
|
|
236
|
+
lg: true
|
|
237
|
+
};
|
|
103
238
|
function getInputClasses(opts = {}) {
|
|
104
|
-
const { state
|
|
105
|
-
const
|
|
239
|
+
const { state: stateInput, size: sizeInput, fullWidth = false } = opts;
|
|
240
|
+
const state = resolveOption({
|
|
241
|
+
name: "input state",
|
|
242
|
+
value: stateInput,
|
|
243
|
+
allowed: INPUT_STATES,
|
|
244
|
+
fallback: "default"
|
|
245
|
+
});
|
|
246
|
+
const size = resolveOption({
|
|
247
|
+
name: "input size",
|
|
248
|
+
value: sizeInput,
|
|
249
|
+
allowed: INPUT_SIZES,
|
|
250
|
+
fallback: "md"
|
|
251
|
+
});
|
|
106
252
|
const sizeMap = {
|
|
107
253
|
sm: "sp-input--sm",
|
|
108
254
|
md: "sp-input--md",
|
|
109
255
|
lg: "sp-input--lg"
|
|
110
256
|
};
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
257
|
+
const sizeClass = sizeMap[size];
|
|
258
|
+
return cx(
|
|
259
|
+
"sp-input",
|
|
260
|
+
sizeClass,
|
|
261
|
+
state === "error" && "sp-input--error",
|
|
262
|
+
state === "success" && "sp-input--success",
|
|
263
|
+
// Visual state only; actual disabled attribute is handled by adapters.
|
|
264
|
+
state === "disabled" && "sp-input--disabled",
|
|
265
|
+
fullWidth && "sp-input--full"
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// src/recipes/badge.ts
|
|
270
|
+
var BADGE_VARIANTS = {
|
|
271
|
+
primary: true,
|
|
272
|
+
success: true,
|
|
273
|
+
warning: true,
|
|
274
|
+
danger: true
|
|
275
|
+
};
|
|
276
|
+
var BADGE_SIZES = {
|
|
277
|
+
sm: true,
|
|
278
|
+
md: true,
|
|
279
|
+
lg: true
|
|
280
|
+
};
|
|
281
|
+
function getBadgeClasses(opts = {}) {
|
|
282
|
+
const { variant: variantInput, size: sizeInput } = opts;
|
|
283
|
+
const variant = resolveOption({
|
|
284
|
+
name: "badge variant",
|
|
285
|
+
value: variantInput,
|
|
286
|
+
allowed: BADGE_VARIANTS,
|
|
287
|
+
fallback: "primary"
|
|
288
|
+
});
|
|
289
|
+
const size = resolveOption({
|
|
290
|
+
name: "badge size",
|
|
291
|
+
value: sizeInput,
|
|
292
|
+
allowed: BADGE_SIZES,
|
|
293
|
+
fallback: "md"
|
|
294
|
+
});
|
|
295
|
+
const variantMap = {
|
|
296
|
+
primary: "sp-badge--primary",
|
|
297
|
+
success: "sp-badge--success",
|
|
298
|
+
warning: "sp-badge--warning",
|
|
299
|
+
danger: "sp-badge--danger"
|
|
300
|
+
};
|
|
301
|
+
const variantClass = variantMap[variant];
|
|
302
|
+
const sizeMap = {
|
|
303
|
+
sm: "sp-badge--sm",
|
|
304
|
+
md: "sp-badge--md",
|
|
305
|
+
lg: "sp-badge--lg"
|
|
306
|
+
};
|
|
307
|
+
const sizeClass = sizeMap[size];
|
|
308
|
+
return cx("sp-badge", variantClass, sizeClass);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// src/recipes/iconbox.ts
|
|
312
|
+
var ICONBOX_VARIANTS = {
|
|
313
|
+
primary: true,
|
|
314
|
+
success: true,
|
|
315
|
+
warning: true,
|
|
316
|
+
danger: true,
|
|
317
|
+
info: true
|
|
318
|
+
};
|
|
319
|
+
var ICONBOX_SIZES = {
|
|
320
|
+
sm: true,
|
|
321
|
+
md: true,
|
|
322
|
+
lg: true
|
|
323
|
+
};
|
|
324
|
+
function getIconBoxClasses(opts = {}) {
|
|
325
|
+
const { variant: variantInput, size: sizeInput } = opts;
|
|
326
|
+
const variant = resolveOption({
|
|
327
|
+
name: "icon box variant",
|
|
328
|
+
value: variantInput,
|
|
329
|
+
allowed: ICONBOX_VARIANTS,
|
|
330
|
+
fallback: "primary"
|
|
331
|
+
});
|
|
332
|
+
const size = resolveOption({
|
|
333
|
+
name: "icon box size",
|
|
334
|
+
value: sizeInput,
|
|
335
|
+
allowed: ICONBOX_SIZES,
|
|
336
|
+
fallback: "md"
|
|
337
|
+
});
|
|
338
|
+
const variantMap = {
|
|
339
|
+
primary: "sp-iconbox--primary",
|
|
340
|
+
success: "sp-iconbox--success",
|
|
341
|
+
warning: "sp-iconbox--warning",
|
|
342
|
+
danger: "sp-iconbox--danger",
|
|
343
|
+
info: "sp-iconbox--info"
|
|
344
|
+
};
|
|
345
|
+
const variantClass = variantMap[variant];
|
|
346
|
+
const sizeMap = {
|
|
347
|
+
sm: "sp-iconbox--sm",
|
|
348
|
+
md: "sp-iconbox--md",
|
|
349
|
+
lg: "sp-iconbox--lg"
|
|
350
|
+
};
|
|
351
|
+
const sizeClass = sizeMap[size];
|
|
352
|
+
return cx("sp-iconbox", variantClass, sizeClass);
|
|
117
353
|
}
|
|
118
354
|
|
|
119
|
-
export { createSpectreTailwindTheme, getButtonClasses, getCardClasses, getInputClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectrePreset, spectreStyles, spectreUtilitiesStylesPath };
|
|
355
|
+
export { createSpectreTailwindTheme, getBadgeClasses, getButtonClasses, getCardClasses, getIconBoxClasses, getInputClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectrePreset, spectreStyles, spectreUtilitiesStylesPath };
|
|
120
356
|
//# sourceMappingURL=index.js.map
|
|
121
357
|
//# sourceMappingURL=index.js.map
|