@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.
@@ -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":";;;;;;;;;AAAO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,2BAAA,GAA8B;AACpC,IAAM,0BAAA,GAA6B;AACnC,IAAM,sBAAA,GAAyB,mCAAA;AAE/B,IAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO,sBAAA;AAAA,EACP,IAAA,EAAM,qBAAA;AAAA,EACN,UAAA,EAAY,2BAAA;AAAA,EACZ,SAAA,EAAW;AACb;;;ACQO,SAAS,2BACd,OAAA,EACsB;AACtB,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,GAAI,OAAA,CAAQ,MAAA,IAAW,EAAC;AAAA,IACxB,GAAI,OAAA,CAAQ,SAAA,IAAa;AAAC,GAC5B;AAIA,EAAA,MAAM,CAAA,GAAS,YAAA;AAEf,EAAA,MAAM,SAAU,CAAA,CAAE,MAAA,IAAU,EAAE,KAAA,IAAS,CAAA,CAAE,WAAW,EAAC;AACrD,EAAA,MAAM,OAAA,GAAW,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,SAAS,EAAC;AAC1C,EAAA,MAAM,YAAA,GAAgB,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,UAAU,EAAC;AAC9C,EAAA,MAAM,SAAA,GAAa,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,UAAU,EAAC;AAC7C,EAAA,MAAM,aAAc,CAAA,CAAE,UAAA,EAAY,QAAA,IAAY,CAAA,CAAE,SAAS,EAAC;AAC1D,EAAA,MAAM,WAAY,CAAA,CAAE,UAAA,EAAY,KAAA,IAAS,CAAA,CAAE,YAAY,EAAC;AAExD,EAAA,MAAM,KAAA,GAAuB;AAAA,IAC3B,MAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAM;AACjB;;;ACnCA,IAAM,aAAA,GAAgB,CAAC,KAAA,KACrB,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAGrE,IAAM,SAAA,GAAY,CAChB,IAAA,EACA,SAAA,KACM;AACN,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,EAAA,MAAM,MAAA,GAAkC,EAAE,GAAG,IAAA,EAAK;AAElD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,aAAa,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5D,IAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAC5B,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,IAAK,aAAA,CAAc,aAAa,CAAA,EAAG;AAC5D,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,CAAU,SAAA,EAAW,aAAa,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,aAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,IAAI,YAAA,GAAqC,IAAA;AAEzC,IAAM,aAAa,MAAwC;AACzD,EAAA,IAAI;AAEF,IAAA,OAAO,QAAA,CAAS,wDAAwD,CAAA,EAAE;AAAA,EAG5E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,aAAA,GAAgB,CAAC,MAAA,KAA0C;AAC/D,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,IAAI,cAAc,OAAO,YAAA;AAEzB,EAAA,MAAM,MAAM,UAAA,EAAW;AACvB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,WAAW,CAAA;AAC3B,EAAA,YAAA,GAAe,GAAA,CAAI,aAAA;AACnB,EAAA,OAAO,YAAA;AACT,CAAA;AAEO,IAAM,2BAAA,GAA8B,CACzC,OAAA,GAA8C,EAAC,KAC5B;AACnB,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,0BAAA,CAA2B,EAAE,QAAQ,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,SAAA;AAAA,IAClB,KAAA;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,UAAA,GAA6B;AAAA,IACjC,SAAS,EAAC;AAAA,IACV,KAAA,EAAO;AAAA;AAAA,GACT;AAEA,EAAA,OAAO,SAAA;AAAA,IACL,UAAA;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AACF,CAAA;AAEO,IAAM,gBAAgC,2BAAA;;;ACtFtC,SAAS,MAAM,KAAA,EAAyD;AAC7E,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG;AACvB,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,QAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,MACtB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AACxC,MAAA,IAAI,CAAC,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AACzB;;;ACvBA,IAAM,MAAA,GAAS,CAAC,KAAA,EAAe,GAAA,KAC7B,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AAEjD,IAAM,cAAA,GAAiB,CAAmB,KAAA,EAAU,OAAA,KAClD,MAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,GAAI,MAAA,CAAO,SAAS,KAAK,CAAA;AAEnE,SAAS,cAAgC,MAAA,EAK1C;AACJ,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,UAAS,GAAI,MAAA;AAE3C,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,QAAA;AAChC,EAAA,IAAI,cAAA,CAAe,KAAA,EAAO,OAAO,CAAA,EAAG,OAAO,KAAA;AAE3C,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,QAAA;AACT;;;ACfA,IAAM,eAAA,GAAkB;AAAA,EACtB,OAAA,EAAS,IAAA;AAAA,EACT,SAAA,EAAW,IAAA;AAAA,EACX,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAWO,SAAS,gBAAA,CAAiB,IAAA,GAA4B,EAAC,EAAW;AACvE,EAAA,MAAM;AAAA,IACJ,OAAA,EAAS,YAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,GAAY,KAAA;AAAA,IACZ,OAAA,GAAU,KAAA;AAAA,IACV,QAAA,GAAW,KAAA;AAAA,IACX,QAAA,GAAW;AAAA,GACb,GAAI,IAAA;AAEJ,EAAA,MAAM,UAAU,aAAA,CAAc;AAAA,IAC5B,IAAA,EAAM,gBAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,OAAA,EAAS,eAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,MAAM,OAAO,aAAA,CAAc;AAAA,IACzB,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,YAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,UAAA,GAA4C;AAAA,IAChD,OAAA,EAAS,iBAAA;AAAA,IACT,SAAA,EAAW,mBAAA;AAAA,IACX,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,gBAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AACA,EAAA,MAAM,YAAA,GAAe,WAAW,OAAO,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAsC;AAAA,IAC1C,EAAA,EAAI,YAAA;AAAA,IACJ,EAAA,EAAI,YAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AACA,EAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAE9B,EAAA,OAAO,EAAA;AAAA,IACL,QAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA,IAAa,cAAA;AAAA,IACb,OAAA,IAAW,iBAAA;AAAA,IACX,QAAA,IAAY,kBAAA;AAAA,IACZ,QAAA,IAAY;AAAA,GACd;AACF;;;ACzEA,IAAM,aAAA,GAAgB;AAAA,EACpB,QAAA,EAAU,IAAA;AAAA,EACV,IAAA,EAAM,IAAA;AAAA,EACN,OAAA,EAAS,IAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AASO,SAAS,cAAA,CAAe,IAAA,GAA0B,EAAC,EAAW;AACnE,EAAA,MAAM;AAAA,IACJ,OAAA,EAAS,YAAA;AAAA,IACT,WAAA,GAAc,KAAA;AAAA,IACd,MAAA,GAAS,KAAA;AAAA,IACT,UAAA,GAAa;AAAA,GACf,GAAI,IAAA;AAEJ,EAAA,MAAM,UAAU,aAAA,CAAc;AAAA,IAC5B,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,OAAA,EAAS,aAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,UAAA,GAA0C;AAAA,IAC9C,QAAA,EAAU,mBAAA;AAAA,IACV,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,kBAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AACA,EAAA,MAAM,YAAA,GAAe,WAAW,OAAO,CAAA;AAEvC,EAAA,OAAO,EAAA;AAAA,IACL,SAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA,IAAe,sBAAA;AAAA,IACf,MAAA,IAAU,iBAAA;AAAA,IACV,UAAA,IAAc;AAAA,GAChB;AACF;;;AC1CA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,IAAA;AAAA,EACT,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,EAAS,IAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAQO,SAAS,eAAA,CAAgB,IAAA,GAA2B,EAAC,EAAW;AACrE,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,MAAM,SAAA,EAAW,SAAA,GAAY,OAAM,GAAI,IAAA;AAElE,EAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,IAC1B,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,OAAA,EAAS,YAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,MAAM,OAAO,aAAA,CAAc;AAAA,IACzB,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,WAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,OAAA,GAAqC;AAAA,IACzC,EAAA,EAAI,cAAA;AAAA,IACJ,EAAA,EAAI,cAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AACA,EAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAG9B,EAAA,OAAO,EAAA;AAAA,IACL,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAU,OAAA,IAAW,iBAAA;AAAA,IACrB,UAAU,SAAA,IAAa,mBAAA;AAAA;AAAA,IAEvB,UAAU,UAAA,IAAc,oBAAA;AAAA,IACxB,SAAA,IAAa;AAAA,GACf;AACF;;;ACpDA,IAAM,cAAA,GAAiB;AAAA,EACrB,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAOO,SAAS,eAAA,CAAgB,IAAA,GAA2B,EAAC,EAAW;AACrE,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,IAAA,EAAM,WAAU,GAAI,IAAA;AAEnD,EAAA,MAAM,UAAU,aAAA,CAAc;AAAA,IAC5B,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,OAAA,EAAS,cAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,MAAM,OAAO,aAAA,CAAc;AAAA,IACzB,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,WAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,UAAA,GAA2C;AAAA,IAC/C,OAAA,EAAS,mBAAA;AAAA,IACT,OAAA,EAAS,mBAAA;AAAA,IACT,OAAA,EAAS,mBAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,MAAM,YAAA,GAAe,WAAW,OAAO,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAqC;AAAA,IACzC,EAAA,EAAI,cAAA;AAAA,IACJ,EAAA,EAAI,cAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AACA,EAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAE9B,EAAA,OAAO,EAAA,CAAG,UAAA,EAAY,YAAA,EAAc,SAAS,CAAA;AAC/C;;;AClDA,IAAM,gBAAA,GAAmB;AAAA,EACvB,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,MAAA,EAAQ,IAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAOO,SAAS,iBAAA,CAAkB,IAAA,GAA6B,EAAC,EAAW;AACzE,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,IAAA,EAAM,WAAU,GAAI,IAAA;AAEnD,EAAA,MAAM,UAAU,aAAA,CAAc;AAAA,IAC5B,IAAA,EAAM,kBAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,OAAA,EAAS,gBAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,MAAM,OAAO,aAAA,CAAc;AAAA,IACzB,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,aAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,UAAA,GAA6C;AAAA,IACjD,OAAA,EAAS,qBAAA;AAAA,IACT,OAAA,EAAS,qBAAA;AAAA,IACT,OAAA,EAAS,qBAAA;AAAA,IACT,MAAA,EAAQ,oBAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AACA,EAAA,MAAM,YAAA,GAAe,WAAW,OAAO,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAuC;AAAA,IAC3C,EAAA,EAAI,gBAAA;AAAA,IACJ,EAAA,EAAI,gBAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AACA,EAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAE9B,EAAA,OAAO,EAAA,CAAG,YAAA,EAAc,YAAA,EAAc,SAAS,CAAA;AACjD","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
- type ButtonVariant = "primary" | "secondary" | "ghost" | "danger" | "success";
32
- type ButtonSize = "sm" | "md" | "lg";
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
- type CardVariant = "elevated" | "flat" | "outline" | "ghost";
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
- type InputState = "default" | "error" | "success" | "disabled";
53
- type InputSize = "sm" | "md" | "lg";
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
- export { type ButtonRecipeOptions, type ButtonSize, type ButtonVariant, type CardRecipeOptions, type CardVariant, type CreateSpectreTailwindThemeOptions, type InputRecipeOptions, type InputSize, type InputState, type SpectreTailwindTheme, createSpectreTailwindTheme, getButtonClasses, getCardClasses, getInputClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectrePreset, spectreStyles, spectreUtilitiesStylesPath };
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
- type ButtonVariant = "primary" | "secondary" | "ghost" | "danger" | "success";
32
- type ButtonSize = "sm" | "md" | "lg";
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
- type CardVariant = "elevated" | "flat" | "outline" | "ghost";
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
- type InputState = "default" | "error" | "success" | "disabled";
53
- type InputSize = "sm" | "md" | "lg";
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
- export { type ButtonRecipeOptions, type ButtonSize, type ButtonVariant, type CardRecipeOptions, type CardVariant, type CreateSpectreTailwindThemeOptions, type InputRecipeOptions, type InputSize, type InputState, type SpectreTailwindTheme, createSpectreTailwindTheme, getButtonClasses, getCardClasses, getInputClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectrePreset, spectreStyles, spectreUtilitiesStylesPath };
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 theme2 = {
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: theme2 };
36
+ return { theme };
38
37
  }
