@phcdevworks/spectre-ui 1.2.0 → 1.4.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/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  declare const spectreBaseStylesPath = "@phcdevworks/spectre-ui/base.css";
2
2
  declare const spectreComponentsStylesPath = "@phcdevworks/spectre-ui/components.css";
3
3
  declare const spectreUtilitiesStylesPath = "@phcdevworks/spectre-ui/utilities.css";
4
+ declare const spectreIndexStylesPath = "@phcdevworks/spectre-ui/index.css";
4
5
  declare const spectreStyles: {
5
6
  index: string;
6
7
  base: string;
@@ -58,6 +59,7 @@ interface CardRecipeOptions {
58
59
  loading?: boolean;
59
60
  hovered?: boolean;
60
61
  focused?: boolean;
62
+ active?: boolean;
61
63
  }
62
64
  declare function getCardClasses(opts?: CardRecipeOptions): string;
63
65
 
@@ -82,6 +84,9 @@ interface InputRecipeOptions {
82
84
  pill?: boolean;
83
85
  focused?: boolean;
84
86
  hovered?: boolean;
87
+ active?: boolean;
88
+ disabled?: boolean;
89
+ loading?: boolean;
85
90
  }
86
91
  declare function getInputClasses(opts?: InputRecipeOptions): string;
87
92
 
@@ -93,6 +98,7 @@ declare const BADGE_VARIANTS: {
93
98
  readonly danger: true;
94
99
  readonly neutral: true;
95
100
  readonly info: true;
101
+ readonly ghost: true;
96
102
  };
97
103
  declare const BADGE_SIZES: {
98
104
  readonly sm: true;
@@ -119,10 +125,13 @@ declare function getBadgeClasses(opts?: BadgeRecipeOptions): string;
119
125
 
120
126
  declare const ICONBOX_VARIANTS: {
121
127
  readonly primary: true;
128
+ readonly secondary: true;
122
129
  readonly success: true;
123
130
  readonly warning: true;
124
131
  readonly danger: true;
125
132
  readonly info: true;
133
+ readonly neutral: true;
134
+ readonly ghost: true;
126
135
  };
127
136
  declare const ICONBOX_SIZES: {
128
137
  readonly sm: true;
@@ -140,6 +149,7 @@ interface IconBoxRecipeOptions {
140
149
  hovered?: boolean;
141
150
  focused?: boolean;
142
151
  active?: boolean;
152
+ pill?: boolean;
143
153
  }
144
154
  declare function getIconBoxClasses(opts?: IconBoxRecipeOptions): string;
145
155
 
@@ -150,6 +160,11 @@ declare function getIconBoxClasses(opts?: IconBoxRecipeOptions): string;
150
160
  interface TestimonialRecipeOptions {
151
161
  disabled?: boolean;
152
162
  loading?: boolean;
163
+ interactive?: boolean;
164
+ hovered?: boolean;
165
+ focused?: boolean;
166
+ active?: boolean;
167
+ fullHeight?: boolean;
153
168
  }
154
169
  declare function getTestimonialClasses(opts?: TestimonialRecipeOptions): string;
155
170
  declare function getTestimonialQuoteClasses(): string;
@@ -166,6 +181,11 @@ interface PricingCardRecipeOptions {
166
181
  featured?: boolean;
167
182
  disabled?: boolean;
168
183
  loading?: boolean;
184
+ interactive?: boolean;
185
+ hovered?: boolean;
186
+ focused?: boolean;
187
+ active?: boolean;
188
+ fullHeight?: boolean;
169
189
  }
170
190
  declare function getPricingCardClasses(opts?: PricingCardRecipeOptions): string;
171
191
  declare function getPricingCardBadgeClasses(): string;
@@ -187,10 +207,14 @@ interface RatingRecipeOptions {
187
207
  size?: RatingSize;
188
208
  disabled?: boolean;
189
209
  loading?: boolean;
210
+ interactive?: boolean;
211
+ hovered?: boolean;
212
+ focused?: boolean;
213
+ active?: boolean;
190
214
  }
191
215
  declare function getRatingClasses(opts?: RatingRecipeOptions): string;
192
216
  declare function getRatingStarsClasses(): string;
193
217
  declare function getRatingStarClasses(isFilled?: boolean): string;
194
218
  declare function getRatingTextClasses(): string;
195
219
 
196
- export { type BadgeRecipeOptions, type BadgeSize, type BadgeVariant, type ButtonRecipeOptions, type ButtonSize, type ButtonVariant, type CardRecipeOptions, type CardVariant, type IconBoxRecipeOptions, type IconBoxSize, type IconBoxVariant, type InputRecipeOptions, type InputSize, type InputState, type PricingCardRecipeOptions, type RatingRecipeOptions, type TestimonialRecipeOptions, getBadgeClasses, getButtonClasses, getCardClasses, getIconBoxClasses, getInputClasses, getPricingCardBadgeClasses, getPricingCardClasses, getPricingCardDescriptionClasses, getPricingCardPriceClasses, getPricingCardPriceContainerClasses, getRatingClasses, getRatingStarClasses, getRatingStarsClasses, getRatingTextClasses, getTestimonialAuthorClasses, getTestimonialAuthorInfoClasses, getTestimonialAuthorNameClasses, getTestimonialAuthorTitleClasses, getTestimonialClasses, getTestimonialQuoteClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectreStyles, spectreUtilitiesStylesPath };
220
+ export { type BadgeRecipeOptions, type BadgeSize, type BadgeVariant, type ButtonRecipeOptions, type ButtonSize, type ButtonVariant, type CardRecipeOptions, type CardVariant, type IconBoxRecipeOptions, type IconBoxSize, type IconBoxVariant, type InputRecipeOptions, type InputSize, type InputState, type PricingCardRecipeOptions, type RatingRecipeOptions, type TestimonialRecipeOptions, getBadgeClasses, getButtonClasses, getCardClasses, getIconBoxClasses, getInputClasses, getPricingCardBadgeClasses, getPricingCardClasses, getPricingCardDescriptionClasses, getPricingCardPriceClasses, getPricingCardPriceContainerClasses, getRatingClasses, getRatingStarClasses, getRatingStarsClasses, getRatingTextClasses, getTestimonialAuthorClasses, getTestimonialAuthorInfoClasses, getTestimonialAuthorNameClasses, getTestimonialAuthorTitleClasses, getTestimonialClasses, getTestimonialQuoteClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectreIndexStylesPath, spectreStyles, spectreUtilitiesStylesPath };
package/dist/index.js CHANGED
@@ -134,7 +134,8 @@ function getCardClasses(opts = {}) {
134
134
  disabled = false,
135
135
  loading = false,
136
136
  hovered = false,
137
- focused = false
137
+ focused = false,
138
+ active = false
138
139
  } = opts;
139
140
  const variant = resolveOption({
140
141
  name: "card variant",
@@ -158,7 +159,8 @@ function getCardClasses(opts = {}) {
158
159
  disabled && "sp-card--disabled",
159
160
  loading && "sp-card--loading",
160
161
  hovered && "sp-card--hover",
161
- focused && "sp-card--focus"
162
+ focused && "sp-card--focus",
163
+ active && "sp-card--active"
162
164
  );
163
165
  }
164
166
 
@@ -182,7 +184,10 @@ function getInputClasses(opts = {}) {
182
184
  fullWidth = false,
183
185
  pill = false,
184
186
  focused = false,
185
- hovered = false
187
+ hovered = false,
188
+ active = false,
189
+ disabled = false,
190
+ loading = false
186
191
  } = opts;
187
192
  const state = resolveOption({
188
193
  name: "input state",
@@ -208,10 +213,11 @@ function getInputClasses(opts = {}) {
208
213
  state === "error" && "sp-input--error",
209
214
  state === "success" && "sp-input--success",
210
215
  // Visual state only; actual disabled attribute is handled by adapters.
211
- state === "disabled" && "sp-input--disabled",
212
- state === "loading" && "sp-input--loading",
216
+ (state === "disabled" || disabled) && "sp-input--disabled",
217
+ (state === "loading" || loading) && "sp-input--loading",
213
218
  focused && "sp-input--focus",
214
219
  hovered && "sp-input--hover",
220
+ active && "sp-input--active",
215
221
  fullWidth && "sp-input--full",
216
222
  pill && "sp-input--pill"
217
223
  );
@@ -225,7 +231,8 @@ var BADGE_VARIANTS = {
225
231
  warning: true,
226
232
  danger: true,
227
233
  neutral: true,
228
- info: true
234
+ info: true,
235
+ ghost: true
229
236
  };
230
237
  var BADGE_SIZES = {
231
238
  sm: true,
@@ -253,7 +260,8 @@ function getBadgeClasses(opts = {}) {
253
260
  warning: "sp-badge--warning",
254
261
  danger: "sp-badge--danger",
255
262
  neutral: "sp-badge--neutral",
256
- info: "sp-badge--info"
263
+ info: "sp-badge--info",
264
+ ghost: "sp-badge--ghost"
257
265
  };
258
266
  const variantClass = variantMap[variant];
259
267
  const sizeMap = {
@@ -278,10 +286,13 @@ function getBadgeClasses(opts = {}) {
278
286
  // src/recipes/iconbox.ts
279
287
  var ICONBOX_VARIANTS = {
280
288
  primary: true,
289
+ secondary: true,
281
290
  success: true,
282
291
  warning: true,
283
292
  danger: true,
284
- info: true
293
+ info: true,
294
+ neutral: true,
295
+ ghost: true
285
296
  };
286
297
  var ICONBOX_SIZES = {
287
298
  sm: true,
@@ -297,7 +308,8 @@ function getIconBoxClasses(opts = {}) {
297
308
  interactive = false,
298
309
  hovered = false,
299
310
  focused = false,
300
- active = false
311
+ active = false,
312
+ pill = false
301
313
  } = opts;
302
314
  const variant = resolveOption({
303
315
  name: "icon box variant",
@@ -313,10 +325,13 @@ function getIconBoxClasses(opts = {}) {
313
325
  });
314
326
  const variantMap = {
315
327
  primary: "sp-iconbox--primary",
328
+ secondary: "sp-iconbox--secondary",
316
329
  success: "sp-iconbox--success",
317
330
  warning: "sp-iconbox--warning",
318
331
  danger: "sp-iconbox--danger",
319
- info: "sp-iconbox--info"
332
+ info: "sp-iconbox--info",
333
+ neutral: "sp-iconbox--neutral",
334
+ ghost: "sp-iconbox--ghost"
320
335
  };
321
336
  const variantClass = variantMap[variant];
322
337
  const sizeMap = {
@@ -334,17 +349,31 @@ function getIconBoxClasses(opts = {}) {
334
349
  interactive && "sp-iconbox--interactive",
335
350
  hovered && "sp-iconbox--hover",
336
351
  focused && "sp-iconbox--focus",
337
- active && "sp-iconbox--active"
352
+ active && "sp-iconbox--active",
353
+ pill && "sp-iconbox--pill"
338
354
  );
339
355
  }
340
356
 
341
357
  // src/recipes/testimonial.ts
342
358
  function getTestimonialClasses(opts = {}) {
343
- const { disabled = false, loading = false } = opts;
359
+ const {
360
+ disabled = false,
361
+ loading = false,
362
+ interactive = false,
363
+ hovered = false,
364
+ focused = false,
365
+ active = false,
366
+ fullHeight = false
367
+ } = opts;
344
368
  return cx(
345
369
  "sp-testimonial",
346
370
  disabled && "sp-testimonial--disabled",
347
- loading && "sp-testimonial--loading"
371
+ loading && "sp-testimonial--loading",
372
+ interactive && "sp-testimonial--interactive",
373
+ hovered && "sp-testimonial--hover",
374
+ focused && "sp-testimonial--focus",
375
+ active && "sp-testimonial--active",
376
+ fullHeight && "sp-testimonial--full"
348
377
  );
349
378
  }
350
379
  function getTestimonialQuoteClasses() {
@@ -365,12 +394,26 @@ function getTestimonialAuthorTitleClasses() {
365
394
 
366
395
  // src/recipes/pricing-card.ts
367
396
  function getPricingCardClasses(opts = {}) {
368
- const { featured = false, disabled = false, loading = false } = opts;
397
+ const {
398
+ featured = false,
399
+ disabled = false,
400
+ loading = false,
401
+ interactive = false,
402
+ hovered = false,
403
+ focused = false,
404
+ active = false,
405
+ fullHeight = false
406
+ } = opts;
369
407
  return cx(
370
408
  "sp-pricing-card",
371
409
  featured && "sp-pricing-card--featured",
372
410
  disabled && "sp-pricing-card--disabled",
373
- loading && "sp-pricing-card--loading"
411
+ loading && "sp-pricing-card--loading",
412
+ interactive && "sp-pricing-card--interactive",
413
+ hovered && "sp-pricing-card--hover",
414
+ focused && "sp-pricing-card--focus",
415
+ active && "sp-pricing-card--active",
416
+ fullHeight && "sp-pricing-card--full"
374
417
  );
375
418
  }
376
419
  function getPricingCardBadgeClasses() {
@@ -393,7 +436,15 @@ var RATING_SIZES = {
393
436
  lg: true
394
437
  };
395
438
  function getRatingClasses(opts = {}) {
396
- const { size: sizeInput, disabled = false, loading = false } = opts;
439
+ const {
440
+ size: sizeInput,
441
+ disabled = false,
442
+ loading = false,
443
+ interactive = false,
444
+ hovered = false,
445
+ focused = false,
446
+ active = false
447
+ } = opts;
397
448
  const size = resolveOption({
398
449
  name: "rating size",
399
450
  value: sizeInput,
@@ -410,7 +461,11 @@ function getRatingClasses(opts = {}) {
410
461
  "sp-rating",
411
462
  sizeClass,
412
463
  disabled && "sp-rating--disabled",
413
- loading && "sp-rating--loading"
464
+ loading && "sp-rating--loading",
465
+ interactive && "sp-rating--interactive",
466
+ hovered && "sp-rating--hover",
467
+ focused && "sp-rating--focus",
468
+ active && "sp-rating--active"
414
469
  );
415
470
  }
416
471
  function getRatingStarsClasses() {
@@ -426,6 +481,6 @@ function getRatingTextClasses() {
426
481
  return cx("sp-rating-text");
427
482
  }
428
483
 
429
- export { getBadgeClasses, getButtonClasses, getCardClasses, getIconBoxClasses, getInputClasses, getPricingCardBadgeClasses, getPricingCardClasses, getPricingCardDescriptionClasses, getPricingCardPriceClasses, getPricingCardPriceContainerClasses, getRatingClasses, getRatingStarClasses, getRatingStarsClasses, getRatingTextClasses, getTestimonialAuthorClasses, getTestimonialAuthorInfoClasses, getTestimonialAuthorNameClasses, getTestimonialAuthorTitleClasses, getTestimonialClasses, getTestimonialQuoteClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectreStyles, spectreUtilitiesStylesPath };
484
+ export { getBadgeClasses, getButtonClasses, getCardClasses, getIconBoxClasses, getInputClasses, getPricingCardBadgeClasses, getPricingCardClasses, getPricingCardDescriptionClasses, getPricingCardPriceClasses, getPricingCardPriceContainerClasses, getRatingClasses, getRatingStarClasses, getRatingStarsClasses, getRatingTextClasses, getTestimonialAuthorClasses, getTestimonialAuthorInfoClasses, getTestimonialAuthorNameClasses, getTestimonialAuthorTitleClasses, getTestimonialClasses, getTestimonialQuoteClasses, spectreBaseStylesPath, spectreComponentsStylesPath, spectreIndexStylesPath, spectreStyles, spectreUtilitiesStylesPath };
430
485
  //# sourceMappingURL=index.js.map
431
486
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/css-constants.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","../src/recipes/testimonial.ts","../src/recipes/pricing-card.ts","../src/recipes/rating.ts"],"names":[],"mappings":"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","file":"index.js","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","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 BUTTON_VARIANTS = {\n primary: true,\n secondary: true,\n ghost: true,\n danger: true,\n success: true,\n cta: true,\n accent: true,\n} as const;\n\nconst BUTTON_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport type ButtonVariant = keyof typeof BUTTON_VARIANTS;\nexport type ButtonSize = keyof typeof BUTTON_SIZES;\n\n/**\n * Generate classes for the Button component.\n * @sync v2.x - Synced with latest design tokens, including CTA variants.\n */\nexport interface ButtonRecipeOptions {\n variant?: ButtonVariant;\n size?: ButtonSize;\n fullWidth?: boolean;\n loading?: boolean;\n disabled?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n iconOnly?: boolean;\n pill?: 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 hovered = false,\n focused = false,\n active = false,\n iconOnly = false,\n pill = 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 cta: \"sp-btn--cta\",\n accent: \"sp-btn--accent\",\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 hovered && \"sp-btn--hover\",\n focused && \"sp-btn--focus\",\n active && \"sp-btn--active\",\n iconOnly && \"sp-btn--icon\",\n pill && \"sp-btn--pill\",\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst CARD_VARIANTS = {\n elevated: true,\n flat: true,\n outline: true,\n ghost: true,\n} as const;\n\nexport type CardVariant = keyof typeof CARD_VARIANTS;\n\nexport interface CardRecipeOptions {\n variant?: CardVariant;\n interactive?: boolean; // hover/focus styles\n padded?: boolean; // apply default padding\n fullHeight?: boolean;\n disabled?: boolean;\n loading?: boolean;\n hovered?: boolean;\n focused?: boolean;\n}\n\nexport function getCardClasses(opts: CardRecipeOptions = {}): string {\n const {\n variant: variantInput,\n interactive = false,\n padded = false,\n fullHeight = false,\n disabled = false,\n loading = false,\n hovered = false,\n focused = 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 disabled && \"sp-card--disabled\",\n loading && \"sp-card--loading\",\n hovered && \"sp-card--hover\",\n focused && \"sp-card--focus\",\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst INPUT_STATES = {\n default: true,\n error: true,\n success: true,\n disabled: true,\n loading: true,\n} as const;\n\nconst INPUT_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport type InputState = keyof typeof INPUT_STATES;\nexport type InputSize = keyof typeof INPUT_SIZES;\n\nexport interface InputRecipeOptions {\n state?: InputState;\n size?: InputSize;\n fullWidth?: boolean;\n pill?: boolean;\n focused?: boolean;\n hovered?: boolean;\n}\n\nexport function getInputClasses(opts: InputRecipeOptions = {}): string {\n const {\n state: stateInput,\n size: sizeInput,\n fullWidth = false,\n pill = false,\n focused = false,\n hovered = false,\n } = 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 state === \"loading\" && \"sp-input--loading\",\n focused && \"sp-input--focus\",\n hovered && \"sp-input--hover\",\n fullWidth && \"sp-input--full\",\n pill && \"sp-input--pill\",\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst BADGE_VARIANTS = {\n primary: true,\n secondary: true,\n success: true,\n warning: true,\n danger: true,\n neutral: true,\n info: true,\n} as const;\n\nconst BADGE_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport type BadgeVariant = keyof typeof BADGE_VARIANTS;\nexport type BadgeSize = keyof typeof BADGE_SIZES;\n\n/**\n * Generate classes for the Badge component.\n * @sync v2.x - Synced with latest design tokens, including hover states.\n */\nexport interface BadgeRecipeOptions {\n variant?: BadgeVariant;\n size?: BadgeSize;\n interactive?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n disabled?: boolean;\n loading?: boolean;\n}\n\nexport function getBadgeClasses(opts: BadgeRecipeOptions = {}): string {\n const { variant: variantInput, size: sizeInput, interactive, hovered, focused, active, disabled, loading } = 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 secondary: \"sp-badge--secondary\",\n success: \"sp-badge--success\",\n warning: \"sp-badge--warning\",\n danger: \"sp-badge--danger\",\n neutral: \"sp-badge--neutral\",\n info: \"sp-badge--info\",\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(\n \"sp-badge\",\n variantClass,\n sizeClass,\n interactive && \"sp-badge--interactive\",\n hovered && \"sp-badge--hover\",\n focused && \"sp-badge--focus\",\n active && \"sp-badge--active\",\n disabled && \"sp-badge--disabled\",\n loading && \"sp-badge--loading\"\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\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 type IconBoxVariant = keyof typeof ICONBOX_VARIANTS;\nexport type IconBoxSize = keyof typeof ICONBOX_SIZES;\n\nexport interface IconBoxRecipeOptions {\n variant?: IconBoxVariant;\n size?: IconBoxSize;\n disabled?: boolean;\n loading?: boolean;\n interactive?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n}\n\nexport function getIconBoxClasses(opts: IconBoxRecipeOptions = {}): string {\n const {\n variant: variantInput,\n size: sizeInput,\n disabled = false,\n loading = false,\n interactive = false,\n hovered = false,\n focused = false,\n active = false,\n } = 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(\n \"sp-iconbox\",\n variantClass,\n sizeClass,\n disabled && \"sp-iconbox--disabled\",\n loading && \"sp-iconbox--loading\",\n interactive && \"sp-iconbox--interactive\",\n hovered && \"sp-iconbox--hover\",\n focused && \"sp-iconbox--focus\",\n active && \"sp-iconbox--active\"\n );\n}\n","import { cx } from \"../internal/cx\";\n\n/**\n * Generate classes for the Testimonial component.\n * @sync v2.x - Synced with latest design tokens.\n */\nexport interface TestimonialRecipeOptions {\n disabled?: boolean;\n loading?: boolean;\n}\n\nexport function getTestimonialClasses(opts: TestimonialRecipeOptions = {}): string {\n const { disabled = false, loading = false } = opts;\n return cx(\n \"sp-testimonial\",\n disabled && \"sp-testimonial--disabled\",\n loading && \"sp-testimonial--loading\"\n );\n}\n\nexport function getTestimonialQuoteClasses(): string {\n return cx(\"sp-testimonial-quote\");\n}\n\nexport function getTestimonialAuthorClasses(): string {\n return cx(\"sp-testimonial-author\");\n}\n\nexport function getTestimonialAuthorInfoClasses(): string {\n return cx(\"sp-testimonial-author-info\");\n}\n\nexport function getTestimonialAuthorNameClasses(): string {\n return cx(\"sp-testimonial-author-name\");\n}\n\nexport function getTestimonialAuthorTitleClasses(): string {\n return cx(\"sp-testimonial-author-title\");\n}\n","import { cx } from \"../internal/cx\";\n\n/**\n * Generate classes for the PricingCard component.\n * @sync v2.x - Synced with latest design tokens.\n */\nexport interface PricingCardRecipeOptions {\n featured?: boolean;\n disabled?: boolean;\n loading?: boolean;\n}\n\nexport function getPricingCardClasses(opts: PricingCardRecipeOptions = {}): string {\n const { featured = false, disabled = false, loading = false } = opts;\n return cx(\n \"sp-pricing-card\",\n featured && \"sp-pricing-card--featured\",\n disabled && \"sp-pricing-card--disabled\",\n loading && \"sp-pricing-card--loading\"\n );\n}\n\nexport function getPricingCardBadgeClasses(): string {\n return cx(\"sp-pricing-card-badge\");\n}\n\nexport function getPricingCardPriceContainerClasses(): string {\n return cx(\"sp-pricing-card-price-container\");\n}\n\nexport function getPricingCardPriceClasses(): string {\n return cx(\"sp-pricing-card-price\");\n}\n\nexport function getPricingCardDescriptionClasses(): string {\n return cx(\"sp-pricing-card-description\");\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst RATING_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport type RatingSize = keyof typeof RATING_SIZES;\n\n/**\n * Generate classes for the Rating component.\n * @sync v2.x - Synced with latest design tokens.\n */\nexport interface RatingRecipeOptions {\n size?: RatingSize;\n disabled?: boolean;\n loading?: boolean;\n}\n\nexport function getRatingClasses(opts: RatingRecipeOptions = {}): string {\n const { size: sizeInput, disabled = false, loading = false } = opts;\n\n const size = resolveOption({\n name: \"rating size\",\n value: sizeInput,\n allowed: RATING_SIZES,\n fallback: \"md\",\n });\n\n const sizeMap: Record<RatingSize, string> = {\n sm: \"sp-rating--sm\",\n md: \"sp-rating--md\",\n lg: \"sp-rating--lg\",\n };\n const sizeClass = sizeMap[size];\n\n return cx(\n \"sp-rating\",\n sizeClass,\n disabled && \"sp-rating--disabled\",\n loading && \"sp-rating--loading\"\n );\n}\n\nexport function getRatingStarsClasses(): string {\n return cx(\"sp-rating-stars\");\n}\n\nexport function getRatingStarClasses(isFilled: boolean = false): string {\n return cx(\n \"sp-rating-star\",\n isFilled && \"sp-rating-star--filled\"\n );\n}\n\nexport function getRatingTextClasses(): string {\n return cx(\"sp-rating-text\");\n}\n"]}
1
+ {"version":3,"sources":["../src/css-constants.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","../src/recipes/testimonial.ts","../src/recipes/pricing-card.ts","../src/recipes/rating.ts"],"names":[],"mappings":"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","file":"index.js","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","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 BUTTON_VARIANTS = {\n primary: true,\n secondary: true,\n ghost: true,\n danger: true,\n success: true,\n cta: true,\n accent: true,\n} as const;\n\nconst BUTTON_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport type ButtonVariant = keyof typeof BUTTON_VARIANTS;\nexport type ButtonSize = keyof typeof BUTTON_SIZES;\n\n/**\n * Generate classes for the Button component.\n * @sync v2.x - Synced with latest design tokens, including CTA variants.\n */\nexport interface ButtonRecipeOptions {\n variant?: ButtonVariant;\n size?: ButtonSize;\n fullWidth?: boolean;\n loading?: boolean;\n disabled?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n iconOnly?: boolean;\n pill?: 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 hovered = false,\n focused = false,\n active = false,\n iconOnly = false,\n pill = 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 cta: \"sp-btn--cta\",\n accent: \"sp-btn--accent\",\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 hovered && \"sp-btn--hover\",\n focused && \"sp-btn--focus\",\n active && \"sp-btn--active\",\n iconOnly && \"sp-btn--icon\",\n pill && \"sp-btn--pill\",\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst CARD_VARIANTS = {\n elevated: true,\n flat: true,\n outline: true,\n ghost: true,\n} as const;\n\nexport type CardVariant = keyof typeof CARD_VARIANTS;\n\nexport interface CardRecipeOptions {\n variant?: CardVariant;\n interactive?: boolean; // hover/focus styles\n padded?: boolean; // apply default padding\n fullHeight?: boolean;\n disabled?: boolean;\n loading?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n}\n\nexport function getCardClasses(opts: CardRecipeOptions = {}): string {\n const {\n variant: variantInput,\n interactive = false,\n padded = false,\n fullHeight = false,\n disabled = false,\n loading = false,\n hovered = false,\n focused = false,\n active = 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 disabled && \"sp-card--disabled\",\n loading && \"sp-card--loading\",\n hovered && \"sp-card--hover\",\n focused && \"sp-card--focus\",\n active && \"sp-card--active\",\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst INPUT_STATES = {\n default: true,\n error: true,\n success: true,\n disabled: true,\n loading: true,\n} as const;\n\nconst INPUT_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport type InputState = keyof typeof INPUT_STATES;\nexport type InputSize = keyof typeof INPUT_SIZES;\n\nexport interface InputRecipeOptions {\n state?: InputState;\n size?: InputSize;\n fullWidth?: boolean;\n pill?: boolean;\n focused?: boolean;\n hovered?: boolean;\n active?: boolean;\n disabled?: boolean;\n loading?: boolean;\n}\n\nexport function getInputClasses(opts: InputRecipeOptions = {}): string {\n const {\n state: stateInput,\n size: sizeInput,\n fullWidth = false,\n pill = false,\n focused = false,\n hovered = false,\n active = false,\n disabled = false,\n loading = false,\n } = 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\" || disabled) && \"sp-input--disabled\",\n (state === \"loading\" || loading) && \"sp-input--loading\",\n focused && \"sp-input--focus\",\n hovered && \"sp-input--hover\",\n active && \"sp-input--active\",\n fullWidth && \"sp-input--full\",\n pill && \"sp-input--pill\",\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst BADGE_VARIANTS = {\n primary: true,\n secondary: true,\n success: true,\n warning: true,\n danger: true,\n neutral: true,\n info: true,\n ghost: true,\n} as const;\n\nconst BADGE_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport type BadgeVariant = keyof typeof BADGE_VARIANTS;\nexport type BadgeSize = keyof typeof BADGE_SIZES;\n\n/**\n * Generate classes for the Badge component.\n * @sync v2.x - Synced with latest design tokens, including hover states.\n */\nexport interface BadgeRecipeOptions {\n variant?: BadgeVariant;\n size?: BadgeSize;\n interactive?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n disabled?: boolean;\n loading?: boolean;\n}\n\nexport function getBadgeClasses(opts: BadgeRecipeOptions = {}): string {\n const { variant: variantInput, size: sizeInput, interactive, hovered, focused, active, disabled, loading } = 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 secondary: \"sp-badge--secondary\",\n success: \"sp-badge--success\",\n warning: \"sp-badge--warning\",\n danger: \"sp-badge--danger\",\n neutral: \"sp-badge--neutral\",\n info: \"sp-badge--info\",\n ghost: \"sp-badge--ghost\",\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(\n \"sp-badge\",\n variantClass,\n sizeClass,\n interactive && \"sp-badge--interactive\",\n hovered && \"sp-badge--hover\",\n focused && \"sp-badge--focus\",\n active && \"sp-badge--active\",\n disabled && \"sp-badge--disabled\",\n loading && \"sp-badge--loading\"\n );\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst ICONBOX_VARIANTS = {\n primary: true,\n secondary: true,\n success: true,\n warning: true,\n danger: true,\n info: true,\n neutral: true,\n ghost: true,\n} as const;\n\nconst ICONBOX_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport type IconBoxVariant = keyof typeof ICONBOX_VARIANTS;\nexport type IconBoxSize = keyof typeof ICONBOX_SIZES;\n\nexport interface IconBoxRecipeOptions {\n variant?: IconBoxVariant;\n size?: IconBoxSize;\n disabled?: boolean;\n loading?: boolean;\n interactive?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n pill?: boolean;\n}\n\nexport function getIconBoxClasses(opts: IconBoxRecipeOptions = {}): string {\n const {\n variant: variantInput,\n size: sizeInput,\n disabled = false,\n loading = false,\n interactive = false,\n hovered = false,\n focused = false,\n active = false,\n pill = false,\n } = 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 secondary: \"sp-iconbox--secondary\",\n success: \"sp-iconbox--success\",\n warning: \"sp-iconbox--warning\",\n danger: \"sp-iconbox--danger\",\n info: \"sp-iconbox--info\",\n neutral: \"sp-iconbox--neutral\",\n ghost: \"sp-iconbox--ghost\",\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(\n \"sp-iconbox\",\n variantClass,\n sizeClass,\n disabled && \"sp-iconbox--disabled\",\n loading && \"sp-iconbox--loading\",\n interactive && \"sp-iconbox--interactive\",\n hovered && \"sp-iconbox--hover\",\n focused && \"sp-iconbox--focus\",\n active && \"sp-iconbox--active\",\n pill && \"sp-iconbox--pill\"\n );\n}\n","import { cx } from \"../internal/cx\";\n\n/**\n * Generate classes for the Testimonial component.\n * @sync v2.x - Synced with latest design tokens.\n */\nexport interface TestimonialRecipeOptions {\n disabled?: boolean;\n loading?: boolean;\n interactive?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n fullHeight?: boolean;\n}\n\nexport function getTestimonialClasses(opts: TestimonialRecipeOptions = {}): string {\n const {\n disabled = false,\n loading = false,\n interactive = false,\n hovered = false,\n focused = false,\n active = false,\n fullHeight = false,\n } = opts;\n\n return cx(\n \"sp-testimonial\",\n disabled && \"sp-testimonial--disabled\",\n loading && \"sp-testimonial--loading\",\n interactive && \"sp-testimonial--interactive\",\n hovered && \"sp-testimonial--hover\",\n focused && \"sp-testimonial--focus\",\n active && \"sp-testimonial--active\",\n fullHeight && \"sp-testimonial--full\"\n );\n}\n\nexport function getTestimonialQuoteClasses(): string {\n return cx(\"sp-testimonial-quote\");\n}\n\nexport function getTestimonialAuthorClasses(): string {\n return cx(\"sp-testimonial-author\");\n}\n\nexport function getTestimonialAuthorInfoClasses(): string {\n return cx(\"sp-testimonial-author-info\");\n}\n\nexport function getTestimonialAuthorNameClasses(): string {\n return cx(\"sp-testimonial-author-name\");\n}\n\nexport function getTestimonialAuthorTitleClasses(): string {\n return cx(\"sp-testimonial-author-title\");\n}\n","import { cx } from \"../internal/cx\";\n\n/**\n * Generate classes for the PricingCard component.\n * @sync v2.x - Synced with latest design tokens.\n */\nexport interface PricingCardRecipeOptions {\n featured?: boolean;\n disabled?: boolean;\n loading?: boolean;\n interactive?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n fullHeight?: boolean;\n}\n\nexport function getPricingCardClasses(opts: PricingCardRecipeOptions = {}): string {\n const {\n featured = false,\n disabled = false,\n loading = false,\n interactive = false,\n hovered = false,\n focused = false,\n active = false,\n fullHeight = false,\n } = opts;\n\n return cx(\n \"sp-pricing-card\",\n featured && \"sp-pricing-card--featured\",\n disabled && \"sp-pricing-card--disabled\",\n loading && \"sp-pricing-card--loading\",\n interactive && \"sp-pricing-card--interactive\",\n hovered && \"sp-pricing-card--hover\",\n focused && \"sp-pricing-card--focus\",\n active && \"sp-pricing-card--active\",\n fullHeight && \"sp-pricing-card--full\"\n );\n}\n\nexport function getPricingCardBadgeClasses(): string {\n return cx(\"sp-pricing-card-badge\");\n}\n\nexport function getPricingCardPriceContainerClasses(): string {\n return cx(\"sp-pricing-card-price-container\");\n}\n\nexport function getPricingCardPriceClasses(): string {\n return cx(\"sp-pricing-card-price\");\n}\n\nexport function getPricingCardDescriptionClasses(): string {\n return cx(\"sp-pricing-card-description\");\n}\n","import { cx } from \"../internal/cx\";\nimport { resolveOption } from \"../internal/resolve-option\";\n\nconst RATING_SIZES = {\n sm: true,\n md: true,\n lg: true,\n} as const;\n\nexport type RatingSize = keyof typeof RATING_SIZES;\n\n/**\n * Generate classes for the Rating component.\n * @sync v2.x - Synced with latest design tokens.\n */\nexport interface RatingRecipeOptions {\n size?: RatingSize;\n disabled?: boolean;\n loading?: boolean;\n interactive?: boolean;\n hovered?: boolean;\n focused?: boolean;\n active?: boolean;\n}\n\nexport function getRatingClasses(opts: RatingRecipeOptions = {}): string {\n const {\n size: sizeInput,\n disabled = false,\n loading = false,\n interactive = false,\n hovered = false,\n focused = false,\n active = false,\n } = opts;\n\n const size = resolveOption({\n name: \"rating size\",\n value: sizeInput,\n allowed: RATING_SIZES,\n fallback: \"md\",\n });\n\n const sizeMap: Record<RatingSize, string> = {\n sm: \"sp-rating--sm\",\n md: \"sp-rating--md\",\n lg: \"sp-rating--lg\",\n };\n const sizeClass = sizeMap[size];\n\n return cx(\n \"sp-rating\",\n sizeClass,\n disabled && \"sp-rating--disabled\",\n loading && \"sp-rating--loading\",\n interactive && \"sp-rating--interactive\",\n hovered && \"sp-rating--hover\",\n focused && \"sp-rating--focus\",\n active && \"sp-rating--active\"\n );\n}\n\nexport function getRatingStarsClasses(): string {\n return cx(\"sp-rating-stars\");\n}\n\nexport function getRatingStarClasses(isFilled: boolean = false): string {\n return cx(\n \"sp-rating-star\",\n isFilled && \"sp-rating-star--filled\"\n );\n}\n\nexport function getRatingTextClasses(): string {\n return cx(\"sp-rating-text\");\n}\n"]}
@@ -3,15 +3,18 @@
3
3
  --sp-surface-card: #ffffff;
4
4
  --sp-surface-input: #ffffff;
5
5
  --sp-surface-overlay: rgba(20, 27, 36, 0.6);
6
+ --sp-surface-alternate: #eef1f6;
6
7
  --sp-surface-hero: linear-gradient(135deg, #5b6ee1 0%, #6f3fd7 100%);
7
8
  --sp-text-on-page-default: #141b24;
8
9
  --sp-text-on-page-muted: #4b576a;
9
10
  --sp-text-on-page-subtle: #657287;
10
11
  --sp-text-on-page-meta: #657287;
12
+ --sp-text-on-page-brand: #1f57db;
11
13
  --sp-text-on-surface-default: #141b24;
12
14
  --sp-text-on-surface-muted: #4b576a;
13
15
  --sp-text-on-surface-subtle: #657287;
14
16
  --sp-text-on-surface-meta: #657287;
17
+ --sp-text-on-surface-brand: #1f57db;
15
18
  --sp-component-card-text: #141b24;
16
19
  --sp-component-card-text-muted: #4b576a;
17
20
  --sp-component-input-text: #141b24;
@@ -110,20 +113,8 @@
110
113
  --sp-color-focus-primary: #336df4;
111
114
  --sp-color-focus-error: #ef4444;
112
115
  --sp-color-focus-info: #0369a1;
113
- --sp-color-white-0: #;
114
- --sp-color-white-1: f;
115
- --sp-color-white-2: f;
116
- --sp-color-white-3: f;
117
- --sp-color-white-4: f;
118
- --sp-color-white-5: f;
119
- --sp-color-white-6: f;
120
- --sp-color-black-0: #;
121
- --sp-color-black-1: 0;
122
- --sp-color-black-2: 0;
123
- --sp-color-black-3: 0;
124
- --sp-color-black-4: 0;
125
- --sp-color-black-5: 0;
126
- --sp-color-black-6: 0;
116
+ --sp-color-white: #ffffff;
117
+ --sp-color-black: #000000;
127
118
  --sp-space-0: 0rem;
128
119
  --sp-space-4: 0.25rem;
129
120
  --sp-space-8: 0.5rem;
@@ -217,9 +208,9 @@
217
208
  --sp-icon-box-icon-warning: #d48806;
218
209
  --sp-icon-box-icon-danger: #dc2626;
219
210
  --sp-shadow-none: none;
220
- --sp-shadow-sm: 0 1px 2px 0 rgba(34, 43, 56, 0.06);
221
- --sp-shadow-md: 0 2px 6px -1px rgba(34, 43, 56, 0.08);
222
- --sp-shadow-lg: 0 6px 16px -4px rgba(34, 43, 56, 0.12);
211
+ --sp-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.06);
212
+ --sp-shadow-md: 0 2px 6px -1px rgba(0, 0, 0, 0.08);
213
+ --sp-shadow-lg: 0 6px 16px -4px rgba(0, 0, 0, 0.12);
223
214
  --sp-breakpoint-sm: 640px;
224
215
  --sp-breakpoint-md: 768px;
225
216
  --sp-breakpoint-lg: 1024px;
@@ -262,7 +253,7 @@
262
253
  --sp-button-primary-text: #ffffff;
263
254
  --sp-button-primary-textdisabled: #8a96ad;
264
255
  --sp-button-primary-focusring: rgba(14, 165, 233, 0.4);
265
- --sp-button-primary-focusvisible: {colors.info.500} / 0.4;
256
+ --sp-button-primary-focusvisible: rgba(14, 165, 233, 0.4);
266
257
  --sp-button-secondary-bg: #ffffff;
267
258
  --sp-button-secondary-bghover: #f7f8fb;
268
259
  --sp-button-secondary-bgactive: #eef1f6;
@@ -272,7 +263,7 @@
272
263
  --sp-button-secondary-border: #075985;
273
264
  --sp-button-secondary-borderdisabled: #d9dfeb;
274
265
  --sp-button-secondary-focusring: rgba(14, 165, 233, 0.4);
275
- --sp-button-secondary-focusvisible: {colors.info.500} / 0.4;
266
+ --sp-button-secondary-focusvisible: rgba(14, 165, 233, 0.4);
276
267
  --sp-button-ghost-bg: transparent;
277
268
  --sp-button-ghost-bghover: #f0f9ff;
278
269
  --sp-button-ghost-bgactive: #e0f2fe;
@@ -280,7 +271,7 @@
280
271
  --sp-button-ghost-text: #075985;
281
272
  --sp-button-ghost-textdisabled: #8a96ad;
282
273
  --sp-button-ghost-focusring: rgba(14, 165, 233, 0.4);
283
- --sp-button-ghost-focusvisible: {colors.info.500} / 0.4;
274
+ --sp-button-ghost-focusvisible: rgba(14, 165, 233, 0.4);
284
275
  --sp-button-danger-bg: #dc2626;
285
276
  --sp-button-danger-bghover: #b91c1c;
286
277
  --sp-button-danger-bgactive: #991b1b;
@@ -310,7 +301,7 @@
310
301
  --sp-button-accent-text: #ffffff;
311
302
  --sp-button-accent-textdisabled: #8a96ad;
312
303
  --sp-button-accent-focusring: rgba(133, 79, 247, 0.4);
313
- --sp-button-accent-focusvisible: {colors.accent.500} / 0.4;
304
+ --sp-button-accent-focusvisible: rgba(133, 79, 247, 0.4);
314
305
  --sp-form-default-bg: #ffffff;
315
306
  --sp-form-default-border: #b7c1d4;
316
307
  --sp-form-default-text: #141b24;
@@ -318,8 +309,8 @@
318
309
  --sp-form-hover-border: #0ea5e9;
319
310
  --sp-form-focus-border: #0ea5e9;
320
311
  --sp-form-focus-ring: #0ea5e9;
321
- --sp-form-focusvisible-border: {colors.info.500};
322
- --sp-form-focusvisible-ring: {colors.info.500};
312
+ --sp-form-focusvisible-border: #0ea5e9;
313
+ --sp-form-focusvisible-ring: #0ea5e9;
323
314
  --sp-form-valid-border: #22c55e;
324
315
  --sp-form-valid-bg: #f0fdf4;
325
316
  --sp-form-valid-text: #15803d;
@@ -358,16 +349,19 @@
358
349
  --sp-surface-page: #141b24;
359
350
  --sp-surface-card: #222b38;
360
351
  --sp-surface-input: #374253;
361
- --sp-surface-overlay: #222b38;
362
- --sp-surface-hero: linear-gradient(135deg, #401f75 0%, #5d28b8 100%);
352
+ --sp-surface-overlay: rgba(0, 0, 0, 0.6);
353
+ --sp-surface-alternate: #222b38;
354
+ --sp-surface-hero: linear-gradient(135deg, #5d28b8 0%, #401f75 100%);
363
355
  --sp-text-on-page-default: #f7f8fb;
364
356
  --sp-text-on-page-muted: #b7c1d4;
365
357
  --sp-text-on-page-subtle: #8a96ad;
366
358
  --sp-text-on-page-meta: #8a96ad;
359
+ --sp-text-on-page-brand: #5a92ff;
367
360
  --sp-text-on-surface-default: #eef1f6;
368
361
  --sp-text-on-surface-muted: #b7c1d4;
369
362
  --sp-text-on-surface-subtle: #8a96ad;
370
363
  --sp-text-on-surface-meta: #8a96ad;
364
+ --sp-text-on-surface-brand: #5a92ff;
371
365
  --sp-component-card-text: #eef1f6;
372
366
  --sp-component-card-text-muted: #b7c1d4;
373
367
  --sp-component-input-text: #eef1f6;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phcdevworks/spectre-ui",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "description": "@phcdevworks/spectre-ui is the implementation layer between @phcdevworks/spectre-tokens and downstream adapters or apps.",
5
5
  "keywords": [
6
6
  "phcdevworks",
@@ -37,7 +37,7 @@
37
37
  "node": "^22.12.0 || >=24.0.0"
38
38
  },
39
39
  "type": "module",
40
- "packageManager": "npm@11.12.1",
40
+ "packageManager": "npm@11.13.0",
41
41
  "main": "./dist/index.cjs",
42
42
  "module": "./dist/index.js",
43
43
  "types": "./dist/index.d.ts",
@@ -71,7 +71,7 @@
71
71
  "scripts": {
72
72
  "build": "tsup --config tsup.config.ts && npm run build:css",
73
73
  "build:css": "node ./scripts/build-css.mjs",
74
- "ci:verify": "npm run validate:runtime && npm run lint && npm run validate:exports && npm run validate:tokens && npm run build && npm run validate:css-contract && npm test",
74
+ "ci:verify": "npm run validate:runtime && npm run lint && npm run validate:exports && npm run validate:readme && npm run validate:tokens && npm run build && npm run validate:tailwind && npm run validate:css-contract && npm test",
75
75
  "dev": "tsup --config tsup.config.ts --watch",
76
76
  "clean": "rm -rf dist",
77
77
  "lint": "eslint .",
@@ -82,6 +82,9 @@
82
82
  "validate:exports": "node ./scripts/validate-exports.mjs",
83
83
  "validate:exports:update": "node ./scripts/validate-exports.mjs --update",
84
84
  "validate:runtime": "node ./scripts/validate-runtime.mjs",
85
+ "validate:tailwind": "node ./scripts/validate-tailwind-contract.mjs",
86
+ "validate:tailwind:update": "node ./scripts/validate-tailwind-contract.mjs --update",
87
+ "validate:readme": "node ./scripts/validate-readme-contract.mjs",
85
88
  "validate:tokens": "node ./scripts/validate-tokens.mjs"
86
89
  },
87
90
  "publishConfig": {
@@ -92,25 +95,25 @@
92
95
  "typescript": "^5.9 || ^6.0"
93
96
  },
94
97
  "dependencies": {
95
- "@phcdevworks/spectre-tokens": "^2.2.0"
98
+ "@phcdevworks/spectre-tokens": "^2.4.0"
96
99
  },
97
100
  "devDependencies": {
98
101
  "@types/node": "^25.6.0",
99
- "@typescript-eslint/eslint-plugin": "^8.58.1",
100
- "@typescript-eslint/parser": "^8.58.1",
101
- "autoprefixer": "^10.4.27",
102
- "eslint": "^10.2.0",
102
+ "@typescript-eslint/eslint-plugin": "^8.59.0",
103
+ "@typescript-eslint/parser": "^8.59.0",
104
+ "autoprefixer": "^10.5.0",
105
+ "eslint": "^10.2.1",
103
106
  "jiti": "^2.6.1",
104
- "postcss": "^8.5.9",
107
+ "postcss": "^8.5.10",
105
108
  "postcss-cli": "^11.0.1",
106
109
  "postcss-import": "^16.1.1",
107
- "prettier": "^3.8.2",
108
- "tailwindcss": "^4.2.2",
110
+ "prettier": "^3.8.3",
111
+ "tailwindcss": "^4.2.4",
109
112
  "tsup": "^8.5.1",
110
- "typescript": "^6.0.2",
111
- "typescript-eslint": "^8.58.1",
112
- "vite": "^8.0.8",
113
- "vitest": "^4.1.4"
113
+ "typescript": "^6.0.3",
114
+ "typescript-eslint": "^8.59.0",
115
+ "vite": "^8.0.10",
116
+ "vitest": "^4.1.5"
114
117
  },
115
118
  "cSpell.words": [
116
119
  "phcdevworks"