{
  "always_run_in_app": false,
  "icon": {
    "color": "deep-green",
    "glyph": "calendar-alt"
  },
  "name": "Hijri Date",
  "script": "// Nicely Done — Hijri Date widget for Scriptable (https://scriptable.app)\n// https://nicelydone.qd.je/widgets/\n//\n// Shows today's Hijri (Umm al-Qura) and Gregorian dates and a countdown to the\n// next Ramadan / Eid. Everything is calculated on your iPhone — no network.\n// Widget parameter (optional): \"ar\" or \"en\" to force a language.\n\nconst LANG = String(args.widgetParameter || Device.language() || \"en\").toLowerCase().startsWith(\"ar\") ? \"ar\" : \"en\";\nconst AR = LANG === \"ar\";\n\nconst C = {\n  bg: Color.dynamic(new Color(\"#f5f3ee\"), new Color(\"#0b0c0b\")),\n  text: Color.dynamic(new Color(\"#161613\"), new Color(\"#ecebe6\")),\n  muted: Color.dynamic(new Color(\"#5b5a54\"), new Color(\"#a6a59f\")),\n  faint: Color.dynamic(new Color(\"#9a988f\"), new Color(\"#6e6d68\")),\n  accent: Color.dynamic(new Color(\"#0f8a5c\"), new Color(\"#7ee2b0\")),\n  gold: Color.dynamic(new Color(\"#a87a22\"), new Color(\"#e8c98a\")),\n};\nconst SERIF = (size) => new Font(\"Georgia\", size);\nconst SERIF_IT = (size) => new Font(\"Georgia-Italic\", size);\n\nconst HM_EN = [\"Muharram\", \"Safar\", \"Rabiʿ al-Awwal\", \"Rabiʿ al-Thani\", \"Jumada al-Ula\", \"Jumada al-Akhirah\", \"Rajab\", \"Shaʿban\", \"Ramadan\", \"Shawwal\", \"Dhu al-Qaʿdah\", \"Dhu al-Hijjah\"];\nconst HM_AR = [\"محرّم\", \"صفر\", \"ربيع الأول\", \"ربيع الآخر\", \"جمادى الأولى\", \"جمادى الآخرة\", \"رجب\", \"شعبان\", \"رمضان\", \"شوّال\", \"ذو القعدة\", \"ذو الحجة\"];\nconst GM_EN = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nconst GM_AR = [\"يناير\", \"فبراير\", \"مارس\", \"أبريل\", \"مايو\", \"يونيو\", \"يوليو\", \"أغسطس\", \"سبتمبر\", \"أكتوبر\", \"نوفمبر\", \"ديسمبر\"];\nconst DOW_EN = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\nconst DOW_AR = [\"الأحد\", \"الاثنين\", \"الثلاثاء\", \"الأربعاء\", \"الخميس\", \"الجمعة\", \"السبت\"];\n\nconst arNum = (n) => String(n).replace(/\\d/g, (d) => \"٠١٢٣٤٥٦٧٨٩\"[d]);\nconst num = (n) => (AR ? arNum(n) : String(n));\n\nconst FMT = new Intl.DateTimeFormat(\"en-u-ca-islamic-umalqura-nu-latn\", { day: \"numeric\", month: \"numeric\", year: \"numeric\" });\nfunction hijri(date) {\n  const p = FMT.formatToParts(date);\n  const g = (t) => parseInt(p.find((x) => x.type === t).value, 10);\n  return { y: g(\"year\"), m: g(\"month\"), d: g(\"day\") };\n}\n\nfunction daysWord(n) {\n  if (!AR) return n === 1 ? \"1 day\" : n + \" days\";\n  if (n === 1) return \"يوم واحد\";\n  if (n === 2) return \"يومين\";\n  if (n <= 10) return arNum(n) + \" أيام\";\n  return arNum(n) + \" يومًا\";\n}\n\n// Next occasion: Ramadan starts 1/9, Eid al-Fitr 1/10, Eid al-Adha 10/12.\nfunction occasion(today, th) {\n  if (th.m === 9) return AR ? \"رمضان · اليوم \" + arNum(th.d) : \"Ramadan · day \" + th.d;\n  if (th.m === 12 && th.d >= 10 && th.d <= 13) return AR ? \"عيد الأضحى مبارك\" : \"Eid al-Adha Mubarak\";\n  if (th.m === 10 && th.d <= 3) return AR ? \"عيد الفطر مبارك\" : \"Eid al-Fitr Mubarak\";\n  const targets = [[9, 1, \"رمضان\", \"Ramadan\"], [10, 1, \"عيد الفطر\", \"Eid al-Fitr\"], [12, 10, \"عيد الأضحى\", \"Eid al-Adha\"]];\n  const d = new Date(today);\n  for (let i = 1; i <= 400; i++) {\n    d.setDate(d.getDate() + 1);\n    const h = hijri(d);\n    const t = targets.find(([m, day]) => h.m === m && h.d === day);\n    if (t) return AR ? t[2] + \" بعد \" + daysWord(i) : t[3] + \" in \" + daysWord(i);\n  }\n  return \"\";\n}\n\nconst now = new Date();\nconst H = hijri(now);\nconst hMonth = AR ? HM_AR[H.m - 1] : HM_EN[H.m - 1];\nconst yearSuffix = AR ? \" هـ\" : \" AH\";\nconst gLine = AR\n  ? DOW_AR[now.getDay()] + \"، \" + arNum(now.getDate()) + \" \" + GM_AR[now.getMonth()] + \" \" + arNum(now.getFullYear())\n  : DOW_EN[now.getDay()] + \", \" + now.getDate() + \" \" + GM_EN[now.getMonth()] + \" \" + now.getFullYear();\nconst occ = occasion(now, H);\n\nfunction text(parent, str, font, color, align) {\n  const t = parent.addText(str);\n  t.font = font; t.textColor = color; t.lineLimit = 1; t.minimumScaleFactor = 0.6;\n  if (align === \"right\") t.rightAlignText(); else if (align === \"center\") t.centerAlignText(); else t.leftAlignText();\n  return t;\n}\n\nfunction build(family) {\n  const w = new ListWidget();\n  w.url = \"https://nicelydone.qd.je/\" + (AR ? \"ar/\" : \"\") + \"date-converter/\";\n  const midnight = new Date(now); midnight.setHours(24, 0, 5, 0);\n  w.refreshAfterDate = midnight;\n  const align = AR ? \"right\" : \"left\";\n\n  if (family === \"accessoryInline\") {\n    text(w, num(H.d) + \" \" + hMonth + \" \" + num(H.y) + yearSuffix, Font.systemFont(12), C.text);\n    return w;\n  }\n  if (family === \"accessoryCircular\") {\n    w.addAccessoryWidgetBackground = true;\n    text(w, num(H.d), Font.boldSystemFont(20), C.text, \"center\");\n    text(w, hMonth.split(\" \")[0], Font.systemFont(9), C.text, \"center\");\n    return w;\n  }\n  if (family === \"accessoryRectangular\") {\n    text(w, num(H.d) + \" \" + hMonth + \" \" + num(H.y), Font.semiboldSystemFont(14), C.text, align);\n    text(w, gLine, Font.systemFont(11), C.text, align);\n    if (occ) text(w, occ, Font.systemFont(11), C.text, align);\n    return w;\n  }\n\n  w.backgroundColor = C.bg;\n  w.setPadding(14, 16, 14, 16);\n  const big = family === \"large\" ? 64 : family === \"medium\" ? 46 : 44;\n  text(w, AR ? \"هجري · أم القرى\" : \"HIJRI · UMM AL-QURA\", Font.mediumSystemFont(10), C.accent, align);\n  w.addSpacer(family === \"small\" ? 4 : 6);\n\n  if (family === \"small\") {\n    text(w, num(H.d), SERIF(big), C.text, align);\n    text(w, hMonth, AR ? Font.semiboldSystemFont(15) : SERIF_IT(17), C.accent, align);\n    text(w, num(H.y) + yearSuffix, Font.systemFont(12), C.muted, align);\n    w.addSpacer();\n    text(w, gLine, Font.systemFont(10), C.faint, align);\n    return w;\n  }\n\n  // medium / large: big day number beside month + year, in reading order\n  const row = w.addStack();\n  row.layoutHorizontally(); row.centerAlignContent();\n  const addDay = () => { const t = row.addText(num(H.d)); t.font = SERIF(big); t.textColor = C.text; };\n  const addSide = () => {\n    const side = row.addStack(); side.layoutVertically();\n    const mT = side.addText(hMonth); mT.font = AR ? Font.semiboldSystemFont(19) : SERIF_IT(22); mT.textColor = C.accent; mT.lineLimit = 1; mT.minimumScaleFactor = 0.6;\n    if (AR) mT.rightAlignText();\n    const yT = side.addText(num(H.y) + yearSuffix); yT.font = Font.systemFont(13); yT.textColor = C.muted;\n    if (AR) yT.rightAlignText();\n  };\n  if (AR) { row.addSpacer(); addSide(); row.addSpacer(12); addDay(); }\n  else { addDay(); row.addSpacer(12); addSide(); row.addSpacer(); }\n  w.addSpacer();\n  text(w, gLine, Font.mediumSystemFont(12), C.muted, align);\n  if (occ) { w.addSpacer(3); text(w, \"✦ \" + occ, Font.systemFont(11), C.gold, align); }\n  return w;\n}\n\nconst family = config.widgetFamily || \"medium\";\nconst widget = build(family);\nif (config.runsInWidget) {\n  Script.setWidget(widget);\n} else {\n  await widget.presentMedium();\n}\nScript.complete();\n",
  "share_sheet_inputs": []
}