{"id":79,"date":"2026-08-14T14:06:57","date_gmt":"2026-08-14T14:06:57","guid":{"rendered":"https:\/\/crystals.rocks\/"},"modified":"2026-08-19T17:39:34","modified_gmt":"2026-08-19T17:39:34","slug":"home","status":"publish","type":"page","link":"https:\/\/crystals.rocks\/he","title":{"rendered":"Home"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"79\" class=\"elementor elementor-79\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-367fe21 e-con-full e-flex e-con e-parent\" data-id=\"367fe21\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d5ea0b0 elementor-widget elementor-widget-html\" data-id=\"d5ea0b0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\r\n<main class=\"crdb-home\" id=\"crdb-home\" data-crdb-home-index-url=\"\" data-crdb-index-url=\"\" data-crdb-language-home=\"\" data-crdb-default-home=\"\" data-crdb-current-language=\"\" data-crdb-default-language=\"\" data-crdb-language-slugs=\"\" data-crdb-collection-url=\"\">\r\n  <header class=\"crdb-hero\">\r\n    <div class=\"crdb-hero__copy\">\r\n      <span class=\"crdb-label\">Open Scientific Crystal Repository<\/span>\r\n      <h1>Crystal &amp; Mineral Database<\/h1>\r\n      <p>Explore structured mineral records with searchable names, formulas and IMA symbols, plus filters for color, hardness, origin and wearability.<\/p>\r\n\r\n      <form class=\"crdb-search\" data-crdb-search data-crdb-collection-link action=\"mineral-collection\/\" method=\"get\">\r\n        <label class=\"crdb-sr\" for=\"crdb-search-input\">Search the crystal database<\/label>\r\n        <div class=\"crdb-search__box\">\r\n          <input id=\"crdb-search-input\" name=\"q\" type=\"search\" placeholder=\"Search name, formula or IMA symbol...\" autocomplete=\"off\" maxlength=\"160\" enterkeyhint=\"search\" spellcheck=\"false\">\r\n          <button type=\"submit\">Search<\/button>\r\n        <\/div>\r\n        <div class=\"crdb-search__status\" data-crdb-search-status data-crdb-localized-dynamic aria-live=\"polite\" hidden><\/div>\r\n      <\/form>\r\n    <\/div>\r\n  <\/header>\r\n\r\n  <section class=\"crdb-stats\" aria-label=\"Database overview\">\r\n    <div><strong data-crdb-total><span data-crdb-total-loading>Growing<\/span><\/strong><span>Mineral Records<\/span><\/div>\r\n    <div><strong>Structured<\/strong><span>Profile Fields<\/span><\/div>\r\n    <div><strong>Open<\/strong><span>Public Access<\/span><\/div>\r\n    <div><strong>Fast<\/strong><span>Local Filtering<\/span><\/div>\r\n  <\/section>\r\n\r\n  <section class=\"crdb-section\" aria-labelledby=\"crdb-about-title\">\r\n    <div class=\"crdb-heading\">\r\n      <div>\r\n        <span>About the database<\/span>\r\n        <h2 id=\"crdb-about-title\">Mineral facts in a consistent structure<\/h2>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"crdb-about\">\r\n      <p class=\"crdb-about__lead\">Crystals.rocks is an open crystal and mineral reference designed for clear comparison and practical research.<\/p>\r\n      <p>Each mineral profile brings classification, crystal structure, physical properties, optical behavior, geological occurrence and safety information together in one readable record. Search is tuned for mineral names, alternative names, chemical formulas and IMA symbols.<\/p>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <section class=\"crdb-section\" id=\"crdb-random\" aria-labelledby=\"crdb-random-title\">\r\n    <div class=\"crdb-heading\">\r\n      <div>\r\n        <span>Random discoveries<\/span>\r\n        <h2 id=\"crdb-random-title\">Featured minerals from the database<\/h2>\r\n      <\/div>\r\n      <span class=\"crdb-heading__count\" data-crdb-random-count data-crdb-localized-dynamic hidden><\/span>\r\n    <\/div>\r\n    <div class=\"crdb-loading\" data-crdb-status data-crdb-localized-dynamic>Loading mineral records...<\/div>\r\n    <div class=\"crdb-minerals\" data-crdb-grid data-crdb-localized-dynamic><\/div>\r\n  <\/section>\r\n\r\n  <section class=\"crdb-section\" aria-labelledby=\"crdb-fields-title\">\r\n    <div class=\"crdb-heading\">\r\n      <div>\r\n        <span>What each record covers<\/span>\r\n        <h2 id=\"crdb-fields-title\">From identification to occurrence<\/h2>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"crdb-fields\">\r\n      <article><span>01<\/span><h3>Classification<\/h3><p>Mineral names, chemical formula, IMA symbol, group, Strunz and Dana classification.<\/p><\/article>\r\n      <article><span>02<\/span><h3>Crystal structure<\/h3><p>Crystal habit, class, space group, unit-cell parameters, faces and twinning.<\/p><\/article>\r\n      <article><span>03<\/span><h3>Physical properties<\/h3><p>Color, luster, streak, transparency, Mohs hardness, cleavage, fracture and density.<\/p><\/article>\r\n      <article><span>04<\/span><h3>Optical properties<\/h3><p>Refractive index, birefringence, dispersion, pleochroism, fluorescence and spectra.<\/p><\/article>\r\n      <article><span>05<\/span><h3>Origin &amp; formation<\/h3><p>Geological setting, paragenesis, associated minerals, type locality and major sources.<\/p><\/article>\r\n      <article><span>06<\/span><h3>Use &amp; safety<\/h3><p>Wearability, varieties, related minerals, health considerations and handling notes.<\/p><\/article>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <section class=\"crdb-note\" aria-labelledby=\"crdb-note-title\">\r\n    <div>\r\n      <span>Open reference commitment<\/span>\r\n      <h2 id=\"crdb-note-title\">Built for objective crystal research<\/h2>\r\n      <p>The database is organized as an educational geological reference for students, researchers, collectors and crystal enthusiasts. Records focus on mineralogical evidence and transparent, comparable attributes.<\/p>\r\n    <\/div>\r\n    <a href=\"mineral-collection\/\" data-crdb-collection-link>Browse the complete database &rarr;<\/a>\r\n  <\/section>\r\n\r\n  <section class=\"crdb-collection-intro\" id=\"mineral-collection\" aria-labelledby=\"crdb-collection-title\">\r\n    <span>Search &amp; filter<\/span>\r\n    <h2 id=\"crdb-collection-title\">Complete mineral collection<\/h2>\r\n    <p>Refine the database by name, color, wearability, hardness and country of origin.<\/p>\r\n  <\/section>\r\n<\/main>\r\n\r\n<style>\r\n  .crdb-home {\r\n    --ink: #1b1d21;\r\n    --muted: #656a73;\r\n    --line: #dfe2e6;\r\n    --line-strong: #c5cad1;\r\n    --paper: #ffffff;\r\n    --soft: #f6f7f8;\r\n    --soft2: #eef0f3;\r\n    --accent: #303844;\r\n    --accent2: #7a5833;\r\n    --shadow-sm: 0 8px 24px rgba(27, 29, 33, .055);\r\n    --shadow-md: 0 18px 44px rgba(27, 29, 33, .09);\r\n    width: min(1240px, calc(100% - 32px));\r\n    margin: 0 auto;\r\n    padding: 24px 0 72px;\r\n    color: var(--ink);\r\n    font: 15px\/1.6 Arial, Helvetica, sans-serif;\r\n  }\r\n  .crdb-home * { box-sizing: border-box; }\r\n  .crdb-home h1,\r\n  .crdb-home h2,\r\n  .crdb-home h3,\r\n  .crdb-home p,\r\n  .crdb-home span,\r\n  .crdb-home strong,\r\n  .crdb-home button,\r\n  .crdb-home input { letter-spacing: 0; }\r\n  .crdb-sr {\r\n    position: absolute;\r\n    width: 1px;\r\n    height: 1px;\r\n    padding: 0;\r\n    margin: -1px;\r\n    overflow: hidden;\r\n    clip: rect(0, 0, 0, 0);\r\n    white-space: nowrap;\r\n    border: 0;\r\n  }\r\n\r\n  .crdb-hero {\r\n    position: relative;\r\n    isolation: isolate;\r\n    overflow: hidden;\r\n    min-height: 460px;\r\n    display: grid;\r\n    align-items: center;\r\n    padding: clamp(48px, 6.5vw, 84px) clamp(24px, 5vw, 72px);\r\n    border: 1px solid var(--line);\r\n    border-radius: 18px;\r\n    background: linear-gradient(135deg, #ffffff 0%, #ffffff 64%, #f0f2f5 100%);\r\n    box-shadow: var(--shadow-sm);\r\n  }\r\n  .crdb-hero__copy {\r\n    position: relative;\r\n    z-index: 1;\r\n    max-width: 760px;\r\n  }\r\n  .crdb-label,\r\n  .crdb-heading span,\r\n  .crdb-note > div > span,\r\n  .crdb-collection-intro > span {\r\n    display: inline-block;\r\n    margin-bottom: 12px;\r\n    color: var(--accent);\r\n    font-size: 11px;\r\n    font-weight: 700;\r\n    letter-spacing: .09em !important;\r\n    text-transform: uppercase;\r\n  }\r\n  .crdb-label {\r\n    padding: 6px 10px;\r\n    border: 1px solid var(--line-strong);\r\n    border-radius: 999px;\r\n    background: rgba(255, 255, 255, .72);\r\n  }\r\n  .crdb-hero h1 {\r\n    max-width: 780px;\r\n    margin: 0;\r\n    color: var(--ink);\r\n    font-size: clamp(48px, 6vw, 72px);\r\n    line-height: 1;\r\n    letter-spacing: -.035em !important;\r\n  }\r\n  .crdb-hero > .crdb-hero__copy > p {\r\n    max-width: 670px;\r\n    margin: 24px 0 34px;\r\n    color: var(--muted);\r\n    font-size: 18px;\r\n    line-height: 1.7;\r\n  }\r\n  .crdb-search {\r\n    max-width: 720px;\r\n  }\r\n  .crdb-search__box {\r\n    display: flex;\r\n    min-height: 64px;\r\n    padding: 6px;\r\n    border: 1px solid var(--line-strong);\r\n    border-radius: 14px;\r\n    background: var(--paper);\r\n    box-shadow: 0 14px 34px rgba(27, 29, 33, .08);\r\n  }\r\n  .crdb-search input {\r\n    min-width: 0;\r\n    flex: 1;\r\n    height: 50px;\r\n    padding: 0 17px;\r\n    border: 0;\r\n    border-radius: 9px;\r\n    background: var(--soft);\r\n    color: var(--ink);\r\n    font: 16px Arial, Helvetica, sans-serif;\r\n    outline: 0;\r\n  }\r\n  .crdb-search input:hover,\r\n  .crdb-search input:focus,\r\n  .crdb-search input:focus-visible,\r\n  .crdb-search input:active,\r\n  .crdb-search input:valid,\r\n  .crdb-search input:invalid,\r\n  .crdb-search input:-webkit-autofill {\r\n    border-color: transparent !important;\r\n    outline: 0 !important;\r\n    box-shadow: none !important;\r\n  }\r\n  .crdb-search input[type=\"search\"]::-webkit-search-cancel-button,\r\n  .crdb-search input[type=\"search\"]::-webkit-search-decoration {\r\n    -webkit-appearance: none;\r\n    appearance: none;\r\n  }\r\n  .crdb-search input:focus,\r\n  .crdb-search input:focus-visible {\r\n    background: #ffffff;\r\n  }\r\n  .crdb-search__box:focus-within {\r\n    border-color: var(--accent) !important;\r\n    box-shadow: 0 14px 34px rgba(27, 29, 33, .08), 0 0 0 3px rgba(48, 56, 68, .15) !important;\r\n  }\r\n  .crdb-search button {\r\n    min-width: 126px;\r\n    height: 50px;\r\n    padding: 0 22px;\r\n    border: 1px solid var(--ink) !important;\r\n    border-radius: 9px;\r\n    background: var(--ink) !important;\r\n    color: #ffffff !important;\r\n    font: 700 15px Arial, Helvetica, sans-serif;\r\n    cursor: pointer;\r\n    transition: background-color .18s ease, border-color .18s ease, transform .18s ease;\r\n  }\r\n  .crdb-search button:hover {\r\n    border-color: var(--accent) !important;\r\n    background: var(--accent) !important;\r\n    transform: translateY(-1px);\r\n  }\r\n  .crdb-search button:hover,\r\n  .crdb-search button:focus,\r\n  .crdb-search button:focus-visible,\r\n  .crdb-search button:active {\r\n    outline: 0 !important;\r\n    box-shadow: none !important;\r\n  }\r\n  .crdb-mineral:focus,\r\n  .crdb-mineral:focus-visible,\r\n  .crdb-note a:focus,\r\n  .crdb-note a:focus-visible {\r\n    border-color: var(--accent) !important;\r\n    outline: 0 !important;\r\n    box-shadow: 0 0 0 3px rgba(48, 56, 68, .18) !important;\r\n  }\r\n  .crdb-search__status {\r\n    min-height: 22px;\r\n    margin-top: 10px;\r\n    color: var(--muted);\r\n    font-size: 13px;\r\n  }\r\n\r\n  .crdb-stats {\r\n    display: grid;\r\n    grid-template-columns: repeat(4, 1fr);\r\n    gap: 14px;\r\n    margin: 18px 0 68px;\r\n  }\r\n  .crdb-stats > div {\r\n    display: grid;\r\n    gap: 2px;\r\n    min-height: 108px;\r\n    align-content: center;\r\n    padding: 22px;\r\n    border: 1px solid var(--line);\r\n    border-radius: 14px;\r\n    background: var(--paper);\r\n    box-shadow: var(--shadow-sm);\r\n    text-align: center;\r\n  }\r\n  .crdb-stats strong {\r\n    min-height: 31px;\r\n    color: var(--ink);\r\n    font-size: 27px;\r\n    line-height: 1.2;\r\n  }\r\n  .crdb-stats span {\r\n    color: var(--muted);\r\n    font-size: 11px;\r\n    font-weight: 700;\r\n    text-transform: uppercase;\r\n  }\r\n  .crdb-stats [data-crdb-total] > span {\r\n    font: inherit;\r\n  }\r\n\r\n  .crdb-section { margin-bottom: 72px; }\r\n  .crdb-heading {\r\n    display: flex;\r\n    align-items: flex-end;\r\n    justify-content: space-between;\r\n    gap: 20px;\r\n    margin-bottom: 24px;\r\n    padding-bottom: 17px;\r\n    border-bottom: 1px solid var(--line-strong);\r\n  }\r\n  .crdb-heading span { margin: 0; }\r\n  .crdb-heading h2 {\r\n    margin: 3px 0 0;\r\n    font-size: 28px;\r\n    line-height: 1.2;\r\n    letter-spacing: -.018em !important;\r\n  }\r\n  .crdb-heading__count {\r\n    color: var(--muted) !important;\r\n    white-space: nowrap;\r\n  }\r\n\r\n  .crdb-about {\r\n    display: grid;\r\n    grid-template-columns: .8fr 1.2fr;\r\n    gap: 60px;\r\n    padding: clamp(28px, 4vw, 42px);\r\n    border: 1px solid var(--line);\r\n    border-radius: 16px;\r\n    background: linear-gradient(135deg, #ffffff, #fafbfc);\r\n    box-shadow: var(--shadow-sm);\r\n  }\r\n  .crdb-about p { margin: 0; color: var(--muted); }\r\n  .crdb-about .crdb-about__lead {\r\n    color: var(--ink);\r\n    font-size: 22px;\r\n    font-weight: 700;\r\n    line-height: 1.45;\r\n  }\r\n\r\n  .crdb-loading {\r\n    padding: 35px;\r\n    border: 1px solid var(--line);\r\n    border-radius: 14px;\r\n    color: var(--muted);\r\n    background: var(--paper);\r\n    text-align: center;\r\n  }\r\n  .crdb-minerals {\r\n    display: grid;\r\n    grid-template-columns: repeat(4, minmax(0, 1fr));\r\n    gap: 20px;\r\n  }\r\n  .crdb-mineral {\r\n    display: flex;\r\n    min-width: 0;\r\n    min-height: 100%;\r\n    flex-direction: column;\r\n    overflow: hidden;\r\n    border: 1px solid var(--line);\r\n    border-radius: 14px;\r\n    background: var(--paper);\r\n    color: var(--ink) !important;\r\n    text-decoration: none !important;\r\n    box-shadow: var(--shadow-sm);\r\n    transition: border-color .18s ease, box-shadow .18s ease, transform .18s ease;\r\n  }\r\n  .crdb-mineral:hover {\r\n    transform: translateY(-4px);\r\n    border-color: var(--line-strong);\r\n    box-shadow: var(--shadow-md);\r\n  }\r\n  .crdb-mineral__media {\r\n    position: relative;\r\n    aspect-ratio: 4 \/ 3;\r\n    overflow: hidden;\r\n    background: var(--soft2);\r\n  }\r\n  .crdb-mineral__media img {\r\n    display: block;\r\n    width: 100%;\r\n    height: 100%;\r\n    object-fit: cover;\r\n    transition: transform .32s ease;\r\n  }\r\n  .crdb-mineral:hover .crdb-mineral__media img { transform: scale(1.025); }\r\n  .crdb-mineral__media--empty {\r\n    background: var(--soft2);\r\n  }\r\n  .crdb-mineral__copy {\r\n    display: flex;\r\n    flex: 1;\r\n    flex-direction: column;\r\n    padding: 20px;\r\n  }\r\n  .crdb-mineral__meta {\r\n    margin-bottom: 8px;\r\n    color: var(--accent2);\r\n    font-size: 11px;\r\n    font-weight: 700;\r\n    text-transform: uppercase;\r\n  }\r\n  .crdb-mineral h3 {\r\n    margin: 0 0 10px;\r\n    font-size: 21px;\r\n    line-height: 1.25;\r\n  }\r\n  .crdb-mineral p {\r\n    display: -webkit-box;\r\n    overflow: hidden;\r\n    -webkit-box-orient: vertical;\r\n    -webkit-line-clamp: 3;\r\n    margin: 0 0 16px;\r\n    color: var(--muted);\r\n    font-size: 13px;\r\n  }\r\n  .crdb-mineral__facts {\r\n    display: grid;\r\n    grid-template-columns: repeat(2, minmax(0, 1fr));\r\n    gap: 7px 12px;\r\n    margin-top: auto;\r\n    padding-top: 13px;\r\n    border-top: 1px solid var(--line);\r\n    font-size: 12px;\r\n  }\r\n  .crdb-mineral__facts span {\r\n    min-width: 0;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n  }\r\n  .crdb-mineral__facts b {\r\n    display: block;\r\n    color: var(--muted);\r\n    font-size: 10px;\r\n    text-transform: uppercase;\r\n  }\r\n\r\n  .crdb-fields {\r\n    display: grid;\r\n    grid-template-columns: repeat(3, 1fr);\r\n    gap: 16px;\r\n  }\r\n  .crdb-fields article {\r\n    min-height: 205px;\r\n    padding: 26px;\r\n    border: 1px solid var(--line);\r\n    border-radius: 14px;\r\n    background: var(--paper);\r\n    box-shadow: var(--shadow-sm);\r\n    transition: border-color .18s ease, box-shadow .18s ease, transform .18s ease;\r\n  }\r\n  .crdb-fields article:hover {\r\n    transform: translateY(-2px);\r\n    border-color: var(--line-strong);\r\n    box-shadow: var(--shadow-md);\r\n  }\r\n  .crdb-fields article > span {\r\n    display: inline-grid;\r\n    min-width: 36px;\r\n    height: 26px;\r\n    padding: 0 8px;\r\n    place-items: center;\r\n    border-radius: 999px;\r\n    background: var(--soft2);\r\n    color: var(--accent2);\r\n    font-size: 11px;\r\n    font-weight: 700;\r\n  }\r\n  .crdb-fields h3 {\r\n    margin: 20px 0 8px;\r\n    font-size: 17px;\r\n  }\r\n  .crdb-fields p {\r\n    margin: 0;\r\n    color: var(--muted);\r\n    font-size: 13px;\r\n  }\r\n\r\n  .crdb-note {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    gap: 40px;\r\n    margin-bottom: 72px;\r\n    padding: clamp(30px, 4vw, 44px);\r\n    border: 1px solid var(--ink);\r\n    border-radius: 16px;\r\n    background: linear-gradient(135deg, #1b1d21, #353c47);\r\n    box-shadow: var(--shadow-md);\r\n    color: #ffffff;\r\n  }\r\n  .crdb-note > div > span {\r\n    color: rgba(255, 255, 255, .68);\r\n  }\r\n  .crdb-note h2 {\r\n    margin: 0 0 7px;\r\n    color: #ffffff;\r\n    font-size: 18px;\r\n  }\r\n  .crdb-note p {\r\n    max-width: 760px;\r\n    margin: 0;\r\n    color: rgba(255, 255, 255, .74);\r\n    font-size: 14px;\r\n  }\r\n  .crdb-note a {\r\n    flex: none;\r\n    padding: 13px 18px;\r\n    border: 1px solid #ffffff;\r\n    border-radius: 9px;\r\n    background: #ffffff;\r\n    color: var(--ink) !important;\r\n    font-size: 13px;\r\n    font-weight: 700;\r\n    text-decoration: none !important;\r\n    transition: background-color .18s ease, transform .18s ease;\r\n  }\r\n  .crdb-note a:hover {\r\n    background: var(--soft);\r\n    transform: translateY(-1px);\r\n  }\r\n  .crdb-note a:focus,\r\n  .crdb-note a:focus-visible {\r\n    border-color: #ffffff !important;\r\n    box-shadow: 0 0 0 3px rgba(255, 255, 255, .34) !important;\r\n  }\r\n\r\n  .crdb-collection-intro {\r\n    padding: 64px 25px 28px;\r\n    border-top: 1px solid var(--line);\r\n    text-align: center;\r\n    scroll-margin-top: 20px;\r\n  }\r\n  .crdb-collection-intro h2 {\r\n    margin: 0;\r\n    font-size: 38px;\r\n    letter-spacing: -.025em !important;\r\n  }\r\n  .crdb-collection-intro p {\r\n    margin: 8px 0 0;\r\n    color: var(--muted);\r\n  }\r\n  .mineral-home-collection { margin-top: 0 !important; }\r\n  .mineral-home-collection .cmcf-v2 input,\r\n  .mineral-home-collection .cmcf-v2 select,\r\n  .mineral-home-collection .cmcf-v2 textarea,\r\n  .mineral-home-collection .cmcf-v2 button,\r\n  .mineral-home-collection .cmcf-v2 summary {\r\n    outline: 0 !important;\r\n  }\r\n  .mineral-home-collection .cmcf-v2 input:hover,\r\n  .mineral-home-collection .cmcf-v2 input:focus,\r\n  .mineral-home-collection .cmcf-v2 input:focus-visible,\r\n  .mineral-home-collection .cmcf-v2 input:active,\r\n  .mineral-home-collection .cmcf-v2 input:valid,\r\n  .mineral-home-collection .cmcf-v2 input:invalid,\r\n  .mineral-home-collection .cmcf-v2 select:hover,\r\n  .mineral-home-collection .cmcf-v2 select:focus,\r\n  .mineral-home-collection .cmcf-v2 select:focus-visible,\r\n  .mineral-home-collection .cmcf-v2 textarea:hover,\r\n  .mineral-home-collection .cmcf-v2 textarea:focus,\r\n  .mineral-home-collection .cmcf-v2 textarea:focus-visible {\r\n    border-color: var(--accent) !important;\r\n    box-shadow: 0 0 0 2px rgba(48, 56, 68, .16) !important;\r\n  }\r\n  .mineral-home-collection .cmcf-v2 input[type=\"checkbox\"],\r\n  .mineral-home-collection .cmcf-v2 input[type=\"radio\"] {\r\n    accent-color: var(--accent);\r\n    box-shadow: none !important;\r\n  }\r\n\r\n  @media (max-width: 980px) {\r\n    .crdb-hero h1 { font-size: 48px; }\r\n    .crdb-stats { grid-template-columns: repeat(2, 1fr); }\r\n    .crdb-minerals { grid-template-columns: repeat(2, minmax(0, 1fr)); }\r\n    .crdb-fields { grid-template-columns: repeat(2, 1fr); }\r\n  }\r\n  @media (max-width: 650px) {\r\n    .crdb-home {\r\n      width: calc(100% - 24px);\r\n      padding-top: 12px;\r\n    }\r\n    .crdb-hero {\r\n      min-height: 0;\r\n      padding: 34px 18px;\r\n      border-radius: 14px;\r\n    }\r\n    .crdb-hero h1 { font-size: 38px; }\r\n    .crdb-hero > .crdb-hero__copy > p { font-size: 16px; }\r\n    .crdb-search__box {\r\n      display: grid;\r\n      gap: 6px;\r\n    }\r\n    .crdb-search input,\r\n    .crdb-search button {\r\n      width: 100%;\r\n    }\r\n    .crdb-stats { gap: 10px; margin-bottom: 54px; }\r\n    .crdb-stats > div {\r\n      min-height: 84px;\r\n      padding: 16px 10px;\r\n    }\r\n    .crdb-stats strong { font-size: 20px; }\r\n    .crdb-about {\r\n      grid-template-columns: 1fr;\r\n      gap: 18px;\r\n      padding: 20px;\r\n    }\r\n    .crdb-heading {\r\n      align-items: flex-start;\r\n      flex-direction: column;\r\n    }\r\n    .crdb-heading h2 { font-size: 24px; }\r\n    .crdb-heading__count { white-space: normal; }\r\n    .crdb-minerals {\r\n      grid-template-columns: 1fr;\r\n      gap: 12px;\r\n    }\r\n    .crdb-mineral {\r\n      display: flex;\r\n      flex-direction: column;\r\n    }\r\n    .crdb-mineral__copy { padding: 17px 16px 18px; }\r\n    .crdb-mineral h3 { font-size: 18px; }\r\n    .crdb-mineral__facts {\r\n      grid-template-columns: repeat(2, minmax(0, 1fr));\r\n      gap: 9px 12px;\r\n    }\r\n    .crdb-fields { grid-template-columns: 1fr; }\r\n    .crdb-note {\r\n      align-items: flex-start;\r\n      flex-direction: column;\r\n    }\r\n    .crdb-note a {\r\n      width: 100%;\r\n      text-align: center;\r\n    }\r\n    .crdb-collection-intro h2 { font-size: 29px; }\r\n  }\r\n  @media (hover: none), (pointer: coarse) {\r\n    .crdb-mineral:hover {\r\n      transform: none;\r\n      border-color: var(--line);\r\n      box-shadow: var(--shadow-sm);\r\n    }\r\n    .crdb-mineral:hover .crdb-mineral__media img,\r\n    .crdb-fields article:hover { transform: none; }\r\n    .crdb-fields article:hover {\r\n      border-color: var(--line);\r\n      box-shadow: var(--shadow-sm);\r\n    }\r\n  }\r\n  .crdb-home[dir=\"rtl\"],\r\n  html[dir=\"rtl\"] .crdb-home,\r\n  body[dir=\"rtl\"] .crdb-home {\r\n    direction: rtl;\r\n    text-align: start;\r\n  }\r\n  .crdb-home[dir=\"rtl\"] input,\r\n  html[dir=\"rtl\"] .crdb-home input,\r\n  body[dir=\"rtl\"] .crdb-home input {\r\n    text-align: start;\r\n    unicode-bidi: plaintext;\r\n  }\r\n  .crdb-home[dir=\"rtl\"] .crdb-mineral h3,\r\n  .crdb-home[dir=\"rtl\"] .crdb-mineral p,\r\n  html[dir=\"rtl\"] .crdb-home .crdb-mineral h3,\r\n  html[dir=\"rtl\"] .crdb-home .crdb-mineral p {\r\n    unicode-bidi: plaintext;\r\n  }\r\n  @media (prefers-reduced-motion: reduce) {\r\n    .crdb-home * { transition: none !important; }\r\n  }\r\n<\/style>\r\n\r\n<script>\r\n  (function() {\r\n    'use strict';\r\n\r\n    var root = document.getElementById('crdb-home');\r\n    if (!root) return;\r\n\r\n    var documentDirection = String(\r\n      document.documentElement.getAttribute('dir') ||\r\n      (window.getComputedStyle ? window.getComputedStyle(document.documentElement).direction : '') ||\r\n      'ltr'\r\n    ).toLowerCase();\r\n    root.setAttribute('dir', documentDirection === 'rtl' ? 'rtl' : 'ltr');\r\n\r\n    var items = [];\r\n    var grid = root.querySelector('[data-crdb-grid]');\r\n    var status = root.querySelector('[data-crdb-status]');\r\n    var total = root.querySelector('[data-crdb-total]');\r\n    var randomCount = root.querySelector('[data-crdb-random-count]');\r\n    var searchInput = root.querySelector('#crdb-search-input');\r\n    var searchStatus = root.querySelector('[data-crdb-search-status]');\r\n    var searchForm = root.querySelector('[data-crdb-search]');\r\n    var facetTranslations = {};\r\n    var homeUi = {};\r\n    var indexLanguage = '';\r\n    var previousSearch = { query: '', matches: [] };\r\n    var indexState = 'idle';\r\n    var activeIndexUrl = '';\r\n    var indexRequestId = 0;\r\n    var translationReady = true;\r\n    var translationRefreshAttempts = 0;\r\n    var translationRefreshTimer = 0;\r\n    var searchTimer = 0;\r\n    var indexRetries = 0;\r\n    var indexRetryTimer = 0;\r\n    var indexAbortController = null;\r\n    var localizedDynamicNodes = root.querySelectorAll('[data-crdb-localized-dynamic]');\r\n\r\n    function cleanText(value) {\r\n      var text = value === null || value === undefined ? '' : String(value);\r\n\r\n      if (text.length > 20000) text = text.slice(0, 20000);\r\n      if (text.indexOf('&') === -1 && text.indexOf('<') === -1) return text.trim();\r\n\r\n      for (var pass = 0; pass < 2; pass++) {\r\n        var parsed = new DOMParser().parseFromString(text, 'text\/html');\r\n        var decoded = parsed.body ? (parsed.body.textContent || '') : text;\r\n        if (decoded === text) break;\r\n        text = decoded;\r\n      }\r\n\r\n      return text.trim();\r\n    }\r\n\r\n    function cleanLiteralTranslationMarkup(scope) {\r\n      var walker = document.createTreeWalker(scope, NodeFilter.SHOW_TEXT);\r\n      var nodes = [];\r\n      var node;\r\n\r\n      while ((node = walker.nextNode())) {\r\n        if (String(node.nodeValue || '').toLowerCase().indexOf('data-no-translation') !== -1) {\r\n          nodes.push(node);\r\n        }\r\n      }\r\n\r\n      nodes.forEach(function(textNode) {\r\n        textNode.nodeValue = cleanText(textNode.nodeValue);\r\n      });\r\n    }\r\n\r\n    cleanLiteralTranslationMarkup(root);\r\n\r\n    function labelize(value) {\r\n      value = cleanText(value);\r\n      var labelMap = {\r\n        colorless: 'Colorless', purple: 'Purple (P)', reddish_purple: 'reddish Purple (rP)',\r\n        red_purple_or_purple_red: 'Red-Purple or Purple-Red (RP\/PR)', strongly_purplish_red: 'strongly purplish Red (stpR)',\r\n        slightly_purplish_red: 'slightly purplish Red (slpR)', pink: 'Pink', red: 'Red (R)',\r\n        orangy_red: 'orangy Red (oR)', red_orange_or_orange_red: 'Red-Orange or Orange-Red (RO\/OR)',\r\n        reddish_orange: 'reddish Orange (rO)', orange: 'Orange (O)',\r\n        yellow_orange_or_orange_yellow: 'Yellow-Orange or Orange-Yellow (YO\/OY)', yellowish_orange: 'yellowish Orange (yO)',\r\n        orangy_yellow: 'orangy Yellow (oY)', yellow: 'Yellow (Y)', greenish_yellow: 'greenish Yellow (gY)',\r\n        yellow_green_or_green_yellow: 'Yellow-Green or Green-Yellow (YG\/GY)', strongly_yellowish_green: 'strongly yellowish Green (styG)',\r\n        yellowish_green: 'yellowish Green (yG)', slightly_yellowish_green: 'slightly yellowish Green (slyG)',\r\n        green: 'Green (G)', very_slightly_bluish_green: 'very slightly bluish Green (vslbG)',\r\n        bluish_green: 'bluish Green (bG)', very_strongly_bluish_green: 'very strongly bluish Green (vstbG)',\r\n        green_blue_or_blue_green: 'Green-Blue or Blue-Green (GB\/BG)', very_strongly_greenish_blue: 'very strongly greenish Blue (vstgB)',\r\n        greenish_blue: 'greenish Blue (gB)', very_slightly_greenish_blue: 'very slightly greenish Blue (vslgB)',\r\n        blue: 'Blue (B)', violet_blue_or_blue_violet: 'Violet-Blue or Blue-Violet (VB\/BV)', violetish_blue: 'violetish Blue (vB)',\r\n        bluish_violet: 'bluish Violet (bV)', violet: 'Violet (V)', violetish_purple: 'violetish Purple (vP)',\r\n        white: 'White', gray: 'Gray', brown: 'Brown', black: 'Black',\r\n        display_only: 'Display only', poor: 'Poor', good_too_poor: 'Good too poor', good: 'Good', very_good: 'Very Good', excellent: 'Excellent',\r\n        everyday: 'Everyday Wear', frequent: 'Frequent Wear', occasional: 'Occasional Wear', collector: 'Collector \/ Display',\r\n        cote_d_ivoire: \"Cote d'Ivoire\", guinea_bissau: 'Guinea-Bissau', timor_leste: 'Timor-Leste',\r\n        united_states: 'United States', united_kingdom: 'United Kingdom'\r\n      };\r\n      if (Object.prototype.hasOwnProperty.call(labelMap, value)) return labelMap[value];\r\n      return String(value || homeUiText('not_listed', 'Not listed')).replace(\/_\/g, ' ').replace(\/\\b\\w\/g, function(c) {\r\n        return c.toUpperCase();\r\n      });\r\n    }\r\n\r\n    function normalize(value) {\r\n      var text = String(value || '').toLowerCase();\r\n      return text.normalize ? text.normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '') : text;\r\n    }\r\n\r\n    function localized(variants, fallback) {\r\n      if (typeof variants === 'string') return cleanText(variants) || cleanText(fallback || '');\r\n      return cleanText(fallback || '');\r\n    }\r\n\r\n    function itemText(item, key) {\r\n      return localized(item[key], '');\r\n    }\r\n\r\n    function itemSearchText(item) {\r\n      var terms = [item.search || ''];\r\n      if (Array.isArray(item.search_terms)) terms = terms.concat(item.search_terms);\r\n      return terms.map(cleanText).join(' ');\r\n    }\r\n\r\n    \/* Card-only fallbacks. Dictionary translations still take priority. These\r\n     * values cover deterministic UI that must not fall back to English while a\r\n     * localized mineral index is being rebuilt or is missing an exact source. *\/\r\n    var cardLabelFallbacks = {\r\n      zh: [\"\u989c\u8272\", \"\u83ab\u6c0f\u786c\u5ea6\", \"\u8010\u7528\u6027\"],\r\n      es: [\"Color\", \"Dureza de Mohs\", \"Aptitud para el uso\"],\r\n      ru: [\"\u0426\u0432\u0435\u0442\", \"\u0422\u0432\u0451\u0440\u0434\u043e\u0441\u0442\u044c \u043f\u043e \u041c\u043e\u043e\u0441\u0443\", \"\u041f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043d\u043e\u0448\u0435\u043d\u0438\u044f\"],\r\n      de: [\"Farbe\", \"Mohsh\u00e4rte\", \"Tragbarkeit\"],\r\n      fr: [\"Couleur\", \"Duret\u00e9 de Mohs\", \"Aptitude au port\"],\r\n      pt: [\"Cor\", \"Dureza Mohs\", \"Adequa\u00e7\u00e3o ao uso\"],\r\n      ja: [\"\u8272\", \"\u30e2\u30fc\u30b9\u786c\u5ea6\", \"\u88c5\u7740\u9069\u6027\"],\r\n      ko: [\"\uc0c9\uc0c1\", \"\ubaa8\uc2a4 \uacbd\ub3c4\", \"\ucc29\uc6a9 \uc801\ud569\uc131\"],\r\n      ar: [\"\u0627\u0644\u0644\u0648\u0646\", \"\u0635\u0644\u0627\u062f\u0629 \u0645\u0648\u0633\", \"\u0645\u0644\u0627\u0621\u0645\u0629 \u0627\u0644\u0627\u0631\u062a\u062f\u0627\u0621\"],\r\n      it: [\"Colore\", \"Durezza Mohs\", \"Indossabilit\u00e0\"],\r\n      hi: [\"\u0930\u0902\u0917\", \"\u092e\u094b\u0939\u094d\u0938 \u0915\u0920\u094b\u0930\u0924\u093e\", \"\u092a\u0939\u0928\u0928\u0947 \u0915\u0940 \u0909\u092a\u092f\u0941\u0915\u094d\u0924\u0924\u093e\"],\r\n      id: [\"Warna\", \"Kekerasan Mohs\", \"Kelayakan pakai\"],\r\n      th: [\"\u0e2a\u0e35\", \"\u0e04\u0e27\u0e32\u0e21\u0e41\u0e02\u0e47\u0e07\u0e42\u0e21\u0e2a\u0e4c\", \"\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2b\u0e21\u0e32\u0e30\u0e2a\u0e21\u0e43\u0e19\u0e01\u0e32\u0e23\u0e2a\u0e27\u0e21\u0e43\u0e2a\u0e48\"],\r\n      tr: [\"Renk\", \"Mohs sertli\u011fi\", \"Tak\u0131labilirlik\"],\r\n      vi: [\"M\u00e0u s\u1eafc\", \"\u0110\u1ed9 c\u1ee9ng Mohs\", \"Kh\u1ea3 n\u0103ng \u0111eo\"],\r\n      pl: [\"Barwa\", \"Twardo\u015b\u0107 Mohsa\", \"Przydatno\u015b\u0107 do noszenia\"],\r\n      fa: [\"\u0631\u0646\u06af\", \"\u0633\u062e\u062a\u06cc \u0645\u0648\u0633\", \"\u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0631 \u0632\u06cc\u0648\u0631\u0622\u0644\u0627\u062a\"],\r\n      ur: [\"\u0631\u0646\u06af\", \"\u0645\u0648\u06c1\u0633 \u0633\u062e\u062a\u06cc\", \"\u067e\u06c1\u0646\u0646\u06d2 \u06a9\u06cc \u0645\u0648\u0632\u0648\u0646\u06cc\u062a\"],\r\n      nl: [\"Kleur\", \"Mohshardheid\", \"Draagbaarheid\"],\r\n      el: [\"\u03a7\u03c1\u03ce\u03bc\u03b1\", \"\u03a3\u03ba\u03bb\u03b7\u03c1\u03cc\u03c4\u03b7\u03c4\u03b1 Mohs\", \"\u039a\u03b1\u03c4\u03b1\u03bb\u03bb\u03b7\u03bb\u03cc\u03c4\u03b7\u03c4\u03b1 \u03b3\u03b9\u03b1 \u03c7\u03c1\u03ae\u03c3\u03b7\"],\r\n      sv: [\"F\u00e4rg\", \"Mohs h\u00e5rdhet\", \"L\u00e4mplighet f\u00f6r smycken\"],\r\n      cs: [\"Barva\", \"Mohsova tvrdost\", \"Vhodnost k no\u0161en\u00ed\"],\r\n      bn: [\"\u09b0\u0982\", \"\u09ae\u09cb\u09b9\u09b8 \u0995\u09a0\u09cb\u09b0\u09a4\u09be\", \"\u09aa\u09b0\u09bf\u09a7\u09be\u09a8\u09c7\u09b0 \u0989\u09aa\u09af\u09cb\u0997\u09bf\u09a4\u09be\"],\r\n      ro: [\"Culoare\", \"Duritate Mohs\", \"Adecvare pentru purtare\"],\r\n      hu: [\"Sz\u00edn\", \"Mohs-kem\u00e9nys\u00e9g\", \"Viselhet\u0151s\u00e9g\"],\r\n      he: [\"\u05e6\u05d1\u05e2\", \"\u05e7\u05e9\u05d9\u05d5\u05ea \u05de\u05d5\u05e1\", \"\u05d4\u05ea\u05d0\u05de\u05d4 \u05dc\u05e2\u05e0\u05d9\u05d3\u05d4\"],\r\n      sw: [\"Rangi\", \"Ugumu wa Mohs\", \"Ufaafu wa kuvaliwa\"],\r\n      fi: [\"V\u00e4ri\", \"Mohsin kovuus\", \"K\u00e4ytett\u00e4vyys koruna\"],\r\n      nb: [\"Farge\", \"Mohs-hardhet\", \"Egnethet for bruk\"],\r\n      sk: [\"Farba\", \"Mohsova tvrdos\u0165\", \"Vhodnos\u0165 na nosenie\"]\r\n    };\r\n    var cardLabelIndexes = { color: 0, mohs: 1, wearability: 2 };\r\n    var cardWearabilityKeys = [\r\n      'display_only', 'poor', 'good_too_poor', 'good', 'very_good',\r\n      'excellent', 'everyday', 'frequent', 'occasional', 'collector'\r\n    ];\r\n    var cardWearabilityFallbacks = {\r\n      zh: [\"\u4ec5\u4f9b\u5c55\u793a\", \"\u8f83\u5dee\", \"\u826f\u597d\u81f3\u8f83\u5dee\", \"\u826f\u597d\", \"\u5f88\u597d\", \"\u6781\u4f73\", \"\u65e5\u5e38\u4f69\u6234\", \"\u7ecf\u5e38\u4f69\u6234\", \"\u5076\u5c14\u4f69\u6234\", \"\u6536\u85cf \/ \u5c55\u793a\"],\r\n      es: [\"Solo exhibici\u00f3n\", \"Mala\", \"De buena a mala\", \"Buena\", \"Muy buena\", \"Excelente\", \"Uso diario\", \"Uso frecuente\", \"Uso ocasional\", \"Colecci\u00f3n \/ exhibici\u00f3n\"],\r\n      ru: [\"\u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438\", \"\u041d\u0438\u0437\u043a\u0430\u044f\", \"\u041e\u0442 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0434\u043e \u043d\u0438\u0437\u043a\u043e\u0439\", \"\u0425\u043e\u0440\u043e\u0448\u0430\u044f\", \"\u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f\", \"\u041e\u0442\u043b\u0438\u0447\u043d\u0430\u044f\", \"\u0415\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0435 \u043d\u043e\u0448\u0435\u043d\u0438\u0435\", \"\u0427\u0430\u0441\u0442\u043e\u0435 \u043d\u043e\u0448\u0435\u043d\u0438\u0435\", \"\u0420\u0435\u0434\u043a\u043e\u0435 \u043d\u043e\u0448\u0435\u043d\u0438\u0435\", \"\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \/ \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f\"],\r\n      de: [\"Nur zur Ausstellung\", \"Gering\", \"Gut bis gering\", \"Gut\", \"Sehr gut\", \"Ausgezeichnet\", \"Alltagstauglich\", \"H\u00e4ufiges Tragen\", \"Gelegentliches Tragen\", \"Sammlung \/ Ausstellung\"],\r\n      fr: [\"Exposition uniquement\", \"Faible\", \"Bonne \u00e0 faible\", \"Bonne\", \"Tr\u00e8s bonne\", \"Excellente\", \"Port quotidien\", \"Port fr\u00e9quent\", \"Port occasionnel\", \"Collection \/ exposition\"],\r\n      pt: [\"Apenas para exibi\u00e7\u00e3o\", \"Baixa\", \"Boa a baixa\", \"Boa\", \"Muito boa\", \"Excelente\", \"Uso di\u00e1rio\", \"Uso frequente\", \"Uso ocasional\", \"Cole\u00e7\u00e3o \/ exibi\u00e7\u00e3o\"],\r\n      ja: [\"\u5c55\u793a\u306e\u307f\", \"\u4f4e\u3044\", \"\u826f\u597d\uff5e\u4f4e\u3044\", \"\u826f\u597d\", \"\u975e\u5e38\u306b\u826f\u597d\", \"\u512a\u79c0\", \"\u65e5\u5e38\u4f7f\u3044\", \"\u983b\u7e41\u306a\u7740\u7528\", \"\u6642\u3005\u306e\u7740\u7528\", \"\u30b3\u30ec\u30af\u30b7\u30e7\u30f3 \/ \u5c55\u793a\"],\r\n      ko: [\"\uc804\uc2dc \uc804\uc6a9\", \"\ub0ae\uc74c\", \"\uc88b\uc74c~\ub0ae\uc74c\", \"\uc88b\uc74c\", \"\ub9e4\uc6b0 \uc88b\uc74c\", \"\ub9e4\uc6b0 \uc6b0\uc218\", \"\uc77c\uc0c1 \ucc29\uc6a9\", \"\uc7a6\uc740 \ucc29\uc6a9\", \"\uac00\ub054 \ucc29\uc6a9\", \"\uc218\uc9d1 \/ \uc804\uc2dc\"],\r\n      ar: [\"\u0644\u0644\u0639\u0631\u0636 \u0641\u0642\u0637\", \"\u0636\u0639\u064a\u0641\u0629\", \"\u0645\u0646 \u062c\u064a\u062f\u0629 \u0625\u0644\u0649 \u0636\u0639\u064a\u0641\u0629\", \"\u062c\u064a\u062f\u0629\", \"\u062c\u064a\u062f\u0629 \u062c\u062f\u064b\u0627\", \"\u0645\u0645\u062a\u0627\u0632\u0629\", \"\u0627\u0631\u062a\u062f\u0627\u0621 \u064a\u0648\u0645\u064a\", \"\u0627\u0631\u062a\u062f\u0627\u0621 \u0645\u062a\u0643\u0631\u0631\", \"\u0627\u0631\u062a\u062f\u0627\u0621 \u0639\u0631\u0636\u064a\", \"\u0645\u062c\u0645\u0648\u0639\u0629 \/ \u0639\u0631\u0636\"],\r\n      it: [\"Solo esposizione\", \"Scarsa\", \"Da buona a scarsa\", \"Buona\", \"Molto buona\", \"Eccellente\", \"Uso quotidiano\", \"Uso frequente\", \"Uso occasionale\", \"Collezione \/ esposizione\"],\r\n      hi: [\"\u0915\u0947\u0935\u0932 \u092a\u094d\u0930\u0926\u0930\u094d\u0936\u0928\", \"\u0916\u0930\u093e\u092c\", \"\u0905\u091a\u094d\u091b\u0940 \u0938\u0947 \u0916\u0930\u093e\u092c\", \"\u0905\u091a\u094d\u091b\u0940\", \"\u092c\u0939\u0941\u0924 \u0905\u091a\u094d\u091b\u0940\", \"\u0909\u0924\u094d\u0915\u0943\u0937\u094d\u091f\", \"\u0926\u0948\u0928\u093f\u0915 \u092a\u0939\u0928\u093e\u0935\u093e\", \"\u092c\u093e\u0930-\u092c\u093e\u0930 \u092a\u0939\u0928\u093e\u0935\u093e\", \"\u0915\u092d\u0940-\u0915\u092d\u093e\u0930 \u092a\u0939\u0928\u093e\u0935\u093e\", \"\u0938\u0902\u0917\u094d\u0930\u0939 \/ \u092a\u094d\u0930\u0926\u0930\u094d\u0936\u0928\"],\r\n      id: [\"Hanya untuk pajangan\", \"Buruk\", \"Baik hingga buruk\", \"Baik\", \"Sangat baik\", \"Unggul\", \"Pemakaian sehari-hari\", \"Pemakaian sering\", \"Pemakaian sesekali\", \"Koleksi \/ pajangan\"],\r\n      th: [\"\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e08\u0e31\u0e14\u0e41\u0e2a\u0e14\u0e07\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19\", \"\u0e15\u0e48\u0e33\", \"\u0e14\u0e35\u0e16\u0e36\u0e07\u0e15\u0e48\u0e33\", \"\u0e14\u0e35\", \"\u0e14\u0e35\u0e21\u0e32\u0e01\", \"\u0e22\u0e2d\u0e14\u0e40\u0e22\u0e35\u0e48\u0e22\u0e21\", \"\u0e2a\u0e27\u0e21\u0e43\u0e2a\u0e48\u0e17\u0e38\u0e01\u0e27\u0e31\u0e19\", \"\u0e2a\u0e27\u0e21\u0e43\u0e2a\u0e48\u0e1a\u0e48\u0e2d\u0e22\", \"\u0e2a\u0e27\u0e21\u0e43\u0e2a\u0e48\u0e40\u0e1b\u0e47\u0e19\u0e04\u0e23\u0e31\u0e49\u0e07\u0e04\u0e23\u0e32\u0e27\", \"\u0e2a\u0e30\u0e2a\u0e21 \/ \u0e08\u0e31\u0e14\u0e41\u0e2a\u0e14\u0e07\"],\r\n      tr: [\"Yaln\u0131zca sergileme\", \"Zay\u0131f\", \"\u0130yiden zay\u0131fa\", \"\u0130yi\", \"\u00c7ok iyi\", \"M\u00fckemmel\", \"G\u00fcnl\u00fck kullan\u0131m\", \"S\u0131k kullan\u0131m\", \"Ara s\u0131ra kullan\u0131m\", \"Koleksiyon \/ sergileme\"],\r\n      vi: [\"Ch\u1ec9 tr\u01b0ng b\u00e0y\", \"K\u00e9m\", \"T\u1ed1t \u0111\u1ebfn k\u00e9m\", \"T\u1ed1t\", \"R\u1ea5t t\u1ed1t\", \"Xu\u1ea5t s\u1eafc\", \"\u0110eo h\u1eb1ng ng\u00e0y\", \"\u0110eo th\u01b0\u1eddng xuy\u00ean\", \"\u0110eo th\u1ec9nh tho\u1ea3ng\", \"S\u01b0u t\u1eadp \/ tr\u01b0ng b\u00e0y\"],\r\n      pl: [\"Tylko do ekspozycji\", \"S\u0142aba\", \"Od dobrej do s\u0142abej\", \"Dobra\", \"Bardzo dobra\", \"Doskona\u0142a\", \"Do codziennego noszenia\", \"Do cz\u0119stego noszenia\", \"Do okazjonalnego noszenia\", \"Kolekcja \/ ekspozycja\"],\r\n      fa: [\"\u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634\", \"\u0636\u0639\u06cc\u0641\", \"\u062e\u0648\u0628 \u062a\u0627 \u0636\u0639\u06cc\u0641\", \"\u062e\u0648\u0628\", \"\u0628\u0633\u06cc\u0627\u0631 \u062e\u0648\u0628\", \"\u0639\u0627\u0644\u06cc\", \"\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0631\u0648\u0632\u0627\u0646\u0647\", \"\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06a9\u0631\u0631\", \"\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06af\u0627\u0647\u200c\u0628\u0647\u200c\u06af\u0627\u0647\", \"\u0645\u062c\u0645\u0648\u0639\u0647 \/ \u0646\u0645\u0627\u06cc\u0634\"],\r\n      ur: [\"\u0635\u0631\u0641 \u0646\u0645\u0627\u0626\u0634 \u06a9\u06d2 \u0644\u06cc\u06d2\", \"\u06a9\u0645\u0632\u0648\u0631\", \"\u0627\u0686\u06be\u06cc \u0633\u06d2 \u06a9\u0645\u0632\u0648\u0631\", \"\u0627\u0686\u06be\u06cc\", \"\u0628\u06c1\u062a \u0627\u0686\u06be\u06cc\", \"\u0628\u06c1\u062a\u0631\u06cc\u0646\", \"\u0631\u0648\u0632\u0645\u0631\u06c1 \u067e\u06c1\u0646\u0646\u0627\", \"\u06a9\u062b\u0631\u062a \u0633\u06d2 \u067e\u06c1\u0646\u0646\u0627\", \"\u06a9\u0628\u06be\u06cc \u06a9\u0628\u06be\u0627\u0631 \u067e\u06c1\u0646\u0646\u0627\", \"\u0645\u062c\u0645\u0648\u0639\u06c1 \/ \u0646\u0645\u0627\u0626\u0634\"],\r\n      nl: [\"Alleen voor tentoonstelling\", \"Slecht\", \"Goed tot slecht\", \"Goed\", \"Zeer goed\", \"Uitstekend\", \"Dagelijks dragen\", \"Regelmatig dragen\", \"Af en toe dragen\", \"Collectie \/ tentoonstelling\"],\r\n      el: [\"\u039c\u03cc\u03bd\u03bf \u03b3\u03b9\u03b1 \u03ad\u03ba\u03b8\u03b5\u03c3\u03b7\", \"\u03a7\u03b1\u03bc\u03b7\u03bb\u03ae\", \"\u0391\u03c0\u03cc \u03ba\u03b1\u03bb\u03ae \u03ad\u03c9\u03c2 \u03c7\u03b1\u03bc\u03b7\u03bb\u03ae\", \"\u039a\u03b1\u03bb\u03ae\", \"\u03a0\u03bf\u03bb\u03cd \u03ba\u03b1\u03bb\u03ae\", \"\u0395\u03be\u03b1\u03b9\u03c1\u03b5\u03c4\u03b9\u03ba\u03ae\", \"\u039a\u03b1\u03b8\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7\", \"\u03a3\u03c5\u03c7\u03bd\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7\", \"\u03a0\u03b5\u03c1\u03b9\u03c3\u03c4\u03b1\u03c3\u03b9\u03b1\u03ba\u03ae \u03c7\u03c1\u03ae\u03c3\u03b7\", \"\u03a3\u03c5\u03bb\u03bb\u03bf\u03b3\u03ae \/ \u03ad\u03ba\u03b8\u03b5\u03c3\u03b7\"],\r\n      sv: [\"Endast f\u00f6r visning\", \"D\u00e5lig\", \"Bra till d\u00e5lig\", \"Bra\", \"Mycket bra\", \"Utm\u00e4rkt\", \"Daglig anv\u00e4ndning\", \"Frekvent anv\u00e4ndning\", \"Tillf\u00e4llig anv\u00e4ndning\", \"Samling \/ visning\"],\r\n      cs: [\"Pouze k vystaven\u00ed\", \"N\u00edzk\u00e1\", \"Dobr\u00e1 a\u017e n\u00edzk\u00e1\", \"Dobr\u00e1\", \"Velmi dobr\u00e1\", \"Vynikaj\u00edc\u00ed\", \"Ka\u017edodenn\u00ed no\u0161en\u00ed\", \"\u010cast\u00e9 no\u0161en\u00ed\", \"P\u0159\u00edle\u017eitostn\u00e9 no\u0161en\u00ed\", \"Sb\u00edrka \/ vystaven\u00ed\"],\r\n      bn: [\"\u09b6\u09c1\u09a7\u09c1 \u09aa\u09cd\u09b0\u09a6\u09b0\u09cd\u09b6\u09a8\u09c7\u09b0 \u099c\u09a8\u09cd\u09af\", \"\u0995\u09ae\", \"\u09ad\u09be\u09b2\u09cb \u09a5\u09c7\u0995\u09c7 \u0995\u09ae\", \"\u09ad\u09be\u09b2\u09cb\", \"\u0996\u09c1\u09ac \u09ad\u09be\u09b2\u09cb\", \"\u099a\u09ae\u09ce\u0995\u09be\u09b0\", \"\u09a6\u09c8\u09a8\u09a8\u09cd\u09a6\u09bf\u09a8 \u09aa\u09b0\u09bf\u09a7\u09be\u09a8\", \"\u0998\u09a8 \u0998\u09a8 \u09aa\u09b0\u09bf\u09a7\u09be\u09a8\", \"\u09ae\u09be\u099d\u09c7 \u09ae\u09be\u099d\u09c7 \u09aa\u09b0\u09bf\u09a7\u09be\u09a8\", \"\u09b8\u0982\u0997\u09cd\u09b0\u09b9 \/ \u09aa\u09cd\u09b0\u09a6\u09b0\u09cd\u09b6\u09a8\"],\r\n      ro: [\"Numai pentru expunere\", \"Slab\u0103\", \"De la bun\u0103 la slab\u0103\", \"Bun\u0103\", \"Foarte bun\u0103\", \"Excelent\u0103\", \"Purtare zilnic\u0103\", \"Purtare frecvent\u0103\", \"Purtare ocazional\u0103\", \"Colec\u021bie \/ expunere\"],\r\n      hu: [\"Csak ki\u00e1ll\u00edt\u00e1sra\", \"Gyenge\", \"J\u00f3t\u00f3l gyeng\u00e9ig\", \"J\u00f3\", \"Nagyon j\u00f3\", \"Kiv\u00e1l\u00f3\", \"Mindennapi viselet\", \"Gyakori viselet\", \"Alkalmi viselet\", \"Gy\u0171jtem\u00e9ny \/ ki\u00e1ll\u00edt\u00e1s\"],\r\n      he: [\"\u05dc\u05ea\u05e6\u05d5\u05d2\u05d4 \u05d1\u05dc\u05d1\u05d3\", \"\u05e0\u05de\u05d5\u05db\u05d4\", \"\u05de\u05d8\u05d5\u05d1\u05d4 \u05e2\u05d3 \u05e0\u05de\u05d5\u05db\u05d4\", \"\u05d8\u05d5\u05d1\u05d4\", \"\u05d8\u05d5\u05d1\u05d4 \u05de\u05d0\u05d5\u05d3\", \"\u05de\u05e6\u05d5\u05d9\u05e0\u05ea\", \"\u05e2\u05e0\u05d9\u05d3\u05d4 \u05d9\u05d5\u05de\u05d9\u05d5\u05de\u05d9\u05ea\", \"\u05e2\u05e0\u05d9\u05d3\u05d4 \u05ea\u05db\u05d5\u05e4\u05d4\", \"\u05e2\u05e0\u05d9\u05d3\u05d4 \u05de\u05d6\u05d3\u05de\u05e0\u05ea\", \"\u05d0\u05d5\u05e1\u05e3 \/ \u05ea\u05e6\u05d5\u05d2\u05d4\"],\r\n      sw: [\"Kwa maonyesho tu\", \"Duni\", \"Nzuri hadi duni\", \"Nzuri\", \"Nzuri sana\", \"Bora kabisa\", \"Kuvaliwa kila siku\", \"Kuvaliwa mara kwa mara\", \"Kuvaliwa wakati mwingine\", \"Mkusanyiko \/ maonyesho\"],\r\n      fi: [\"Vain esittelyyn\", \"Heikko\", \"Hyv\u00e4st\u00e4 heikkoon\", \"Hyv\u00e4\", \"Eritt\u00e4in hyv\u00e4\", \"Erinomainen\", \"P\u00e4ivitt\u00e4iseen k\u00e4ytt\u00f6\u00f6n\", \"Usein k\u00e4ytett\u00e4v\u00e4ksi\", \"Satunnaiseen k\u00e4ytt\u00f6\u00f6n\", \"Kokoelma \/ esittely\"],\r\n      nb: [\"Kun for utstilling\", \"D\u00e5rlig\", \"God til d\u00e5rlig\", \"God\", \"Sv\u00e6rt god\", \"Utmerket\", \"Daglig bruk\", \"Hyppig bruk\", \"Sporadisk bruk\", \"Samling \/ utstilling\"],\r\n      sk: [\"Iba na vystavenie\", \"N\u00edzka\", \"Dobr\u00e1 a\u017e n\u00edzka\", \"Dobr\u00e1\", \"Ve\u013emi dobr\u00e1\", \"Vynikaj\u00faca\", \"Ka\u017edodenn\u00e9 nosenie\", \"\u010cast\u00e9 nosenie\", \"Pr\u00edle\u017eitostn\u00e9 nosenie\", \"Zbierka \/ vystavenie\"]\r\n    };\r\n\r\n    function cardPrimaryLanguage() {\r\n      return currentPageLanguage().split('-')[0];\r\n    }\r\n\r\n    function sameCardSource(value, source) {\r\n      return cleanText(value).toLocaleLowerCase() === cleanText(source).toLocaleLowerCase();\r\n    }\r\n\r\n    function cardUiText(key, fallback) {\r\n      var indexed = homeUiText(key, '');\r\n      return indexed || cleanText(fallback || '');\r\n    }\r\n\r\n    function cardWearabilityText(value, indexed, fallback) {\r\n      void value;\r\n      return indexed || fallback;\r\n    }\r\n\r\n    function facetLabel(key, value) {\r\n      if (Array.isArray(value)) {\r\n        var labels = value.slice(0, 12).map(function(entry) {\r\n          return facetLabel(key, entry);\r\n        }).filter(Boolean);\r\n        return labels.length ? labels.join(', ') : homeUiText('not_listed', 'Not listed');\r\n      }\r\n\r\n      value = cleanText(value).slice(0, 120);\r\n      var map = facetTranslations[key] || {};\r\n      var translated = Object.prototype.hasOwnProperty.call(map, value) ? map[value] : '';\r\n      var fallback = labelize(value) || homeUiText('not_listed', 'Not listed');\r\n      if (key === 'wearability') translated = cardWearabilityText(value, translated, fallback);\r\n      return localized(translated, fallback);\r\n    }\r\n\r\n    function matchesSearch(item, terms) {\r\n      if (!terms.length) return true;\r\n      var haystack = typeof item._crdbSearch === 'string' ? item._crdbSearch : '';\r\n      if (!haystack) {\r\n        haystack = normalize(itemSearchText(item) || item.title || '');\r\n        item._crdbSearch = haystack;\r\n      }\r\n      return terms.every(function(term) {\r\n        return haystack.indexOf(term) !== -1;\r\n      });\r\n    }\r\n\r\n    function setSearchStatus(text) {\r\n      if (!searchStatus) return;\r\n      searchStatus.textContent = text || '';\r\n      searchStatus.hidden = !text;\r\n    }\r\n\r\n    function setSearchMatchStatus(count) {\r\n      if (!searchStatus) return;\r\n      renderVariableTemplate(\r\n        searchStatus,\r\n        matchCountTemplate(count),\r\n        formatVariableNumber(count),\r\n        count === 1 ? '%s matching mineral' : '%s matching minerals'\r\n      );\r\n      searchStatus.hidden = false;\r\n    }\r\n\r\n    function homeUiText(key, fallback) {\r\n      var value = Object.prototype.hasOwnProperty.call(homeUi, key) ? homeUi[key] : '';\r\n      return cleanText(value) || cleanText(fallback || '');\r\n    }\r\n\r\n    function currentPageLanguage() {\r\n      var published = window.crystalsMcfLanguage && typeof window.crystalsMcfLanguage === 'object'\r\n        ? window.crystalsMcfLanguage\r\n        : {};\r\n      return cleanText(published.code || indexLanguage || document.documentElement.getAttribute('lang') || '')\r\n        .toLowerCase()\r\n        .replace(\/_\/g, '-');\r\n    }\r\n\r\n    function matchCountTemplate(count) {\r\n      var one = count === 1;\r\n      var key = one ? 'home_match_one' : 'home_match_many';\r\n      var englishTemplate = one ? '%s matching mineral' : '%s matching minerals';\r\n      return homeUiText(key, englishTemplate);\r\n    }\r\n\r\n    function shownCountTemplate() {\r\n      return homeUiText('shown', '%s shown');\r\n    }\r\n\r\n    function updateSearchStatus() {\r\n      if (!searchInput || !items.length) return;\r\n      if (searchInput.value.length > 160) searchInput.value = searchInput.value.slice(0, 160);\r\n      var query = searchInput.value.trim();\r\n      if (!query) {\r\n\t\tpreviousSearch = { query: '', matches: [] };\r\n        setSearchStatus('');\r\n        return;\r\n      }\r\n      var normalizedQuery = normalize(query).trim();\r\n      var terms = normalizedQuery.split(\/\\s+\/).filter(Boolean).slice(0, 16);\r\n      var pool = previousSearch.query && normalizedQuery.indexOf(previousSearch.query) === 0\r\n        ? previousSearch.matches\r\n        : items;\r\n      var matches = pool.filter(function(item) {\r\n        return matchesSearch(item, terms);\r\n      });\r\n      previousSearch = { query: normalizedQuery, matches: matches };\r\n\t  if (!translationReady && matches.length === 0) {\r\n\t\tsetSearchStatus('\u2026');\r\n\t\treturn;\r\n\t  }\r\n      setSearchMatchStatus(matches.length);\r\n    }\r\n\r\n    function normalizeUrl(value, sameOrigin) {\r\n      var url = String(value || '').trim();\r\n      if (!url) return '';\r\n      try {\r\n        var parsed = new URL(url, window.location.href);\r\n        if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return '';\r\n        if (sameOrigin && parsed.origin !== window.location.origin) return '';\r\n        return parsed.href;\r\n      } catch (e) {\r\n        return '';\r\n      }\r\n    }\r\n\r\n    function cleanLanguageSlugs(value) {\r\n      var values = value;\r\n      if (typeof values === 'string') {\r\n        try { values = JSON.parse(values || '[]'); } catch (e) { values = []; }\r\n      }\r\n      return Array.isArray(values) ? values.map(function(slug) {\r\n        try { return decodeURIComponent(String(slug || '')).toLowerCase(); }\r\n        catch (e) { return String(slug || '').toLowerCase(); }\r\n      }).filter(Boolean) : [];\r\n    }\r\n\r\n    function languageKey(value) {\r\n      return cleanText(value).toLowerCase().replace(\/-\/g, '_').replace(\/[^a-z0-9_]\/g, '').slice(0, 32);\r\n    }\r\n\r\n    function languageContext() {\r\n      var published = window.crystalsMcfLanguage && typeof window.crystalsMcfLanguage === 'object'\r\n        ? window.crystalsMcfLanguage\r\n        : {};\r\n      var collection = document.querySelector('[data-cmcf-v2]');\r\n      return {\r\n        currentLanguage: cleanText(\r\n          root.getAttribute('data-crdb-current-language') ||\r\n          published.code ||\r\n          indexLanguage ||\r\n          document.documentElement.getAttribute('lang') ||\r\n          ''\r\n        ),\r\n        defaultLanguage: cleanText(\r\n          root.getAttribute('data-crdb-default-language') ||\r\n          published.defaultCode ||\r\n          ''\r\n        ),\r\n        isDefaultLanguage: typeof published.isDefaultLanguage === 'boolean'\r\n          ? published.isDefaultLanguage\r\n          : null,\r\n        languageHome: normalizeUrl(\r\n          root.getAttribute('data-crdb-language-home') ||\r\n          published.homeUrl ||\r\n          (collection && collection.getAttribute('data-language-home')) ||\r\n          '',\r\n          false\r\n        ),\r\n        defaultHome: normalizeUrl(\r\n          root.getAttribute('data-crdb-default-home') ||\r\n          published.defaultHomeUrl ||\r\n          (collection && collection.getAttribute('data-default-home')) ||\r\n          '',\r\n          false\r\n        ),\r\n        collectionUrl: normalizeUrl(\r\n          root.getAttribute('data-crdb-collection-url') ||\r\n          published.collectionUrl ||\r\n          '',\r\n          false\r\n        ),\r\n        slugs: cleanLanguageSlugs(\r\n          root.getAttribute('data-crdb-language-slugs') ||\r\n          published.slugs ||\r\n          (collection && collection.getAttribute('data-language-slugs')) ||\r\n          []\r\n        )\r\n      };\r\n    }\r\n\r\n    function cleanCollectionUrlMap(value) {\r\n      var source = value;\r\n      var map = {};\r\n\r\n      if (typeof source === 'string') {\r\n        try { source = JSON.parse(source || '{}'); } catch (e) { source = {}; }\r\n      }\r\n      if (!source || typeof source !== 'object' || Array.isArray(source)) return map;\r\n\r\n      Object.keys(source).forEach(function(key) {\r\n        var url = normalizeUrl(source[key], false);\r\n        var normalizedKey = languageKey(key);\r\n        var rawKey = cleanText(key).toLowerCase();\r\n        if (url && normalizedKey) map[normalizedKey] = url;\r\n        if (url && rawKey) map[rawKey] = url;\r\n      });\r\n\r\n      return map;\r\n    }\r\n\r\n    function collectionUrlMap() {\r\n      var published = window.crystalsMcfLanguage && typeof window.crystalsMcfLanguage === 'object'\r\n        ? window.crystalsMcfLanguage\r\n        : {};\r\n      var sources = [\r\n        root.getAttribute('data-crdb-collection-urls'),\r\n        window.crystalsMcfCollectionUrls,\r\n        published.collectionUrls\r\n      ];\r\n      var map = {};\r\n\r\n      sources.forEach(function(source) {\r\n        var parsed = cleanCollectionUrlMap(source);\r\n        Object.keys(parsed).forEach(function(key) {\r\n          map[key] = parsed[key];\r\n        });\r\n      });\r\n\r\n      return map;\r\n    }\r\n\r\n    function currentPathLanguageSlug(context) {\r\n      try {\r\n        var current = new URL(window.location.href);\r\n        var path = '\/' + current.pathname.replace(\/^\\\/+\/, '');\r\n        var basePath = '\/';\r\n\r\n        if (context && context.defaultHome) {\r\n          basePath = directoryPath(new URL(context.defaultHome, window.location.href).pathname);\r\n        }\r\n\r\n        var relative = basePath === '\/'\r\n          ? path.slice(1)\r\n          : (path.indexOf(basePath) === 0 ? path.slice(basePath.length) : path.replace(\/^\\\/+\/, ''));\r\n        var first = relative.split('\/')[0] || '';\r\n\r\n        try { return decodeURIComponent(first).toLowerCase(); }\r\n        catch (e) { return first.toLowerCase(); }\r\n      } catch (e) {\r\n        return '';\r\n      }\r\n    }\r\n\r\n    function resolveCollectionUrl(context) {\r\n      context = context || languageContext();\r\n\r\n      var published = window.crystalsMcfLanguage && typeof window.crystalsMcfLanguage === 'object'\r\n        ? window.crystalsMcfLanguage\r\n        : {};\r\n      var map = collectionUrlMap();\r\n      var pathSlug = currentPathLanguageSlug(context);\r\n      var candidates = [\r\n        context.currentLanguage,\r\n        currentPageLanguage(),\r\n        document.documentElement.getAttribute('lang') || '',\r\n        published.code || '',\r\n        published.slug || '',\r\n        pathSlug\r\n      ];\r\n\r\n      candidates.slice().forEach(function(candidate) {\r\n        var primary = cleanText(candidate).split(\/[-_]\/)[0];\r\n        if (primary && candidates.indexOf(primary) === -1) candidates.push(primary);\r\n      });\r\n\r\n      for (var index = 0; index < candidates.length; index++) {\r\n        var candidate = cleanText(candidates[index]).toLowerCase();\r\n        var key = languageKey(candidate);\r\n        if (key && map[key]) return map[key];\r\n        if (candidate && map[candidate]) return map[candidate];\r\n      }\r\n\r\n      if (context.collectionUrl) return context.collectionUrl;\r\n\r\n      if (context.languageHome) {\r\n        try { return new URL('mineral-collection\/', context.languageHome).href; }\r\n        catch (e) {}\r\n      }\r\n\r\n      if (context.defaultHome && pathSlug && (!context.slugs.length || context.slugs.indexOf(pathSlug) !== -1)) {\r\n        try { return new URL(pathSlug + '\/mineral-collection\/', context.defaultHome).href; }\r\n        catch (e) {}\r\n      }\r\n\r\n      if (context.defaultHome) {\r\n        try { return new URL('mineral-collection\/', context.defaultHome).href; }\r\n        catch (e) {}\r\n      }\r\n\r\n      return '';\r\n    }\r\n\r\n    function equivalentHomeUrls(left, right) {\r\n      if (!left || !right) return false;\r\n      try {\r\n        var first = new URL(left, window.location.href);\r\n        var second = new URL(right, window.location.href);\r\n        var firstPath = '\/' + first.pathname.replace(\/^\\\/+|\\\/+$\/g, '');\r\n        var secondPath = '\/' + second.pathname.replace(\/^\\\/+|\\\/+$\/g, '');\r\n        return first.origin.toLowerCase() === second.origin.toLowerCase() && firstPath === secondPath;\r\n      } catch (e) {\r\n        return false;\r\n      }\r\n    }\r\n\r\n    function isDefaultLanguageContext(context) {\r\n      if (typeof context.isDefaultLanguage === 'boolean') return context.isDefaultLanguage;\r\n\r\n      var currentKey = languageKey(context.currentLanguage);\r\n      var defaultKey = languageKey(context.defaultLanguage);\r\n      if (currentKey && defaultKey) return currentKey === defaultKey;\r\n\r\n      if (context.languageHome && context.defaultHome) {\r\n        return equivalentHomeUrls(context.languageHome, context.defaultHome);\r\n      }\r\n\r\n      \/* Unknown is deliberately not treated as the source language. *\/\r\n      return null;\r\n    }\r\n\r\n    function configureTranslatePressDynamicCapture() {\r\n      localizedDynamicNodes.forEach(function(node) {\r\n        node.classList.remove('crystals-localized-content');\r\n        node.removeAttribute('data-no-dynamic-translation');\r\n        node.removeAttribute('data-crystals-localized-content');\r\n      });\r\n\r\n      root.setAttribute('data-crdb-translation-mode', 'capture-source');\r\n      return true;\r\n    }\r\n\r\n    function directoryPath(value) {\r\n      var clean = String(value || '').replace(\/^\\\/+|\\\/+$\/g, '');\r\n      return clean ? '\/' + clean + '\/' : '\/';\r\n    }\r\n\r\n    function pathContains(path, base) {\r\n      base = directoryPath(base);\r\n      path = '\/' + String(path || '').replace(\/^\\\/+\/, '');\r\n      return base === '\/' || path === base.slice(0, -1) || path.indexOf(base) === 0;\r\n    }\r\n\r\n    function stripKnownLanguagePrefix(relative, slugs) {\r\n      var parts = String(relative || '').split('\/');\r\n      var first = '';\r\n      try { first = decodeURIComponent(parts[0] || '').toLowerCase(); } catch (e) { first = String(parts[0] || '').toLowerCase(); }\r\n      if (first && slugs.indexOf(first) !== -1) parts.shift();\r\n      return parts.join('\/');\r\n    }\r\n\r\n    function localizedContentUrl(value) {\r\n      var itemUrl = normalizeUrl(value, false);\r\n      var context = languageContext();\r\n      if (!itemUrl || !context.languageHome || !context.defaultHome) return itemUrl;\r\n\r\n      try {\r\n        var item = new URL(itemUrl);\r\n        var localized = new URL(context.languageHome);\r\n        var base = new URL(context.defaultHome);\r\n        var isDefault = localized.href.replace(\/\\\/$\/, '') === base.href.replace(\/\\\/$\/, '');\r\n\r\n        if (!isDefault && item.origin === localized.origin && pathContains(item.pathname, localized.pathname)) {\r\n          return item.href;\r\n        }\r\n        if (item.origin !== base.origin) return item.href;\r\n        if (!pathContains(item.pathname, base.pathname)) {\r\n          return item.href;\r\n        }\r\n\r\n        var basePath = directoryPath(base.pathname);\r\n        var itemPath = '\/' + item.pathname.replace(\/^\\\/+\/, '');\r\n        var relative = basePath === '\/' ? itemPath.slice(1) : itemPath.slice(basePath.length);\r\n        relative = stripKnownLanguagePrefix(relative, context.slugs);\r\n        var localizedPath = isDefault ? basePath : directoryPath(localized.pathname);\r\n\r\n        item.protocol = localized.protocol;\r\n        item.host = localized.host;\r\n        item.pathname = localizedPath + relative.replace(\/^\\\/+\/, '');\r\n        return item.href;\r\n      } catch (e) {\r\n        return itemUrl;\r\n      }\r\n    }\r\n\r\n    function applyLocalizedNavigation() {\r\n      var context = languageContext();\r\n\r\n      root.querySelectorAll('[data-crdb-collection-link]').forEach(function(node) {\r\n        var attribute = node.tagName === 'FORM' ? 'action' : 'href';\r\n        var original = node.getAttribute('data-crdb-default-url') || node.getAttribute(attribute) || '';\r\n        if (!node.getAttribute('data-crdb-default-url')) {\r\n          node.setAttribute('data-crdb-default-url', original);\r\n        }\r\n\r\n        var collectionUrl = resolveCollectionUrl(context);\r\n        if (collectionUrl) {\r\n          node.setAttribute(attribute, collectionUrl);\r\n          return;\r\n        }\r\n        if (context.collectionUrl) {\r\n          node.setAttribute(attribute, context.collectionUrl);\r\n          return;\r\n        }\r\n        if (!context.languageHome || !context.defaultHome) return;\r\n\r\n        try {\r\n          var absolute = new URL(original, context.defaultHome).href;\r\n          var localized = localizedContentUrl(absolute);\r\n          if (localized) node.setAttribute(attribute, localized);\r\n        } catch (e) {\r\n          \/* Keep the original navigation target if a malformed URL is supplied. *\/\r\n        }\r\n      });\r\n    }\r\n\r\n    function getIndexUrl() {\r\n      var homeDirectUrl = normalizeUrl(root.getAttribute('data-crdb-home-index-url'), true);\r\n      if (homeDirectUrl) return homeDirectUrl;\r\n\r\n      if (window.crystalsMcfHomeIndexUrl) {\r\n        return normalizeUrl(window.crystalsMcfHomeIndexUrl, true);\r\n      }\r\n\r\n      if (window.crystalsMcfIndex && window.crystalsMcfIndex.homeUrl) {\r\n        return normalizeUrl(window.crystalsMcfIndex.homeUrl, true);\r\n      }\r\n\r\n      var directUrl = normalizeUrl(root.getAttribute('data-crdb-index-url'), true);\r\n      if (directUrl) return directUrl;\r\n\r\n      if (window.crystalsMcfIndexUrl) {\r\n        return normalizeUrl(window.crystalsMcfIndexUrl, true);\r\n      }\r\n\r\n      if (window.crystalsMcfIndex && window.crystalsMcfIndex.url) {\r\n        return normalizeUrl(window.crystalsMcfIndex.url, true);\r\n      }\r\n\r\n      var collection = document.querySelector('[data-cmcf-v2]');\r\n      var collectionUrl = collection && collection.getAttribute('data-index-url');\r\n      if (collectionUrl) return normalizeUrl(collectionUrl, true);\r\n\r\n      return '';\r\n    }\r\n\r\n    function pickRandom(list, limit) {\r\n      var copy = list.slice();\r\n      var max = Math.min(limit, copy.length);\r\n      for (var i = 0; i < max; i++) {\r\n        var j = i + Math.floor(Math.random() * (copy.length - i));\r\n        var t = copy[i];\r\n        copy[i] = copy[j];\r\n        copy[j] = t;\r\n      }\r\n      return copy.slice(0, max);\r\n    }\r\n\r\n    function hardness(item) {\r\n      var min = Number.isFinite(item.hardness_min) ? item.hardness_min : null;\r\n      var max = Number.isFinite(item.hardness_max) ? item.hardness_max : null;\r\n      if (min === null && max === null) return homeUiText('not_listed', 'Not listed');\r\n      if (min !== null && max !== null) return min === max ? String(min) : min + ' - ' + max;\r\n      return String(min !== null ? min : max);\r\n    }\r\n\r\n    var chemicalElementSymbols = Object.create(null);\r\n    'H He Li Be B C N O F Ne Na Mg Al Si P S Cl Ar K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe Cs Ba La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb Lu Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn Fr Ra Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr Rf Db Sg Bh Hs Mt Ds Rg Cn Nh Fl Mc Lv Ts Og'.split(' ').forEach(function(symbol) {\r\n      chemicalElementSymbols[symbol] = true;\r\n    });\r\n\r\n    function formulaFromSearchText(value) {\r\n      var candidates = cleanText(value).match(\/[A-Z][A-Za-z0-9\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b()[\\]{}\u00b7.+\u2212-]{0,159}\/g) || [];\r\n\r\n      for (var index = 0; index < candidates.length; index++) {\r\n        var candidate = candidates[index].replace(\/[.,;:]+$\/, '');\r\n        var symbolsOnly = candidate.replace(\/[0-9\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b()[\\]{}\u00b7.+\u2212-]\/g, '');\r\n        var symbols = symbolsOnly.match(\/[A-Z][a-z]?\/g) || [];\r\n        if (!symbols.length || symbols.join('') !== symbolsOnly) continue;\r\n        var hasNumberOrCharge = \/[0-9\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2070\u00b9\u00b2\u00b3\u2074\u2075\u2076\u2077\u2078\u2079\u207a\u207b]\/.test(candidate);\r\n        var isSimpleFormula = \/^[A-Z][a-z]?(?:[A-Z][a-z]?)+$\/.test(candidate);\r\n        var isNativeElement = symbols.length === 1 && candidate === symbols[0];\r\n        if (!hasNumberOrCharge && !isSimpleFormula && !isNativeElement) continue;\r\n        if (symbols.every(function(symbol) { return chemicalElementSymbols[symbol] === true; })) {\r\n          return candidate.slice(0, 300);\r\n        }\r\n      }\r\n\r\n      return '';\r\n    }\r\n\r\n    function mineralFormula(item) {\r\n      var direct = itemText(item, 'formula').slice(0, 300);\r\n      return direct || formulaFromSearchText(itemSearchText(item));\r\n    }\r\n\r\n    function formulaLabel() {\r\n      var indexed = homeUiText('formula', '');\r\n      return indexed || 'Chemical Formula';\r\n    }\r\n\r\n    function element(tag, className, text) {\r\n      var node = document.createElement(tag);\r\n      if (className) node.className = className;\r\n      if (text !== undefined) node.textContent = text;\r\n      return node;\r\n    }\r\n\r\n    function variableElement(value, className) {\r\n      var node = element('span', className || 'crdb-template__variable', value);\r\n      node.setAttribute('data-no-translation', '');\r\n      node.setAttribute('data-crdb-template-variable', '');\r\n      return node;\r\n    }\r\n\r\n    function templateTextElement(text) {\r\n      var node = element('span', 'crdb-template__text', text);\r\n      node.setAttribute('data-crdb-template-text', '');\r\n      return node;\r\n    }\r\n\r\n    function formatVariableNumber(value) {\r\n      var number = Number(value);\r\n      return (Number.isFinite(number) ? Math.max(0, number) : 0).toLocaleString();\r\n    }\r\n\r\n    function renderVariableTemplate(target, template, value, fallbackTemplate) {\r\n      if (!target) return;\r\n\r\n      var source = cleanText(template) || cleanText(fallbackTemplate || '%s') || '%s';\r\n      var parts = source.split('%s');\r\n      target.replaceChildren();\r\n\r\n      if (parts.length === 1) {\r\n        target.appendChild(variableElement(value));\r\n        if (parts[0]) {\r\n          target.appendChild(document.createTextNode(' '));\r\n          target.appendChild(templateTextElement(parts[0]));\r\n        }\r\n        return;\r\n      }\r\n\r\n      parts.forEach(function(part, index) {\r\n        if (part) target.appendChild(templateTextElement(part));\r\n        if (index < parts.length - 1) target.appendChild(variableElement(value));\r\n      });\r\n    }\r\n\r\n    function renderRandomCount(count) {\r\n      if (!randomCount) return;\r\n      renderVariableTemplate(randomCount, shownCountTemplate(), formatVariableNumber(count), '%s shown');\r\n      randomCount.hidden = false;\r\n    }\r\n\r\n    function addFact(parent, label, value) {\r\n      var fact = element('span');\r\n      fact.appendChild(element('b', '', label));\r\n      fact.appendChild(document.createTextNode(cleanText(value) || homeUiText('not_listed', 'Not listed')));\r\n      parent.appendChild(fact);\r\n    }\r\n\r\n    function createMineralCard(item) {\r\n      if (!item || typeof item !== 'object' || Array.isArray(item)) return null;\r\n\r\n      var itemUrl = localizedContentUrl(itemText(item, 'url'));\r\n      if (!itemUrl) return null;\r\n\r\n      var title = itemText(item, 'title').slice(0, 300);\r\n      var excerpt = itemText(item, 'excerpt').slice(0, 700);\r\n      var imageUrl = normalizeUrl(itemText(item, 'image'), false);\r\n      var formula = mineralFormula(item);\r\n      var link = element('a', 'crdb-mineral');\r\n      var media = element('div', imageUrl ? 'crdb-mineral__media' : 'crdb-mineral__media crdb-mineral__media--empty');\r\n      var copy = element('div', 'crdb-mineral__copy');\r\n      var facts = element('div', 'crdb-mineral__facts');\r\n\r\n      link.href = itemUrl;\r\n      if (imageUrl) {\r\n        var image = document.createElement('img');\r\n        image.src = imageUrl;\r\n        image.alt = title;\r\n        image.loading = 'lazy';\r\n        image.decoding = 'async';\r\n        media.appendChild(image);\r\n      } else {\r\n        media.setAttribute('aria-hidden', 'true');\r\n      }\r\n\r\n      copy.appendChild(element('span', 'crdb-mineral__meta', homeUiText('mineral_record', 'Mineral record')));\r\n      var heading = element('h3', '', title);\r\n      var description = element('p', '', excerpt || homeUiText('open_record', 'Open this record to review its complete mineralogical profile.'));\r\n      heading.setAttribute('dir', 'auto');\r\n      description.setAttribute('dir', 'auto');\r\n      copy.appendChild(heading);\r\n      copy.appendChild(description);\r\n      addFact(facts, cardUiText('color', 'Color'), facetLabel('color', item.color));\r\n      addFact(facts, cardUiText('mohs', 'Mohs'), hardness(item));\r\n      addFact(facts, cardUiText('wearability', 'Wearability'), facetLabel('wearability', item.wearability));\r\n      addFact(facts, formulaLabel(), formula || homeUiText('not_listed', 'Not listed'));\r\n      copy.appendChild(facts);\r\n      link.appendChild(media);\r\n      link.appendChild(copy);\r\n\r\n      return link;\r\n    }\r\n\r\n    function renderMineralCards(selected) {\r\n      if (!grid) return;\r\n      grid.replaceChildren();\r\n      if (!selected.length) {\r\n        renderRandomCount(0);\r\n        if (status) {\r\n          status.hidden = false;\r\n          status.textContent = homeUiText('no_matching', 'No matching minerals found.');\r\n        }\r\n        return;\r\n      }\r\n\r\n      var fragment = document.createDocumentFragment();\r\n      selected.forEach(function(item) {\r\n        var card = createMineralCard(item);\r\n        if (card) fragment.appendChild(card);\r\n      });\r\n      grid.appendChild(fragment);\r\n\r\n      renderRandomCount(selected.length);\r\n      if (status) status.hidden = true;\r\n    }\r\n\r\n    function clearMineralCardsForLanguageChange() {\r\n      if (grid) grid.replaceChildren();\r\n      if (randomCount) {\r\n        randomCount.textContent = '';\r\n        randomCount.hidden = true;\r\n      }\r\n      if (status) {\r\n        status.textContent = '\u2026';\r\n        status.hidden = false;\r\n      }\r\n      root.setAttribute('data-crdb-card-language', languageKey(currentPageLanguage()) || 'pending');\r\n    }\r\n\r\n    function cardStatusText(key, fallback, neutral) {\r\n      void neutral;\r\n      var indexed = homeUiText(key, '');\r\n      return indexed || fallback;\r\n    }\r\n\r\n    function renderRandomMinerals() {\r\n      if (!items.length) return;\r\n      var selected = pickRandom(items, 8);\r\n      renderMineralCards(selected);\r\n    }\r\n\r\n    function scheduleTranslationRefresh() {\r\n      if (translationReady || translationRefreshAttempts >= 20) return;\r\n      window.clearTimeout(translationRefreshTimer);\r\n      translationRefreshTimer = window.setTimeout(function() {\r\n        translationRefreshAttempts += 1;\r\n        loadIndex(true);\r\n      }, 15000);\r\n    }\r\n\r\n    function loadIndex(force) {\r\n      var url = getIndexUrl();\r\n      if (!url) return false;\r\n      if (indexState === 'loading') return true;\r\n      if (!force && indexState === 'loaded' && activeIndexUrl === url) return true;\r\n      root.setAttribute('data-crdb-index-url', url);\r\n      indexState = 'loading';\r\n      activeIndexUrl = url;\r\n      var requestId = ++indexRequestId;\r\n      var requestUrl = url;\r\n      var hadItems = items.length > 0;\r\n      var wasTranslationReady = translationReady;\r\n      var fetchOptions = { credentials: 'same-origin', cache: 'no-cache' };\r\n\r\n      if (indexAbortController && typeof indexAbortController.abort === 'function') {\r\n        indexAbortController.abort();\r\n      }\r\n      indexAbortController = typeof window.AbortController === 'function' ? new window.AbortController() : null;\r\n      if (indexAbortController) fetchOptions.signal = indexAbortController.signal;\r\n\r\n      fetch(requestUrl, fetchOptions)\r\n        .then(function(response) {\r\n          if (!response.ok) throw new Error('HTTP ' + response.status);\r\n          var size = Number(response.headers.get('content-length') || 0);\r\n          if (size > 128 * 1024 * 1024) throw new Error('Index too large');\r\n          return response.json();\r\n        })\r\n        .then(function(data) {\r\n          if (requestId !== indexRequestId) return;\r\n          var expectedLanguage = languageKey(currentPageLanguage());\r\n          var responseLanguage = languageKey(data && data.language ? data.language : '');\r\n          var sourceLanguage = languageKey(languageContext().defaultLanguage);\r\n          if (expectedLanguage && responseLanguage && expectedLanguage !== responseLanguage && (!sourceLanguage || sourceLanguage !== responseLanguage)) {\r\n            throw new Error('Index language mismatch');\r\n          }\r\n          indexState = 'loaded';\r\n          indexAbortController = null;\r\n          indexRetries = 0;\r\n          items = Array.isArray(data.items) ? data.items.filter(function(item) {\r\n            return item && typeof item === 'object' && !Array.isArray(item);\r\n          }) : [];\r\n          facetTranslations = data.facet_translations && typeof data.facet_translations === 'object' && !Array.isArray(data.facet_translations)\r\n            ? data.facet_translations\r\n            : {};\r\n          homeUi = data.ui && typeof data.ui === 'object' && !Array.isArray(data.ui) ? data.ui : {};\r\n          indexLanguage = cleanText(data.language || '');\r\n          configureTranslatePressDynamicCapture();\r\n          var loadedLanguage = currentPageLanguage();\r\n          var hasReadinessMarker = Object.prototype.hasOwnProperty.call(data, 'translation_ready');\r\n          translationReady = data.translation_ready === true || (!hasReadinessMarker && \/^en(?:-|$)\/.test(loadedLanguage));\r\n          root.setAttribute('data-crdb-card-language', responseLanguage || expectedLanguage || 'unknown');\r\n          previousSearch = { query: '', matches: [] };\r\n          var recordTotal = Number.isFinite(Number(data.total)) ? Math.max(0, Number(data.total)) : items.length;\r\n          renderVariableTemplate(total, '%s', formatVariableNumber(recordTotal), '%s');\r\n          updateSearchStatus();\r\n\r\n          \/* A fallback index is still valid display data. Keep its source text\r\n           * visible while the translated index is rebuilt; translationReady\r\n           * controls only the background refresh, never card visibility. *\/\r\n          if (items.length) {\r\n            if (!hadItems || (!wasTranslationReady && translationReady)) renderRandomMinerals();\r\n          } else if (status) {\r\n            status.hidden = false;\r\n            status.textContent = cardStatusText('no_records', 'No mineral records are available yet.', '\u2014');\r\n          }\r\n          if (translationReady) {\r\n            translationRefreshAttempts = 0;\r\n            window.clearTimeout(translationRefreshTimer);\r\n          } else {\r\n            scheduleTranslationRefresh();\r\n          }\r\n        })\r\n        .catch(function(error) {\r\n          if (error && error.name === 'AbortError') return;\r\n          if (requestId !== indexRequestId) return;\r\n          indexState = 'failed';\r\n          indexAbortController = null;\r\n          if (indexRetries < 2) {\r\n            indexRetries += 1;\r\n            if (status) {\r\n              status.hidden = false;\r\n              status.textContent = cardStatusText('retrying_records', 'Retrying mineral records...', '\u2026');\r\n            }\r\n            window.clearTimeout(indexRetryTimer);\r\n            indexRetryTimer = window.setTimeout(function() {\r\n              indexState = 'idle';\r\n              loadIndex();\r\n            }, indexRetries * 1200);\r\n            return;\r\n          }\r\n          if (status) {\r\n            status.hidden = false;\r\n            status.textContent = cardStatusText('records_error', 'Mineral records could not be loaded.', '\u2014');\r\n          }\r\n        });\r\n\r\n      return true;\r\n    }\r\n\r\n    window.addEventListener('crystalsMcfIndexReady', function(event) {\r\n      var url = normalizeUrl(event.detail && (event.detail.homeIndexUrl || event.detail.url) ? (event.detail.homeIndexUrl || event.detail.url) : '', true);\r\n      configureTranslatePressDynamicCapture();\r\n      applyLocalizedNavigation();\r\n      if (url) {\r\n\t\tvar languageChanged = activeIndexUrl && activeIndexUrl !== url;\r\n\t\troot.setAttribute('data-crdb-home-index-url', url);\r\n        root.setAttribute('data-crdb-index-url', url);\r\n\t\tif (languageChanged) {\r\n\t\t  if (indexAbortController && typeof indexAbortController.abort === 'function') indexAbortController.abort();\r\n\t\t  indexAbortController = null;\r\n\t\t  indexRequestId += 1;\r\n\t\t  items = [];\r\n\t\t  facetTranslations = {};\r\n\t\t  homeUi = {};\r\n\t\t  indexLanguage = '';\r\n\t\t  previousSearch = { query: '', matches: [] };\r\n\t\t  translationReady = false;\r\n\t\t  translationRefreshAttempts = 0;\r\n\t\t  window.clearTimeout(translationRefreshTimer);\r\n\t\t  activeIndexUrl = '';\r\n\t\t  indexState = 'idle';\r\n\t\t  clearMineralCardsForLanguageChange();\r\n\t\t  loadIndex(true);\r\n\t\t} else if (indexState === 'idle' || indexState === 'failed') {\r\n          indexState = 'idle';\r\n          loadIndex();\r\n        }\r\n      }\r\n    });\r\n\r\n    configureTranslatePressDynamicCapture();\r\n    applyLocalizedNavigation();\r\n\r\n    if (searchInput) {\r\n      searchInput.addEventListener('input', function() {\r\n        if (searchInput.value.length > 160) searchInput.value = searchInput.value.slice(0, 160);\r\n        window.clearTimeout(searchTimer);\r\n        searchTimer = window.setTimeout(updateSearchStatus, 140);\r\n      });\r\n    }\r\n    if (searchForm) {\r\n      searchForm.addEventListener('submit', function() {\r\n        if (searchInput) searchInput.value = searchInput.value.trim().slice(0, 160);\r\n      });\r\n    }\r\n\r\n    if (!loadIndex()) {\r\n      window.addEventListener('load', function() {\r\n        if (!loadIndex() && status) {\r\n          status.hidden = false;\r\n          status.textContent = cardStatusText('index_unavailable', 'The mineral index is unavailable. Confirm that the mineral collection PHP snippet is active.', '\u2014');\r\n        }\r\n      }, { once: true });\r\n    }\r\n  })();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Open Scientific Crystal Repository Crystal &amp; Mineral Database Explore structured mineral records with searchable names, formulas and IMA symbols, plus filters for color, hardness, origin and wearability. Search the crystal database Search GrowingMineral Records StructuredProfile Fields OpenPublic Access FastLocal Filtering About the database Mineral facts in a consistent structure Crystals.rocks is an open crystal and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_seopress_titles_title":"crystals.rocks","_seopress_titles_desc":"Explore the World of Crystals, Minerals, and Gemstones.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","footnotes":""},"class_list":["post-79","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/crystals.rocks\/he\/wp-json\/wp\/v2\/pages\/79","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/crystals.rocks\/he\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/crystals.rocks\/he\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/crystals.rocks\/he\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/crystals.rocks\/he\/wp-json\/wp\/v2\/comments?post=79"}],"version-history":[{"count":130,"href":"https:\/\/crystals.rocks\/he\/wp-json\/wp\/v2\/pages\/79\/revisions"}],"predecessor-version":[{"id":5041,"href":"https:\/\/crystals.rocks\/he\/wp-json\/wp\/v2\/pages\/79\/revisions\/5041"}],"wp:attachment":[{"href":"https:\/\/crystals.rocks\/he\/wp-json\/wp\/v2\/media?parent=79"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}