@octavius2929-personal/design-system 0.22.1 → 0.23.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.cjs CHANGED
@@ -458,7 +458,16 @@ var tintaSchema = {
458
458
  var schemas = { tinta: tintaSchema };
459
459
  var schemaNames2 = Object.keys(schemas);
460
460
  var colorTokenNames = Object.keys(schemas.tinta.light.color);
461
+ function isSchemaName(x) {
462
+ return typeof x === "string" && Object.hasOwn(schemas, x);
463
+ }
461
464
  var modeNames2 = ["light", "dark", "sepia", "contrast"];
465
+ function isMode(x) {
466
+ return typeof x === "string" && modeNames2.includes(x);
467
+ }
468
+ function isModePreference(x) {
469
+ return x === "system" || isMode(x);
470
+ }
462
471
  var SYSTEM_MODE_PRECEDENCE = [
463
472
  { query: "(prefers-contrast: more)", mode: "contrast" },
464
473
  { query: "(prefers-color-scheme: dark)", mode: "dark" }
@@ -466,14 +475,36 @@ var SYSTEM_MODE_PRECEDENCE = [
466
475
  function resolveMode(preference, systemMode) {
467
476
  return preference === "system" ? systemMode : preference;
468
477
  }
478
+ function sanitizePersisted(raw) {
479
+ if (!raw || typeof raw !== "object") return {};
480
+ const clean = {};
481
+ if (isSchemaName(raw.schema)) clean.schema = raw.schema;
482
+ if (isModePreference(raw.preference)) clean.preference = raw.preference;
483
+ return clean;
484
+ }
469
485
  function useThemeStore(options, storage, system) {
470
486
  const { defaultSchema = "tinta", defaultMode = "light" } = options;
471
- const [persisted] = (0, import_react6.useState)(() => storage.read());
487
+ const [persisted] = (0, import_react6.useState)(() => sanitizePersisted(storage.read()));
472
488
  const [schema, setSchema] = (0, import_react6.useState)(persisted?.schema ?? defaultSchema);
473
489
  const [preference, setPreference] = (0, import_react6.useState)(
474
490
  persisted?.preference ?? defaultMode
475
491
  );
476
492
  const [systemMode, setSystemMode] = (0, import_react6.useState)(() => system.get());
493
+ const [hydrated, setHydrated] = (0, import_react6.useState)(() => !storage.hydrate);
494
+ (0, import_react6.useEffect)(() => {
495
+ if (!storage.hydrate) return;
496
+ let active2 = true;
497
+ void storage.hydrate().then((raw) => {
498
+ if (!active2) return;
499
+ const clean = sanitizePersisted(raw);
500
+ if (clean.schema) setSchema(clean.schema);
501
+ if (clean.preference) setPreference(clean.preference);
502
+ setHydrated(true);
503
+ });
504
+ return () => {
505
+ active2 = false;
506
+ };
507
+ }, [storage]);
477
508
  (0, import_react6.useEffect)(() => {
478
509
  if (preference !== "system") return;
479
510
  const update = () => setSystemMode(system.get());
@@ -482,14 +513,17 @@ function useThemeStore(options, storage, system) {
482
513
  }, [preference, system]);
483
514
  const mode = resolveMode(preference, systemMode);
484
515
  (0, import_react6.useEffect)(() => {
516
+ if (!hydrated) return;
485
517
  storage.write({ schema, preference });
486
- }, [schema, preference, storage]);
518
+ }, [schema, preference, storage, hydrated]);
487
519
  return (0, import_react6.useMemo)(
488
520
  () => ({
489
521
  schema,
490
522
  mode,
491
523
  preference,
492
- colorTokens: schemas[schema][mode].color,
524
+ // Guard defensivo: un schema/modo inesperado (default inválido del caller) cae a
525
+ // tinta/light en vez de indexar `undefined` y crashear.
526
+ colorTokens: schemas[schema]?.[mode]?.color ?? schemas.tinta.light.color,
493
527
  setSchema,
494
528
  setMode: setPreference,
495
529
  toggleMode: () => setPreference(mode === "dark" ? "light" : "dark"),