39
38
 
40
39
  // src/tailwind/preset.ts
41
- var { theme } = createSpectreTailwindTheme({ tokens: spectreTokens });
42
- var spectrePreset = {
43
- content: [],
44
- theme
45
- // theme is guaranteed non-undefined now
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 = "primary",
52
- size = "md",
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 classes = ["sp-btn"];
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
- classes.push(variantMap[variant]);
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
- classes.push(sizeMap[size]);
73
- if (fullWidth) classes.push("sp-btn--full");
74
- if (loading) classes.push("sp-btn--loading");
75
- if (disabled) classes.push("sp-btn--disabled");
76
- if (iconOnly) classes.push("sp-btn--icon");
77
- return classes.join(" ").trim();
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 = "elevated",
199
+ variant: variantInput,
84
200
  interactive = false,
85
201
  padded = false,
86
202
  fullHeight = false
87
203
  } = opts;
88
- const classes = ["sp-card"];
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
- classes.push(variantMap[variant]);
96
- if (interactive) classes.push("sp-card--interactive");
97
- if (padded) classes.push("sp-card--padded");
98
- if (fullHeight) classes.push("sp-card--full");
99
- return classes.join(" ").trim();
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 = "default", size = "md", fullWidth = false } = opts;
105
- const classes = ["sp-input"];
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
- classes.push(sizeMap[size]);
112
- if (state === "error") classes.push("sp-input--error");
113
- if (state === "success") classes.push("sp-input--success");
114
- if (state === "disabled") classes.push("sp-input--disabled");
115
- if (fullWidth) classes.push("sp-input--full");
116
- return classes.join(" ").trim();
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