{"version":3,"file":"material-symbols.cjs","names":[],"sources":["../../src/icons/material-symbols.ts"],"sourcesContent":["/**\n * @tempest-limits file-lines — the file is one hand-written lookup table plus the\n * two functions that read it. Splitting a table by row count would put pairs that\n * belong together (`format_*`, `electrical_*`) in different files and make the\n * next hand-written pair a question of which file it lands in; the length is the\n * vocabulary's, not the code's.\n */\nimport type { IconName } from \"./generated/icon-name\";\n\n/**\n * The slug `fromMaterialSymbol` falls back to when a code is unknown.\n *\n * A neutral glyph rather than nothing: a category created in an admin with a\n * code this table has not learned yet still has to draw something, or it opens a\n * hole in the grid and the bug reads as a layout problem instead of a missing\n * mapping.\n *\n * Lucide's `circle-help` is a deprecated alias of this slug. `<Icon>` resolves\n * aliases, so both render — but the bridge emits the canonical name, since a\n * value that gets persisted should not be one lucide has already renamed.\n */\nexport const MATERIAL_SYMBOL_FALLBACK: IconName = \"circle-question-mark\";\n\n/**\n * Material Symbols code → lucide slug, for backends that store `icon_code`.\n *\n * Every Python backend we write stores a category icon as a Material Symbol\n * (`build`, `format_paint`, `electrical_services`) — the vocabulary Flutter,\n * Android and the administrative seeds already speak. The SDK speaks lucide in\n * kebab-case. The two lists do not meet, and the failure is nastier than an\n * empty screen: a handful of codes collide by accident, so roughly one row in\n * ten draws the right icon and the bug reads as \"some icons went missing\".\n *\n * **Still not the full vocabulary.** Material Symbols publishes ~6100 names and\n * almost none of them will ever appear in an `icon_code` of ours, so this grows\n * on demand, one hand-written pair at a time — a map generated by name\n * heuristics gets it badly wrong, starting with `build`, which is a wrench in\n * Material Symbols and nothing to do with construction.\n *\n * **How the codes were chosen.** Two lots, merged. The first was the trades seed\n * the bridge started as. The second is the head of Material Symbols' own\n * published popularity ranking (`fonts.google.com/metadata/icons`), which is\n * measured usage rather than a guess at which names a seed will contain — every\n * key was checked to exist in that vocabulary before landing.\n *\n * **Where the two lots disagreed**, six keys, the tie went to whichever mapping\n * keeps two distinct Material Symbols names distinct in lucide: `error` →\n * `circle-alert` because `cancel` already owns `circle-x`; `payments` →\n * `banknote` because `account_balance_wallet` already owns `wallet`;\n * `receipt_long` → `receipt-text` because `receipt` already owns `receipt`;\n * `construction` → itself because `engineering` already owns `hard-hat`; and\n * `today` → `calendar` with `event` → `calendar-days`, splitting the generic\n * calendar names from the dated one.\n *\n * Every target is checked mechanically against the slug list by\n * `material-symbols.test.ts`, so a pair pointing at a name lucide does not ship\n * — or at one it has since deprecated — fails the suite instead of reaching a\n * grid. What no test can check is whether the *chosen* icon is the right\n * metaphor, which is why pairs go in by hand.\n *\n * **Approximations, deliberate and not one-to-one** (the full list lives in\n * `docs/icons.md`):\n *\n * - `plumbing` → `shower-head`, because lucide has no pipe.\n * - `build`, `handyman` and `hardware` all land on `wrench` — Material Symbols\n *   distinguishes the tools, lucide does not.\n * - `pedal_bike`, `two_wheeler` and `delivery_dining` all land on `bike`.\n * - `dentistry` → `face-slightly-smiling`, since lucide ships no tooth.\n * - `iron` → `shirt` and `cleaning_services` → `spray-can`: the activity, not\n *   the implement.\n * - `roofing` → `house`, the same glyph as `home`, because lucide has no roof.\n *\n * The identity pairs are here on purpose. Their names happen to match in both\n * vocabularies, so they already render today — leaving them out would send them\n * to {@link MATERIAL_SYMBOL_FALLBACK} and make this bridge a regression for\n * exactly the codes that used to work.\n *\n * @see fromMaterialSymbol — the lookup you normally call.\n */\nexport const materialToLucide: Readonly<Record<string, IconName>> = {\n    ac_unit: \"snowflake\",\n    account_balance: \"landmark\",\n    account_balance_wallet: \"wallet\",\n    account_box: \"square-user\",\n    account_circle: \"circle-user\",\n    add: \"plus\",\n    add_circle: \"circle-plus\",\n    add_circle_outline: \"circle-plus\",\n    add_shopping_cart: \"shopping-cart\",\n    admin_panel_settings: \"shield-user\",\n    analytics: \"chart-column\",\n    apps: \"layout-grid\",\n    arrow_back: \"arrow-left\",\n    arrow_back_ios: \"chevron-left\",\n    arrow_back_ios_new: \"chevron-left\",\n    arrow_downward: \"arrow-down\",\n    arrow_drop_down: \"chevron-down\",\n    arrow_forward: \"arrow-right\",\n    arrow_forward_ios: \"chevron-right\",\n    arrow_right: \"chevron-right\",\n    arrow_right_alt: \"arrow-right\",\n    arrow_upward: \"arrow-up\",\n    article: \"newspaper\",\n    assignment: \"clipboard-list\",\n    attach_file: \"paperclip\",\n    attach_money: \"dollar-sign\",\n    autorenew: \"refresh-cw\",\n    badge: \"id-card\",\n    balance: \"scale\",\n    bar_chart: \"chart-column\",\n    battery_full: \"battery-full\",\n    bluetooth: \"bluetooth\",\n    bolt: \"zap\",\n    bookmark: \"bookmark\",\n    brush: \"brush\",\n    build: \"wrench\",\n    business: \"building-2\",\n    cake: \"cake\",\n    calculate: \"calculator\",\n    calendar_month: \"calendar\",\n    calendar_today: \"calendar\",\n    call: \"phone\",\n    campaign: \"megaphone\",\n    cancel: \"circle-x\",\n    car_repair: \"car\",\n    carpenter: \"hammer\",\n    category: \"shapes\",\n    chair: \"armchair\",\n    chat: \"message-circle\",\n    check: \"check\",\n    check_box: \"square-check\",\n    check_box_outline_blank: \"square\",\n    check_circle: \"circle-check\",\n    check_circle_outline: \"circle-check\",\n    chevron_left: \"chevron-left\",\n    chevron_right: \"chevron-right\",\n    child_care: \"baby\",\n    circle: \"circle\",\n    cleaning_services: \"spray-can\",\n    clear: \"x\",\n    close: \"x\",\n    cloud: \"cloud\",\n    code: \"code\",\n    computer: \"monitor\",\n    construction: \"construction\",\n    content_copy: \"copy\",\n    content_cut: \"scissors\",\n    credit_card: \"credit-card\",\n    dark_mode: \"moon\",\n    dashboard: \"layout-dashboard\",\n    date_range: \"calendar-range\",\n    delete: \"trash\",\n    delete_forever: \"trash\",\n    delete_outline: \"trash\",\n    delivery_dining: \"bike\",\n    dentistry: \"face-slightly-smiling\",\n    description: \"file-text\",\n    directions_car: \"car\",\n    done: \"check\",\n    done_all: \"check-check\",\n    door_front: \"door-open\",\n    download: \"download\",\n    east: \"arrow-right\",\n    edit: \"pencil\",\n    edit_note: \"pencil-line\",\n    electrical_services: \"plug-zap\",\n    email: \"mail\",\n    emoji_events: \"trophy\",\n    engineering: \"hard-hat\",\n    error: \"circle-alert\",\n    error_outline: \"circle-alert\",\n    event: \"calendar-days\",\n    expand_less: \"chevron-up\",\n    expand_more: \"chevron-down\",\n    explore: \"compass\",\n    face: \"face-slightly-smiling\",\n    fact_check: \"clipboard-check\",\n    favorite: \"heart\",\n    favorite_border: \"heart\",\n    file_download: \"download\",\n    file_upload: \"upload\",\n    filter_alt: \"funnel\",\n    filter_list: \"funnel\",\n    fingerprint: \"fingerprint-pattern\",\n    fitness_center: \"dumbbell\",\n    flight: \"plane\",\n    folder: \"folder\",\n    format_list_bulleted: \"list\",\n    format_paint: \"paint-roller\",\n    forum: \"messages-square\",\n    gavel: \"gavel\",\n    grade: \"star\",\n    grass: \"sprout\",\n    grid_view: \"layout-grid\",\n    group: \"users\",\n    groups: \"users\",\n    handyman: \"wrench\",\n    hardware: \"wrench\",\n    help: \"circle-question-mark\",\n    help_outline: \"circle-question-mark\",\n    highlight_off: \"circle-x\",\n    history: \"rotate-ccw-clock\",\n    home: \"house\",\n    hotel: \"bed-double\",\n    image: \"image\",\n    info: \"info\",\n    insights: \"chart-line\",\n    inventory: \"package\",\n    inventory_2: \"package\",\n    iron: \"shirt\",\n    key: \"key\",\n    kitchen: \"refrigerator\",\n    language: \"globe\",\n    laptop: \"laptop\",\n    light_mode: \"sun\",\n    lightbulb: \"lightbulb\",\n    link: \"link\",\n    list: \"list\",\n    list_alt: \"list\",\n    local_bar: \"wine\",\n    local_cafe: \"coffee\",\n    local_florist: \"flower\",\n    local_gas_station: \"fuel\",\n    local_laundry_service: \"washing-machine\",\n    local_offer: \"tag\",\n    local_shipping: \"truck\",\n    local_taxi: \"car-taxi-front\",\n    location_on: \"map-pin\",\n    lock: \"lock\",\n    lock_open: \"lock-open\",\n    login: \"log-in\",\n    logout: \"log-out\",\n    mail: \"mail\",\n    mail_outline: \"mail\",\n    manage_accounts: \"user-cog\",\n    map: \"map\",\n    medical_services: \"stethoscope\",\n    menu: \"menu\",\n    menu_book: \"book-open\",\n    mic: \"mic\",\n    mode_edit: \"pencil\",\n    monetization_on: \"circle-dollar-sign\",\n    more_horiz: \"ellipsis\",\n    more_vert: \"ellipsis-vertical\",\n    music_note: \"music\",\n    navigate_next: \"chevron-right\",\n    note_add: \"file-plus\",\n    notifications: \"bell\",\n    notifications_active: \"bell-ring\",\n    open_in_new: \"external-link\",\n    paid: \"circle-dollar-sign\",\n    palette: \"palette\",\n    pause: \"pause\",\n    payments: \"banknote\",\n    pedal_bike: \"bike\",\n    people: \"users\",\n    perm_identity: \"user\",\n    person: \"user\",\n    person_add: \"user-plus\",\n    person_outline: \"user\",\n    pest_control: \"bug\",\n    pets: \"paw-print\",\n    phone: \"phone\",\n    phone_iphone: \"smartphone\",\n    photo_camera: \"camera\",\n    picture_as_pdf: \"file-text\",\n    pie_chart: \"chart-pie\",\n    place: \"map-pin\",\n    play_arrow: \"play\",\n    play_circle: \"circle-play\",\n    play_circle_filled: \"circle-play\",\n    plumbing: \"shower-head\",\n    power_settings_new: \"power\",\n    print: \"printer\",\n    public: \"globe\",\n    qr_code_scanner: \"scan-line\",\n    question_answer: \"messages-square\",\n    radio_button_checked: \"circle-dot\",\n    radio_button_unchecked: \"circle\",\n    receipt: \"receipt\",\n    receipt_long: \"receipt-text\",\n    refresh: \"refresh-cw\",\n    remove: \"minus\",\n    remove_circle_outline: \"circle-minus\",\n    reorder: \"list\",\n    report_problem: \"triangle-alert\",\n    restart_alt: \"rotate-ccw\",\n    restaurant: \"utensils\",\n    roofing: \"house\",\n    room: \"map-pin\",\n    router: \"router\",\n    save: \"save\",\n    savings: \"piggy-bank\",\n    schedule: \"clock\",\n    school: \"graduation-cap\",\n    search: \"search\",\n    security: \"shield-check\",\n    send: \"send\",\n    settings: \"settings\",\n    share: \"share-2\",\n    shield: \"shield\",\n    shopping_bag: \"shopping-bag\",\n    shopping_cart: \"shopping-cart\",\n    smartphone: \"smartphone\",\n    soap: \"soap-dispenser-droplet\",\n    sort: \"arrow-down-up\",\n    spa: \"flower-2\",\n    star: \"star\",\n    star_border: \"star\",\n    star_rate: \"star\",\n    store: \"store\",\n    storefront: \"store\",\n    support_agent: \"headset\",\n    sync: \"refresh-cw\",\n    task_alt: \"circle-check\",\n    timer: \"timer\",\n    today: \"calendar\",\n    toggle_on: \"toggle-right\",\n    translate: \"languages\",\n    trending_up: \"trending-up\",\n    tune: \"sliders-horizontal\",\n    tv: \"tv\",\n    two_wheeler: \"bike\",\n    upload: \"upload\",\n    upload_file: \"upload\",\n    vaccines: \"syringe\",\n    verified: \"badge-check\",\n    verified_user: \"shield-check\",\n    videocam: \"video\",\n    view_list: \"list\",\n    visibility: \"eye\",\n    visibility_off: \"eye-off\",\n    vpn_key: \"key-round\",\n    warehouse: \"warehouse\",\n    warning: \"triangle-alert\",\n    warning_amber: \"triangle-alert\",\n    watch_later: \"clock\",\n    water_drop: \"droplet\",\n    wifi: \"wifi\",\n    work: \"briefcase\",\n    yard: \"trees\",\n};\n\n/**\n * Translate a Material Symbols code into a lucide slug, always returning one.\n *\n * Never returns `undefined`: an unknown code resolves to `fallback`, so a row\n * whose `icon_code` this table has not learned yet still renders. The input is\n * trimmed and lower-cased before lookup, because a seed written by hand is the\n * kind of source that carries stray whitespace and the odd capital.\n *\n * Nothing else in `/icons` imports this module, so an app that does not store\n * Material Symbols never pays for the table.\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code)} size={20} />\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code, \"folder\")} size={20} />\n *\n * @param code - A Material Symbols name, or `null`/`undefined` for a row that has none.\n * @param fallback - Slug to use when `code` is empty or unknown. Defaults to {@link MATERIAL_SYMBOL_FALLBACK}.\n * @returns A lucide slug `<Icon>` can render.\n */\nexport function fromMaterialSymbol(\n    code: string | null | undefined,\n    fallback: IconName = MATERIAL_SYMBOL_FALLBACK,\n): IconName {\n    if (!code) return fallback;\n    return materialToLucide[code.trim().toLowerCase()] ?? fallback;\n}\n"],"mappings":"AAqBA,IAAa,EAAqC,uBA0DrC,EAAuD,CAChE,QAAS,YACT,gBAAiB,WACjB,uBAAwB,SACxB,YAAa,cACb,eAAgB,cAChB,IAAK,OACL,WAAY,cACZ,mBAAoB,cACpB,kBAAmB,gBACnB,qBAAsB,cACtB,UAAW,eACX,KAAM,cACN,WAAY,aACZ,eAAgB,eAChB,mBAAoB,eACpB,eAAgB,aAChB,gBAAiB,eACjB,cAAe,cACf,kBAAmB,gBACnB,YAAa,gBACb,gBAAiB,cACjB,aAAc,WACd,QAAS,YACT,WAAY,iBACZ,YAAa,YACb,aAAc,cACd,UAAW,aACX,MAAO,UACP,QAAS,QACT,UAAW,eACX,aAAc,eACd,UAAW,YACX,KAAM,MACN,SAAU,WACV,MAAO,QACP,MAAO,SACP,SAAU,aACV,KAAM,OACN,UAAW,aACX,eAAgB,WAChB,eAAgB,WAChB,KAAM,QACN,SAAU,YACV,OAAQ,WACR,WAAY,MACZ,UAAW,SACX,SAAU,SACV,MAAO,WACP,KAAM,iBACN,MAAO,QACP,UAAW,eACX,wBAAyB,SACzB,aAAc,eACd,qBAAsB,eACtB,aAAc,eACd,cAAe,gBACf,WAAY,OACZ,OAAQ,SACR,kBAAmB,YACnB,MAAO,IACP,MAAO,IACP,MAAO,QACP,KAAM,OACN,SAAU,UACV,aAAc,eACd,aAAc,OACd,YAAa,WACb,YAAa,cACb,UAAW,OACX,UAAW,mBACX,WAAY,iBACZ,OAAQ,QACR,eAAgB,QAChB,eAAgB,QAChB,gBAAiB,OACjB,UAAW,wBACX,YAAa,YACb,eAAgB,MAChB,KAAM,QACN,SAAU,cACV,WAAY,YACZ,SAAU,WACV,KAAM,cACN,KAAM,SACN,UAAW,cACX,oBAAqB,WACrB,MAAO,OACP,aAAc,SACd,YAAa,WACb,MAAO,eACP,cAAe,eACf,MAAO,gBACP,YAAa,aACb,YAAa,eACb,QAAS,UACT,KAAM,wBACN,WAAY,kBACZ,SAAU,QACV,gBAAiB,QACjB,cAAe,WACf,YAAa,SACb,WAAY,SACZ,YAAa,SACb,YAAa,sBACb,eAAgB,WAChB,OAAQ,QACR,OAAQ,SACR,qBAAsB,OACtB,aAAc,eACd,MAAO,kBACP,MAAO,QACP,MAAO,OACP,MAAO,SACP,UAAW,cACX,MAAO,QACP,OAAQ,QACR,SAAU,SACV,SAAU,SACV,KAAM,uBACN,aAAc,uBACd,cAAe,WACf,QAAS,mBACT,KAAM,QACN,MAAO,aACP,MAAO,QACP,KAAM,OACN,SAAU,aACV,UAAW,UACX,YAAa,UACb,KAAM,QACN,IAAK,MACL,QAAS,eACT,SAAU,QACV,OAAQ,SACR,WAAY,MACZ,UAAW,YACX,KAAM,OACN,KAAM,OACN,SAAU,OACV,UAAW,OACX,WAAY,SACZ,cAAe,SACf,kBAAmB,OACnB,sBAAuB,kBACvB,YAAa,MACb,eAAgB,QAChB,WAAY,iBACZ,YAAa,UACb,KAAM,OACN,UAAW,YACX,MAAO,SACP,OAAQ,UACR,KAAM,OACN,aAAc,OACd,gBAAiB,WACjB,IAAK,MACL,iBAAkB,cAClB,KAAM,OACN,UAAW,YACX,IAAK,MACL,UAAW,SACX,gBAAiB,qBACjB,WAAY,WACZ,UAAW,oBACX,WAAY,QACZ,cAAe,gBACf,SAAU,YACV,cAAe,OACf,qBAAsB,YACtB,YAAa,gBACb,KAAM,qBACN,QAAS,UACT,MAAO,QACP,SAAU,WACV,WAAY,OACZ,OAAQ,QACR,cAAe,OACf,OAAQ,OACR,WAAY,YACZ,eAAgB,OAChB,aAAc,MACd,KAAM,YACN,MAAO,QACP,aAAc,aACd,aAAc,SACd,eAAgB,YAChB,UAAW,YACX,MAAO,UACP,WAAY,OACZ,YAAa,cACb,mBAAoB,cACpB,SAAU,cACV,mBAAoB,QACpB,MAAO,UACP,OAAQ,QACR,gBAAiB,YACjB,gBAAiB,kBACjB,qBAAsB,aACtB,uBAAwB,SACxB,QAAS,UACT,aAAc,eACd,QAAS,aACT,OAAQ,QACR,sBAAuB,eACvB,QAAS,OACT,eAAgB,iBAChB,YAAa,aACb,WAAY,WACZ,QAAS,QACT,KAAM,UACN,OAAQ,SACR,KAAM,OACN,QAAS,aACT,SAAU,QACV,OAAQ,iBACR,OAAQ,SACR,SAAU,eACV,KAAM,OACN,SAAU,WACV,MAAO,UACP,OAAQ,SACR,aAAc,eACd,cAAe,gBACf,WAAY,aACZ,KAAM,yBACN,KAAM,gBACN,IAAK,WACL,KAAM,OACN,YAAa,OACb,UAAW,OACX,MAAO,QACP,WAAY,QACZ,cAAe,UACf,KAAM,aACN,SAAU,eACV,MAAO,QACP,MAAO,WACP,UAAW,eACX,UAAW,YACX,YAAa,cACb,KAAM,qBACN,GAAI,KACJ,YAAa,OACb,OAAQ,SACR,YAAa,SACb,SAAU,UACV,SAAU,cACV,cAAe,eACf,SAAU,QACV,UAAW,OACX,WAAY,MACZ,eAAgB,UAChB,QAAS,YACT,UAAW,YACX,QAAS,iBACT,cAAe,iBACf,YAAa,QACb,WAAY,UACZ,KAAM,OACN,KAAM,YACN,KAAM,OACV,EAuBA,SAAgB,EACZ,EACA,EAAqB,EACb,CAER,OADK,EACE,EAAiB,EAAK,KAAK,CAAC,CAAC,YAAY,IAAM,EADpC,CAEtB"}